有没有人有一些数据或基本的计算,可以回答帧合并(NAPI)是否需要时,并且每帧一个中断足够?
我的硬件:IBM BladeServer HS22,Broadcom 5709千兆网卡硬件(MSI-X),带有双至强E5530四核处理器。 主要目的是Squid代理服务器。 交换机是一个不错的思科6500系列。
我们的基本问题是,在高峰时段(100 Mbps的stream量,只有10,000 pps),延迟和丢包增加。 我已经做了很多调整和内核升级到2.6.38,它已经改善了数据包丢失,但延迟仍然很差。 坪是零星的; 在本地Gbps局域网上跳到200ms。 即使CPU /内存负载很好,Squid的平均响应也会从30ms跳到500 + ms。
在高峰期间,中断会上升到大约15,000 /秒。 Ksoftirqd没有使用太多的CPU; 我已经安装了irqbalance来平衡IRQ(eth0和eth1各8个)在所有内核之间的平衡,但这并没有多大帮助。
英特尔的网卡看起来从来没有遇到过这样的问题,但是要做到刀片系统和固定configuration硬件的事实,我们对于Broadcom来说是坚持不懈的。
一切都指向NIC是主要的罪魁祸首。 我现在最好的想法是尝试减less中断,同时保持低延迟和吞吐量高。
bnx2不幸的是不支持adaptive-rx或者tx。
NAPI与自适应中断线程应答提供了一个很好的中断调整的概况,但是没有关于如何计算给定解决方法的最佳ethtool coalesce设置的具体信息。 有没有更好的方法,然后只是试错?
上述工作负载和硬件configuration是否需要NAPI? 或者它应该能够在每个数据包的单个中断上生存?
我有一个很好的问题,那就是阅读一下,试着找出答案。 希望我能说我有一个答案…但也许一些提示。
我至less可以回答你的问题,“它应该能够在每个数据包的单个中断上生存”。 我认为答案是肯定的,基于我可以访问的非常繁忙的防火墙:
Sar输出:
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
正如你所看到的,一些非常高的数据包每秒钟计数,并没有特别ethtool调整在这台机器上完成。 哦,英特尔芯片组,但是。 :\
唯一完成的工作是在/ proc / irq / XXX / smp_affinity之间进行手动irq平衡,基于每个接口。 我不确定他们为什么select这种方式,而不是用irqbalance,但它似乎工作。
我也想过回答你的问题所需的math,但我认为有太多的变数。 所以…总结一下,在我看来,答案是否定的,我不认为你可以在这里预测结果,但是有了足够的数据捕获,你应该能够把它调整到一个更好的水平。
说了这么多,我的直觉是,你在这里硬件绑定…就像某种固件或互操作性的错误。
当然,如果将CPU,芯片组和总线function与这样低的stream量进行比较,则没有任何理由需要任何forms的中断pipe理。 我们有多台10Gbps网卡的RHEL 5.3 64位机器,它们的中断也不算太差,这是100倍。
显然你有一个固定的configuration(我使用惠普的刀片非常相似),所以交换出来的英特尔现在是一个简单的select,但我要说的是,我已经开始在这个论坛和其他地方发现一些类似的问题与那个特别的Broadcom网卡。 曾经的SE网站本身也遇到过这种不一致的问题,换了Intel的网卡绝对有帮助。
我推荐的是select一个刀片服务器,并在这台机器上添加一个基于英特尔的适配器,显然你必须添加一个互连或IBM的任何其他设备来获取信号,但尝试使用相同的软件设置NIC(如果可以的话,可能会禁用Broadcom)。 testing一下,看看你是怎么做的,我知道我所描述的需要一些额外的硬件,但我想你的IBM代表会很乐意把它们借给你。 这是唯一可以肯定的方法。 请让我们知道您发现了什么,如果这些网卡存在问题,我真的很感兴趣,即使这是一个奇怪的边缘情况。 另外我会在下周与Intel和Broadcom会面,讨论一些完全不相关的事情,但是我一定会和他们讨论一下,如果我发现任何有趣的事情,请告诉我们。
关于中断的问题是它们如何影响整个系统的性能。 中断可以抢占用户和内核的土地处理,虽然你可能没有看到太多的CPU使用,但有很多上下文切换发生,这是一个很大的性能影响。 您可以使用vmstat
并检查system
列,每秒中断和上下文切换的cs
头(中断包括时钟,所以您必须加重),这也值得一试。
简短的直接回答:
如果你启用轮询,你将减less上下文切换(通常是由于中断),不pipe他们现在是什么(15kips在你的情况下)到一个预定的数字(通常是1k到2k)。
如果您目前的stream量高于预定数量,则通过启用轮询,您应该有更好的响应时间。 反过来也是如此。 除非上下文切换影响性能,否则我不会说这是“必要的”。
跟进:随着NAT和conntrack模块卸载加上最小化的iptables规则集,我们得到了了不起的performance。 IPVS负载平衡器已经完成了超过900 Mbps / 150 kpps。 这同时仍然使用相同的Broadcom bnx2芯片组。
所以得出这样的结论:中断处理似乎很好,Debian 2.6.38 / 3.0.x内核的默认设置似乎是可以接受的。
当然,我宁愿使用英特尔网卡,以便我们可以使用标准的Debian软件包。 打击非免费的bnx2固件已经浪费了很多时间。