ProxmoxVEでインテル1G LANを積んだマザーボードを使っているのですが、通信量が増えるとLANが停止する現象が発生したので対策を行いました。
原因
ハードウェア環境は以下の通り
- マザーボード:Asus Prime H510M-A
- CPU: intel core i5-10700(8C/16T)
- オンボードNIC:i219(1Gbe)
proxmoxコンソールに入れないので難儀な現象ですが、試行錯誤の末、以下の条件で復旧することが分かりました。
- 自然復旧
- LANコネクタの抜き差し
- Proxmoxリブート
続いて、Proxmoxシステムログを確認すると、eno1のドライバーe1000eがHangしていることが判りました。
Sep 24 09:53:59 falcon-sv1 kernel: e1000e 0000:00:1f.6 eno1: Detected Hardware Unit Hang: TDH <67> TDT <85> next_to_use <85> next_to_clean <66> buffer_info[next_to_clean]: time_stamp <1430623d0> next_to_watch <67> jiffies <143062b00> next_to_watch.status <0> MAC Status <40080083> PHY Status <796d> PHY 1000BASE-T Status <3800> PHY Extended Status <3000> PCI Status <10> ~~Hangの繰り返し~~
ググってみるとLANコントローラのオフロード機能がONの場合に発生する既知の問題とのことでした。
オフロード機能は、CPU負荷を下げる機能の一部ですが、LANチップが設計されたころからCPUがかなり高速化しているため、インタフェースタイミングが仕様を逸脱することで、LAN側コントローラ側の動作不良として顕在化したように思います。
対策
proxmoxコミュニティでは、オフロード機能をOFFにすることで対策できるとのことで、早速行いました。
(手順1)LANインタフェース名を調べる
/etc/network/interfaceの内容を確認し、不具合を起こしているLANインタフェース名を特定します。
root@falcon-sv1:~# cat /etc/network/interfaces
~冒頭省略~
auto lo
iface lo inet loopback
iface eno1 inet manual
iface enp14s0 inet manual
iface enp15s0 inet manual
auto vmbr0
iface vmbr0 inet static
address 192.168.10.70/24
gateway 192.168.10.254
bridge-ports eno1
bridge-stp off
bridge-fd 0
auto vmbr1
iface vmbr1 inet static
address 192.168.200.254/24
bridge-ports enp14s0
bridge-stp off
bridge-fd 0
~以下省略~
「eno1」が対象インタフェースであることが分かります。
(手順2)ドライバーの種類を確認する
ethtoolコマンドで適用されているドライバーを確認します。
driver:e1000eであれば動作不良の対象LANになります。
# ethtool -i eno1 driver: e1000e version: 6.8.12-13-pve firmware-version: 0.4-4 expansion-rom-version: bus-info: 0000:00:1f.6 supports-statistics: yes supports-test: yes supports-eeprom-access: yes supports-register-dump: yes supports-priv-flags: yes
(手順3)ドライバーのオフロード機能をOFFにする
ethtoolコマンドで以下のオフロード機能をすべてOFFにします。
- tcp-segmentation-offload(tso)
- generic-segmentation-offload(gso)
- generic-receive-offload(gro)
- rx-checksumming(rx)
- tx-checksumming(tx)
- rx-vlan-offload(rxvlan)
- tx-vlan-offload(txvlan)
- scatter-gather(sg)
OFFにするのはtsoのみで良いそうですが、他のoffload機能も対象にしました。
# ethtool -K eno1 gro off tso off gso off rx off tx off rxvlan off txvlan off sg off
設定が反映出来ていることを確認します。
# ethtool -k eno1
Features for eno1:
rx-checksumming: off
tx-checksumming: off
tx-checksum-ipv4: off [fixed]
tx-checksum-ip-generic: off
tx-checksum-ipv6: off [fixed]
tx-checksum-fcoe-crc: off [fixed]
tx-checksum-sctp: off [fixed]
scatter-gather: off
tx-scatter-gather: off
tx-scatter-gather-fraglist: off [fixed]
tcp-segmentation-offload: off
tx-tcp-segmentation: off
tx-tcp-ecn-segmentation: off [fixed]
tx-tcp-mangleid-segmentation: off
tx-tcp6-segmentation: off
generic-segmentation-offload: off
generic-receive-offload: off
large-receive-offload: off [fixed]
rx-vlan-offload: off
tx-vlan-offload: off
~~以下省略~~
以上で対策設定は終わりです。
設定後、しばらく運用してみてログにHangしないことを確認後、恒久対策を行います。
恒久対策
ethtoolコマンドで設定しただけでは、再起動時にオフロード機能がONに戻ります。
/etc/networks/interfaceを編集することで、恒久対策できます。
auto lo iface lo inet loopback iface eno1 inet manual post-up /sbin/ethtool -K eno1 gro off tso off gso off rx off tx off rxvlan off txvlan off sg off
この現象は原因がインテルのLANドライバーにあるため、どのLinuxベースのシステムでも顕在化するようです。

