在3/5 raid6的第一个RX队列上丢弃了100%数据包使用intel igb的iSCSI NAS设备(已解决)

编辑 :问题已解决。 有问题的队列已被用于stream量控制包。 为什么igb驱动程序传播FC数据包,让他们丢弃(和计数)是另一个问题。 但是解决scheme是,没有什么东西丢掉了数据丢失的方式。

非常感谢你,syneticon-dj,你的dropwatch的指针是黄金!

=== 原始问题的进一步参考 ===

我们有以下情况:

系统:有问题的服务器是一个带有4个四核氙气CPU,128GB ECC内存的dell供电,正在运行debian linux。 内核是3.2.26。
有问题的接口是特殊的iSCSI卡,每个接口使用Intel 82576千兆位以太网控制器。

背景:在我们的一台服务器上,很多NAS(Thecus N5200与Thecus XXX)都是使用iSCSI连接至专用的1GB / s介面。 我们有5张卡,每张卡有4个端口。 NAS文件pipe理器直接连接,两者之间没有切换。

两个星期前,我们设法清除了四个NAS文件pipe理器,并使用它们来构build一个使用mdadm的raid6。 通过使用LVM,我们可以dynamic创build,缩小和/或扩展我们各种项目的存储空间,而无需每隔一段时间search一次所有NAS文件pipe理器的空闲空间。

但是,几乎每一个接口都有很多超限,很多数据包都被丢弃了。 调查显示,networking堆栈的默认设置必须增加。 我用sysctl来调整所有的设置,直到没有超出发生。

不幸的是,用于NAS raid的接口仍然会丢失很多数据包,但只有RX。

经过search(这里,谷歌,metager,英特尔,任何地方,任何地方),我们发现有关intel igb驱动程序的信息有一些问题,一些工作已经完成。

于是我下载了最新版本(igb-4.2.16),用LRO编译模块和单独的队列支持,并安装了新的模块。

所有使用此驱动程序的20(!)接口现在都有8个RxTx队列(未配对)并启用了LRO。 具体的选项是:

 options igb InterruptThrottleRate=1 RSS=0 QueuePairs=0 LRO=1 

irqbalancer很好地分配所有接口的队列,一切都非常出色。

那我为什么要写作呢? 我们有以下奇怪的情况,根本无法解释:

NAS raid的五个接口中有三个(我们已经增加了一个备用NAS,并且一旦mdadm完成了它的当前整形,这个raid应该会增长)显示出大量的数据包丢失。

对ethtool的调查现在显示,由于新的多队列驱动程序,每个接口大量使用一个队列,这将是我们猜测的重塑。

但是,三个使用另一个队列与数百万收件包,都被丢弃。 至less表明利用“监视”的调查,这些队列上的包号码与丢弃的包裹相关联。

我们将NAS上的MTU和接口从9000改为1500,但丢包率增加,mdadm性能下降。 因此它看起来不像MTU问题。 而且networking堆栈的内存数量非常大,这也不成问题。 积压足够大(实际上是巨大的),我们完全在海上。

这里有个例子输出:

 ~ # 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在另一个。

有没有人见过这种奇怪的行为,有没有解决问题的办法?

即使不是,有没有人知道一个方法,我们至less可以找出哪个进程占用掉队?

提前非常感谢!

您有足够的接口来构build工作组开关。 由于这种configuration没有经常使用,因此没有经过彻底的testing,所以希望单独来自这些configuration。

此外,由于您的设置相当复杂,因此您应该尝试通过简化来隔离问题。 这是我会做的:

  1. 排除简单情况,例如通过发出/sbin/ethtool -S <interface>来检查链接统计信息,以查看丢弃是否是链接相关的问题
  2. 由于NIC正在使用中断合并,请增加环形缓冲区 ,查看是否有帮助
  3. 如果可以增加任何其他的缓冲区,使用dropwatch来获得更好的想法
  4. 再次禁用multiqueuenetworking – 有20个活动接口几乎不会有一个情况,每个接口多个队列将获得任何性能,并从您的描述可能是一个排队相关的问题
  5. 减less接口的数量,看看问题是否存在
  6. 如果没有其他帮助,请将问题发送到Kernel netdev邮件列表