ksoftirqd 达到网络接口的最大限度

ksoftirqd 达到网络接口的最大限度

我们有一台 Debian 服务器,一条链接至内部 VLAN,一条链接至外部 VLAN - 两者都直接连接到同一个交换机。

在这两个链路上,我们间歇性地看到异常大量的错误接收事件,以及高延迟。

Kernel  Interface  table
Iface   MTU        Met    RX-OK       RX-ERR  RX-DRP     RX-OVR     TX-OK       TX-ERR  TX-DRP  TX-OVR  Flg
ethA    1500       0      884347583   0       49965509   49965509   1697514631  0       0       0       BMRU
ethB    1500       0      1611102819  0       77615811   77615811   819321274   0       0       0       BMRU

我们还看到,两个接口的 ksoftirqd 进程在大多数情况下都达到 90% 以上的最大值,即使表面上一切应该很安静。

44 root      20   0       0      0      0 R  98.8  0.0   2557:46 ksoftirqd/3
51 root      20   0       0      0      0 R  85.6  0.0   2722:33 ksoftirqd/5

据我了解,这意味着服务器正在最大限度地利用分配的 CPU 来处理通过此接口传入的所有数据包。但即使我们看到传入速度约为 50Mbps(而相同的服务器正在处理 >800Mbps),这些进程也可能达到最大值,并且 RX-DRP 会飙升。irqbalance 正在运行,并且 /proc/interrupts 确认这些 CPU 并没有忙于处理其他任何事情。

造成这种情况的原因有哪些?

分配多个 CPU(通过 smp_affinity)来处理这些接口的中断是否有帮助?我找不到将多个 CPU 分配给单个网络接口的单个​​示例,因此这看起来充其量是不合常规的,最坏的情况是系统崩溃。

这已经在生产中造成了一段时间的问题,所以我很乐意接受任何潜在的解决方法。

相关内容