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 在另一个。
有没有人目睹过这种奇怪的行为,有没有办法解决这种情况?
即使没有,有没有人知道一种方法,我们至少可以找出哪个进程占用了丢弃队列?
非常感谢您提前!
您有足够的接口来构建工作组交换机。由于这种配置不经常使用,因此没有经过彻底的测试,预计仅凭这一点就会出现奇怪的情况。
此外,由于您的设置非常复杂,您应该尝试通过简化来隔离问题。这就是我会做的:
/sbin/ethtool -S <interface>来查看丢弃是否与链接相关的问题dropwatch更好地了解是否可以增加任何其他缓冲区| 归档时间: |
|
| 查看次数: |
1631 次 |
| 最近记录: |