哪些网络负载需要 NIC 轮询与中断?

Wim*_*off 18 nic linux-networking broadcom

有没有人有一些数据或基本计算可以回答何时需要帧合并 (NAPI) 以及何时每帧一个中断就足够了?

我的硬件:IBM BladeServer HS22、Broadcom 5709 千兆网卡硬件 (MSI-X),带有双 Xeon E5530 四核处理器。主要用途是 Squid 代理服务器。交换机是不错的 Cisco 6500 系列。

我们的基本问题是,在高峰时段(100 Mbps 流量,只有 10,000 pps),延迟和数据包丢失会增加。我已经做了很多调整和内核升级到 2.6.38,它改善了丢包,但延迟仍然很差。Ping 是零星的;在本地 Gbps LAN 上甚至跳到 200 毫秒。即使 CPU/内存负载很好,Squid 的平均响应也会从 30 毫秒跳到 500 毫秒以上。

在高峰期间,中断攀升至大约 15,000 次/秒。Ksoftirqd 使用的 CPU 不多;我已经安装了 irqbalance 来平衡所有内核的 IRQ(eth0 和 eth1 各 8 个),但这并没有多大帮助。

Intel NIC 似乎从来没有这些问题,但事实上刀片系统和固定配置的硬件,我们有点被 Broadcoms 困住了。

一切都指向 NIC 是罪魁祸首。我现在最好的想法是尝试减少中断,同时保持低延迟和高吞吐量。

不幸的是,bnx2 不支持自适应 rx 或 tx。

NAPI vs Adaptive Interrupts线程答案提供了对中断调节的很好的概述,但没有关于如何为给定的解决方法计算最佳 ethtool 合并设置的具体信息。有没有比试错法更好的方法?

上面提到的工作负载和硬件配置是否还需要 NAPI?或者它应该能够在每个数据包的单个中断上生存?

Dic*_*Bob 6

很好的问题,让我做了一些阅读来尝试弄清楚。希望我能说我有答案……但也许有一些提示。

我至少可以回答你的问题,“它是否应该能够在每个数据包的单个中断上存活”。我认为答案是肯定的,基于我可以访问的非常繁忙的防火墙:

萨尔输出:

03:04:53 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
03:04:54 PM        lo     93.00     93.00      6.12      6.12      0.00      0.00      0.00
03:04:54 PM      eth0 115263.00 134750.00  13280.63  41633.46      0.00      0.00      5.00
03:04:54 PM      eth8  70329.00  55480.00  20132.62   6314.51      0.00      0.00      0.00
03:04:54 PM      eth9  53907.00  66669.00   5820.42  21123.55      0.00      0.00      0.00
03:04:54 PM     eth10      0.00      0.00      0.00      0.00      0.00      0.00      0.00
03:04:54 PM     eth11      0.00      0.00      0.00      0.00      0.00      0.00      0.00
03:04:54 PM      eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00
03:04:54 PM      eth2 146520.00 111904.00  45228.32  12251.48      0.00      0.00     10.00
03:04:54 PM      eth3    252.00  23446.00     21.34   4667.20      0.00      0.00      0.00
03:04:54 PM      eth4      8.00     10.00      0.68      0.76      0.00      0.00      0.00
03:04:54 PM      eth5      0.00      0.00      0.00      0.00      0.00      0.00      0.00
03:04:54 PM      eth6   3929.00   2088.00   1368.01    183.79      0.00      0.00      1.00
03:04:54 PM      eth7     13.00     17.00      1.42      1.19      0.00      0.00      0.00
03:04:54 PM     bond0 169170.00 201419.00  19101.04  62757.00      0.00      0.00      5.00
03:04:54 PM     bond1 216849.00 167384.00  65360.94  18565.99      0.00      0.00     10.00
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,一些非常高的每秒数据包计数,并且在这台机器上没有进行特殊的 ethtool 调整。哦...不过,英特尔芯片组。:\

唯一要做的就是在每个接口的基础上使用 /proc/irq/XXX/smp_affinity 进行一些手动 irq 平衡。我不确定他们为什么选择那样做而不是使用 irqbalance,但它似乎有效。

我还考虑了回答您的问题所需的数学,但我认为变量太多了。所以……总而言之,在我看来,答案是否定的,我认为您无法预测这里的结果,但是有了足够的数据捕获,您应该能够将其调整到更好的水平。

说了这么多,我的直觉是你在这里以某种方式受硬件限制......就像在某种固件或互操作错误中一样。