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

Yam*_*ure 5 networking linux debian iscsi software-raid

编辑:问题已解决。有问题的队列已用于流量控制数据包。为什么 igb 驱动程序会传播 FC 数据包以将它们丢弃(并计数)是另一个问题。但解决方案是,没有任何东西会以数据丢失的方式丢失。

非常感谢syneicon-dj,您的指点dropwatch是金币!

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

我们有以下情况:

系统:有问题的服务器是带有 4 个四核氙气 cpu、128GB ECC RAM 并且运行 debian linux 的戴尔 poweredge。内核是 3.2.26。
所讨论的接口是具有四个接口的特殊 iSCSI 卡,每个接口都使用 Intel 82576 千兆位以太网控制器。

背景:在我们的一台服务器上,许多 NAS(Thecus N5200 和 Thecus XXX)使用 iSCSI 连接到专用 1GB/s 接口。我们有 5 张卡,每张卡有 4 个端口。NAS 文件管理器直接连接,之间没有切换。

两周前,我们设法清除了四个 NAS 文件管理器,并使用它们使用 mdadm 构建了一个 raid6。使用 LVM,我们可以为各种项目动态创建、缩小和/或增加存储,而不是时不时地搜索所有 NAS 文件管理器以获取可用空间。

然而,我们几乎在每个接口上都出现了大量超限,并且大量数据包被丢弃。调查表明,必须增加网络堆栈的默认设置。我使用 sysctl 调整所有设置,直到不再发生超限。

不幸的是,用于 NAS 突袭的接口仍然会丢弃大量数据包,但只有 RX。

在搜索(这里,google,metager,intel,任何地方,任何地方)之后,我们发现有关 intel igb 驱动程序的信息存在一些问题,必须完成一些工作。

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

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

options igb InterruptThrottleRate=1 RSS=0 QueuePairs=0 LRO=1
Run Code Online (Sandbox Code Playgroud)

irqbalancer 很好地分配了所有接口的队列,一切都很好。

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

NAS raid 的五个接口中的三个(我们添加了一个备用 NAS,一旦 mdadm 完成当前的重构,raid 应该会增加)显示大量(数百万!)的数据包丢失。

现在对 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
--------------
Run Code Online (Sandbox Code Playgroud)

新的备用驱动器连接到 eth15。
如您所见,没有超限和错误。适配器报告,他们没有丢弃一个数据包。因此它是内核丢弃数据。但为什么?

编辑:我忘了提到 eth12 到 eth15 都位于同一张卡上。eth19 在另一个。

有没有人目睹过这种奇怪的行为,有没有办法解决这种情况?

即使没有,有没有人知道一种方法,我们至少可以找出哪个进程占用了丢弃队列?

非常感谢您提前!

the*_*bit 6

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

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

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