编辑:问题已解决。有问题的队列已用于流量控制数据包。为什么 igb 驱动程序会传播 FC 数据包并将其丢弃(并进行计数)是另一个问题。但解决方案是,不会以数据丢失的方式丢弃任何数据包。
非常感谢,syneticon-dj,您的指针dropwatch
非常宝贵!
===原始问题以供进一步参考===
我们有以下情况:
系统:有问题的服务器是戴尔 poweredge,配备 4 个四核 xenon 处理器、128GB ECC RAM,运行的是 debian linux。内核是 3.2.26。
有问题的接口是特殊的 iSCSI 卡,每个卡有四个接口,使用 Intel 82576 千兆以太网控制器。
背景:在我们的一台服务器上,很多 NAS(Thecus N5200 和 Thecus XXX)使用专用 1GB/s 接口上的 iSCSI 进行连接。我们有 5 张卡,每张卡有 4 个端口。NAS 文件管理器直接连接,中间没有交换机。
两周前,我们成功清理了四个 NAS 文件服务器,并使用 mdadm 构建了一个 raid6。使用 LVM,我们可以动态地为各种项目创建、缩小和/或增加存储空间,而不必时不时地搜索所有 NAS 文件服务器以查找可用空间。
然而,几乎每个接口都出现了大量超限,很多数据包被丢弃。调查显示,必须增加网络堆栈的默认设置。我使用 sysctl 调整所有设置,直到不再发生超限。
不幸的是,用于 NAS 突袭的接口仍然会丢弃大量数据包,但仅限于 RX。
经过搜索(这里,谷歌,metager,英特尔,任何地方,到处)我们发现有关英特尔 igb 驱动程序存在一些问题并且需要进行一些工作。
因此我下载了最新版本(igb-4.2.16),使用 LRO 和单独队列支持编译了模块,并安装了新模块。
使用此驱动程序的所有 20 个 (!) 接口现在都有 8 个 RxTx 队列(不成对)并启用了 LRO。具体选项行是:
options igb InterruptThrottleRate=1 RSS=0 QueuePairs=0 LRO=1
irqbalancer 很好地分配了所有接口的队列,并且一切运行良好。
那么我为什么要写这篇文章呢?我们遇到了以下奇怪的情况,根本无法解释:
NAS 阵列的五个接口中有三个(我们已经添加了一个备用 NAS,并且一旦 mdadm 完成其当前重塑,阵列就会增大)显示大量(数百万!)数据包丢失。
现在使用 ethtool 进行的调查表明,得益于新的支持多队列的驱动程序,每个接口都大量使用一个队列,这就是我们猜测的重塑。
但三台服务器使用另一个队列,该队列中有数百万个传入数据包,这些数据包全部被丢弃。至少利用“监视”进行的调查显示,这些队列上的数据包数量与丢弃的数据包相关。
我们将 NAS 和接口上的 MTU 从 9000 改为 1500,但丢包率上升,mdadm 性能下降。因此看起来不像是 MTU 问题。此外,网络堆栈拥有大量内存可供使用,这也不成问题。积压量足够大(实际上非常大),我们完全不知所措。
这里有示例输出:
~ # for nr in 2 3 4 5 9 ; do eth="eth1${nr}" ; echo " ==== $eth ==== " ; ethtool -S $eth | \
> grep rx_queue_._packet | grep -v " 0" ; ifconfig $eth | grep RX | grep dropped ; \
> echo "--------------" ; done
==== eth12 ====
rx_queue_0_packets: 114398096
rx_queue_2_packets: 189529879
RX packets:303928333 errors:0 dropped:114398375 overruns:0 frame:0
--------------
==== eth13 ====
rx_queue_0_packets: 103341085
rx_queue_1_packets: 163657597
rx_queue_5_packets: 52
RX packets:266998983 errors:0 dropped:103341256 overruns:0 frame:0
--------------
==== eth14 ====
rx_queue_0_packets: 106369905
rx_queue_4_packets: 164375748
RX packets:270745915 errors:0 dropped:106369904 overruns:0 frame:0
--------------
==== eth15 ====
rx_queue_0_packets: 161710572
rx_queue_1_packets: 10
rx_queue_2_packets: 10
rx_queue_3_packets: 23
rx_queue_4_packets: 10
rx_queue_5_packets: 9
rx_queue_6_packets: 81
rx_queue_7_packets: 15
RX packets:161710730 errors:0 dropped:4504 overruns:0 frame:0
--------------
==== eth19 ====
rx_queue_0_packets: 1
rx_queue_4_packets: 3687
rx_queue_7_packets: 32
RX packets:3720 errors:0 dropped:0 overruns:0 frame:0
--------------
新的备用驱动器连接到 eth15。
如您所见,没有超限,也没有错误。适配器报告说,它们没有丢弃任何数据包。因此,内核会丢弃数据。但为什么呢?
编辑:我忘了提到 eth12 到 eth15 都位于同一张卡上。eth19 位于另一张卡上。
有人见过这种奇怪的行为吗?有没有什么解决办法可以解决这种情况?
即使没有,有人知道我们可以用什么方法吗?至少找出哪个进程占用了丢弃队列?
提前非常感谢您!
答案1
您有足够的接口来构建工作组交换机。由于此配置不常使用,因此没有经过彻底测试,因此仅凭这一点就可能会出现异常。
此外,由于您的设置非常复杂,您应该尝试通过简化来隔离问题。 我会这样做:
- 排除简单情况,例如通过检查链接统计信息
/sbin/ethtool -S <interface>
来查看掉线是否是与链接相关的问题 - 由于网卡正在使用中断合并,增加环形缓冲区看看是否有帮助
- 使用
dropwatch
以更好地了解是否可以增加其他缓冲区 - 再次禁用多队列网络 - 有 20 个活动接口,几乎不会出现每个接口多个队列可以获得任何性能的情况,并且从您的描述来看,这可能是与队列相关的问题
- 减少接口数量,看看问题是否仍然存在
- 如果没有其他帮助,请将问题发布到内核 netdev 邮件列表