RX アクセレーション (GRO、LRO、TPA など) を持つ NIC が、パフォーマンスが悪い TCP の影響を受ける場合がある

Solution Verified - Updated -

Environment

  • Red Hat Enterprise Linux バージョン:
    • RHEL 5.7 (2.6.18-274.el5 より前のカーネル) の Broadcom bnx2x モジュール
    • RHEL 5.9 (2.6.18-348.el5 より前のカーネル)の QLogic NetXen netxen_nic モジュール
    • RHEL 6.4 (2.6.32-358.el6 より前のカーネル)の Intel 10Gbps ixgbe モジュール
    • RHEL5.6(2.6.18-238.el5 から最新のカーネル)の Intel 10Gbps ixgbe モジュール
  • ネットワークインターフェイスで有効な受信オフロード

Issue

受信 (RX) アクセレーション (GRO、LRO、TPA など) を持つネットワークインターフェイスカード (NIC) がパフォーマンス問題の影響を受ける場合があります。たとえば以下のような影響を受けます。

  • 10Gbps リンク以上の NFS 転送が、100MiB/sec (つまり 1Gbps) でしか転送されません。
  • TCP 接続が、ワイヤースピードになりません。
  • tcpdump では、TCP Window が 720 バイトほどにしかならず、元に戻りません。

Resolution

解決法

以下のカーネルバージョンにアップグレードしてください。

  • Broadcom bnx2x: RHEL 5.7 kernel-2.6.18-274.el5
  • QLogic NetXen netxen_nic: RHEL 5.9 kernel-2.6.18-348.el5
  • Intel 10Gbps ixgbe: RHEL 6.4 kernel-2.6.32-358.el6
  • RHEL5 のIntel 10Gbps ixgbe: 修正はありません。

回避策

  • GRO、LRO、TPA などの受信 (RX) アクセレーションを無効にします。

  • その他の NIC は、以下のようなコマンドを実行すれば ethtool ツールから処理できます。

# ethtool -K eth0 gro off
# ethtool -K eth0 lro off
  • ethtool 設定を持続させるには /sbin/ifup-local スクリプトを作成してください。

  • bnx2x の場合、オフロードは /etc/modprobe.conf のモジュールオプションによって制御できます。

options bnx2x disable_tpa=1

このようなモジュールオプションを適用するには、モジュールの再リードやシステムの再起動が必要になります。

Root Cause

  • パケットが GRO、LRO、TPA の場合、受信 MSS の目算が RAW パケットのサイズから誤って計算されます。これにより TCP スタックが混乱しました。

  • この問題は、Red Hat bugzilla (629609、651546、653357、656360、786403、819647、819101) (非公開) で対応しました。

  • 上述のバグは以下のエラータによって解決しました。

netxen_nic の場合:

Due to incorrect information provided by firmware, the netxen_nic driver did
not calculate the correct Generic Segmentation Offload (GSO) length of
packets that were received using the Large Receive Offload (LRO)
optimization.This caused network traffic flow to be extensively delayed for
NICs using LRO on netxen_nic, which had a huge impact on NIC's performance
(in some cases, throughput for some 1 GB NICs could be below 100 kbs).With
this update, firmware now provides the correct GSO packet length and the
netxen_nic driver has been modified to handle new information provided by
firmware correctly.Throughput of the NICs using the LRO optimization with
the netxen_nic driver is now within expected levels.

Diagnostic Steps

主に以下の 2 つの効果が見られます。

  • TCP 接続ウィンドウが十分に大きくなりません (720 バイト程度)。通常のトラフィックキャプチャーで確認できます。
  • RHEL ホストが、待機 ACK を送るのに 40ms 遅れる可能性があります。これは、遅延 ACK メカニズムが適切に起動していないことが原因です。wireshark を使用して TCP 接続を確認します。0.1 秒を 1 チェックにして IO グラフを開いて「パケット/チェック」の形で表示します。遅延した ACK が発生すると、くぼみがいくつかできます。

受信オフロードが有効かどうか確認します。

$ grep 'receive-offload' sos_commands/networking/ethtool_-k_eth0 | grep ': on'
generic-receive-offload: on
large-receive-offload: on

無効にして、問題が改善するかどうかを確認します。

# ethtool -K eth0 gro off lro off

This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.