【Proxmox】LANドライバー e1000e Detected Hardware Unit Hangの対策

Proxmox

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ベースのシステムでも顕在化するようです。

タイトルとURLをコピーしました