RX アクセレーション (GRO、LRO、TPA など) を持つ NIC が、パフォーマンスが悪い TCP の影響を受ける場合がある
Environment
- Red Hat Enterprise Linux バージョン:
- RHEL 5.7 (
2.6.18-274.el5
より前のカーネル) の Broadcombnx2x
モジュール - RHEL 5.9 (
2.6.18-348.el5
より前のカーネル)の QLogic NetXennetxen_nic
モジュール - RHEL 6.4 (
2.6.32-358.el6
より前のカーネル)の Intel 10Gbpsixgbe
モジュール - RHEL5.6(
2.6.18-238.el5
から最新のカーネル)の Intel 10Gbpsixgbe
モジュール
- RHEL 5.7 (
- ネットワークインターフェイスで有効な受信オフロード
Issue
受信 (RX) アクセレーション (GRO、LRO、TPA など) を持つネットワークインターフェイスカード (NIC) がパフォーマンス問題の影響を受ける場合があります。たとえば以下のような影響を受けます。
- 10Gbps リンク以上の NFS 転送が、100MiB/sec (つまり 1Gbps) でしか転送されません。
- TCP 接続が、ワイヤースピードになりません。
tcpdump
では、TCP Window が 720 バイトほどにしかならず、元に戻りません。
Resolution
解決法
以下のカーネルバージョンにアップグレードしてください。
- Broadcom
bnx2x
: RHEL 5.7kernel-2.6.18-274.el5
- QLogic NetXen
netxen_nic
: RHEL 5.9kernel-2.6.18-348.el5
- Intel 10Gbps
ixgbe
: RHEL 6.4kernel-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) (非公開) で対応しました。
-
上述のバグは以下のエラータによって解決しました。
- RHEL 5.7 における
bnx2x
ドライバーアップデート: http://rhn.redhat.com/errata/RHSA-2011-1065.html (629609、651546、653357、656360) - RHEL 5.9 における
netxen_nic
ドライバーアップデート: http://rhn.redhat.com/errata/RHBA-2013-0006.html (786403) - RHEL 6.4 における
ixgbe
ドライバーアップデート: http://rhn.redhat.com/errata/RHSA-2013-0496.html (819647、819101)
- RHEL 5.7 における
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.
Comments