使用英特尔 igb 的 3/5 raid6 iSCSI NAS 设备上的第一个 RX 队列中 100% 的数据包被丢弃(已解决)

使用英特尔 igb 的 3/5 raid6 iSCSI NAS 设备上的第一个 RX 队列中 100% 的数据包被丢弃(已解决)

编辑:问题已解决。有问题的队列已用于流量控制数据包。为什么 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

您有足够的接口来构建工作组交换机。由于此配置不常使用,因此没有经过彻底测试,因此仅凭这一点就可能会出现异常。

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

  1. 排除简单情况,例如通过检查链接统计信息/sbin/ethtool -S <interface>来查看掉线是否是与链接相关的问题
  2. 由于网卡正在使用中断合并,增加环形缓冲区看看是否有帮助
  3. 使用dropwatch以更好地了解是否可以增加其他缓冲区
  4. 再次禁用多队列网络 - 有 20 个活动接口,几乎不会出现每个接口多个队列可以获得任何性能的情况,并且从您的描述来看,这可能是与队列相关的问题
  5. 减少接口数量,看看问题是否仍然存在
  6. 如果没有其他帮助,请将问题发布到内核 netdev 邮件列表

相关内容