我有一台戴尔 1U 服务器,配备 Intel(R) Xeon(R) CPU L5420 @ 2.50GHz,8 核,在 x86_64 上运行 Ubuntu Server Kernel Version 3.13.0-32-generic。它有双 1000baseT 网卡。我已将其设置为将数据包从 eth0 转发到 eth1。
我注意到在我的 kern.log 文件中,它一直挂起然后停止。这种情况经常发生。这种情况每隔几秒钟就会发生一次,然后可能几分钟后就会恢复正常,然后又恢复到每隔几秒钟一次。
以下是日志文件转储:
[118943.768245] e1000e 0000:00:19.0 eth0: Detected Hardware Unit Hang:
[118943.768245] TDH <45>
[118943.768245] TDT <50>
[118943.768245] next_to_use <50>
[118943.768245] next_to_clean <43>
[118943.768245] buffer_info[next_to_clean]:
[118943.768245] time_stamp <101c48d04>
[118943.768245] next_to_watch <45>
[118943.768245] jiffies <101c4970f>
[118943.768245] next_to_watch.status <0>
[118943.768245] MAC Status <80283>
[118943.768245] PHY Status <792d>
[118943.768245] PHY 1000BASE-T Status <7800>
[118943.768245] PHY Extended Status <3000>
[118943.768245] PCI Status <10>
[118944.780015] e1000e 0000:00:19.0 eth0: Reset adapter unexpectedly
以下是来自 ethtool 的信息:
设置:
Settings for eth0:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised pause frame use: No
Advertised auto-negotiation: Yes
Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 1
Transceiver: internal
Auto-negotiation: on
MDI-X: off (auto)
Supports Wake-on: pumbg
Wake-on: g
Current message level: 0x00000007 (7)
drv probe link
Link detected: yes
驾驶员信息:
ethtool -i eth0
driver: e1000e
version: 2.3.2-k
firmware-version: 1.4-0
bus-info: 0000:00:19.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: no
这可能是什么原因造成的?这只是软件中的错误还是实际的硬件问题?我见过许多其他人遇到类似问题但没有真正的解决方案,这也让我相信这是一个软件问题?
也许有人可以为我解释一下这个问题?
答案1
好的,昨晚发布了这个问题之后,我继续做了一些研究,我遇到的唯一真正的解决方案似乎已经解决了这个问题。
使用 ethtool 禁用 TSO、GSO 和 GRO:
ethtool -K eth0 gso off gro off tso off
根据此处的一篇文章:http://ehc.ac/p/e1000/bugs/378/
据我所知,这将会或可能会导致性能下降。
我还注意到另一个解决方案是禁用活动状态电源管理
pcie_aspm=off
根据 serverfault 上的这篇文章:Linux e1000e(英特尔网络驱动程序)问题多多,我该从哪里开始?
我还没有尝试过这个解决方案。我会尝试一下,看看是否有效果,然后发回我的发现。
编辑:
好的,我尝试关闭活动状态电源管理,pcie_aspm=off,但这没有任何效果。我继续注意到日志文件中的错误。
对于某些人来说这可能仍然有效,因为当启用电源管理时,某些英特尔网卡会因不同的内核而出现睡眠问题。
答案2
在 BIOS 中禁用增强型 C1 (C1E) 就可以解决这个问题。
不确定 C1E 的较低功率状态是否会干扰驱动程序,或者当处理器处于此状态时驱动程序中是否出现问题。
无论如何,问题解决了。
答案3
禁用仅有的TCP 分段卸载 (TSO) 对我来说很有帮助。
ethtool -K eth0 tso off
笔记:确实如此不是似乎还需要禁用通用接收卸载 (GRO) 和通用分段卸载 (GSO),因为各种来源都建议这样做。据我所知,这些功能完全由软件实现,应该是安全的。不要牺牲不必要的性能。
答案4
我刚刚偶然发现了英特尔的这份自述文件:
https://downloadmirror.intel.com/15817/eng/readme.txt
意思是
82573 (V/L/E) TX 单元挂起消息
在使用 e1000edriver 正常运行期间,带有 82573 芯片组的多个适配器会显示“TX unit hang”消息。启用和禁用 TSO 时都会出现此问题,这是由 EEPROM 中启用的电源管理功能引起的。早期向供应商发布的芯片组具有启用此功能的 EEPROM 位。发现此问题后,发布了较新的适配器,并在 EEPROM 中禁用了此功能。
如果您在适配器中遇到问题,并且芯片组是基于 82573 的,则可以使用 ethtool 验证适配器是否需要修复:
ethtool -e eth0
偏移值
0x0000 00 12 34 56 fe dc 30 0d 46 f7 f4 00 ff ff ff ff
0x0010 ff ff ff ff 6b 02 8c 10 d9 15 8c 10 86 80 de 83
偏移量 0x001e (de) 处的值的位 0 未设置。这会启用有问题的省电功能。在这种情况下,EEPROM 需要在偏移量 0x001e 处读取“df”。
不幸的是,我的有问题的适配器是两个不同 NUC 中的 82579V 和 I219-V,因此不清楚相同的修复是否适用于我。