Linux中如何解决网卡中断与CPU绑定问题

80次阅读
没有评论

共计 1523 个字符,预计需要花费 4 分钟才能阅读完成。

这篇文章主要为大家展示了“Linux 中如何解决网卡中断与 CPU 绑定问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让丸趣 TV 小编带领大家一起研究并学习一下“Linux 中如何解决网卡中断与 CPU 绑定问题”这篇文章吧。

在 Linux 的网络调优方面,如果你发现网络流量上不去,那么有一个方面需要去查一下:网卡处理网络请求的中断是否被绑定到单个 CPU 或跟处理其它中断的是同一个 CPU。

网卡与操作系统的交互方式

网卡与操作系统的交互一般有两种方式:

1. 中断 IRQ

网卡在收到了网络信号之后,主动发送中断到 CPU,而 CPU 将会立即停下手边的活以便对这个中断信号进行分析;

2. DMA(Direct Memory Access)

也就是允许硬件在无 CPU 干预的情况下将数据缓存在指定的内存空间内,在 CPU 合适的时候才处理;

  现在的对称多核处理器 (SMP) 上,一块网卡的 IRQ 还是只有一个 CPU 来响应,其它 CPU 无法参与,如果这个 CPU 还要忙其它的中断(其它网卡或者其它使用中断的外设(比如磁盘)),那么就会形成瓶颈。

检查环境

首先,让网络跑满。如:对于 MySQL/MongoDB 服务,可以通过客户端发起密集的读操作   或执行一个大文件传送任务。查明是不是某个 CPU 在一直忙着处理 IRQ?

从 mpstat -P ALL 1 输出里面的 %irq 一列即说明了哪个 CPU 忙于处理中断的时间占比;

上面的例子中,第四个 CPU 有 25.63% 时间在忙于处理中断,后面 intr/s   也说明了 CPU 每秒处理的中断数。从上面的数据可以看出,其它几个 CPU 都不怎么处理中断。

那么,这些忙于处理中断的 CPU 都在处理哪些中断?

这里记录的是自启动以来,每个 CPU 处理各类中断的数量。第一列是中断号,最后一列是对应的设备名。从上面可以看到:eth0 所出发的中断全部都是  CPU0 在处理,而 CPU0 所处理的中断请求中,主要是 eth0 和 LOC 中断。有时我们会看到几个 CPU 对同一个中断类型所处理的的请求数相差无几(比如上面的 LOC),这并不一定是说多个 CPU 会轮流处理同一个中断,而是因为这里记录的是“自启动以来”的统计,中间可能因为 irq  balancer 重新分配过处理中断的 CPU。

解决思路

现在的多数 Linux 系统中都有 IRQ Balance 这个服务(服务程序一般是  /usr/sbin/irqbalance),它可以自动调节分配各个中断与 CPU 的绑定关系,以避免所有中断的处理都集中在少数几个 CPU 上。在某些情况下,这个 IRQ  Balance 反而会导致问题,会出现 irqbalance 这个进程反而自身占用了较高的 CPU(当然也就影响了业务系统的性能)。

首先要看该网卡的中断当前是否已经限定到某些 CPU 了? 具体是哪些 CPU?

根据上面 /proc/interrupts 的内容我们可以看到 eth0 的中断号是 74,然后我们来看看该中断号的 CPU 绑定情况或者说叫亲和性  affinity。

$ sudo cat /proc/irq/74/smp_affinity ffffff

这个输出是一个 16 进制的数值,0xffffff =   0b111111111111111111111111,这就意味着这里有 24 个 CPU,所有位都为 1 表示所有 CPU 都可以被该中断干扰。

修改配置的方法:(设置为 2 表示将该中断绑定到 CPU1 上,0x2 = 0b10,而第一个 CPU 为 CPU0)

echo 2   /proc/irq/74/smp_affinity

以上是“Linux 中如何解决网卡中断与 CPU 绑定问题”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计1523字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)