読者です 読者をやめる 読者になる 読者になる

uzyexeのノート

ITインフラ運用系のネタを主に書く、つもり・・・

RHEL6系で通信オフロード設定の有効/無効による転送速度の差異

 ほぼデフォルト設定状態の RHEL6 系 OS で通信オフロード設定の有効/無効によって、通信の転送速度がどれほど差異があるか検証してみました。検証環境の概要は下記のとおりです。

  • さくらのクラウドで仮想サーバを2台用意して、サーバ間をスイッチで接続して速度測定。
  • 測定対象サーバには Sientific Linux 6.5 をインストール。
  • 対向サーバには Ubuntu 14.04.0 をインストール。
  • 各サーバの NIC の理論回線速度は公称 1000Mbps。(最大実効速度は500Mbps 程度)
  • サーバ間を結ぶスイッチの回線速度は無制限。(概ね NIC の実効速度に依存することになる)
  • 速度測定には iperf を使用。

 

 今回、変更対象となる通信オフロード設定は、仮想NIC (Network Interface Card) の TSO (TCP Segmentation Offload)  と GSO (Generic Segmentation Offload)  の設定。

 ざっくり解説すると、TSO は『送信パケットの分割処理NIC にオフロードする機能』、GSO は『受信パケットを NIC が結合してから OS に渡すオフロード処理をソフトウェアで実装した機能』です

 経験上、この手の設定を変更すると、通信の並列度(同時通信数)が増えるほどに通信速度に与える影響も大きくなりがちなので、iperf による速度測定では1並列(-P1)のパターンと100並列(-P100)のパターンとで各3回、1回あたり5分(-t300)の試験をしてみました。検証結果は以下のとおりでした。 

 

検証結果 

TSO on / GSO on ( ethtool -K ethX tso on gro on )

 並列度1回目2回目3回目
送信(TX) 1並列 483 Mbits/sec 478 Mbits/sec 482 Mbits/sec
送信(TX) 100並列 311 Mbits/sec 301 Mbits/sec 310 Mbits/sec
受信(RX) 1並列 481 Mbits/sec 454 Mbits/sec 456 Mbits/sec
受信(RX) 100並列 316 Mbits/sec 291 Mbits/sec 312 Mbits/sec

 RHEL6系のデフォルト設定です。まあまあ、こんなもんでしょう。

 

TSO on / GSO off  ( ethtool -K ethX tso on gro off )

 並列度1回目2回目3回目
送信(TX) 1並列 454 Mbits/sec 452 Mbits/sec 453 Mbits/sec
送信(TX) 100並列 396 Mbits/sec 384 Mbits/sec 391 Mbits/sec
受信(RX) 1並列 451 Mbits/sec 452 Mbits/sec 455 Mbits/sec
受信(RX) 100並列 336 Mbits/sec 336 Mbits/sec 299 Mbits/sec

 100並列のとき、送信速度が20%が改善されました。 

 

TSO off / GSO on  ( ethtool -K ethX tso off gro on )

 並列度1回目2回目3回目
送信(TX) 1並列 483 Mbits/sec 475 Mbits/sec 483 Mbits/sec
送信(TX) 100並列 213 Mbits/sec 213 Mbits/sec 199 Mbits/sec
受信(RX) 1並列 451 Mbits/sec 454 Mbits/sec 447 Mbits/sec
受信(RX) 100並列 314 Mbits/sec 320 Mbits/sec 311 Mbits/sec

 100並列のとき、送信速度が約30%低下しました。なるべく、TSOはoffにしないほうが良さそうな結果が出てきました。

 

TSO off / GSO off  ( ethtool -K ethX tso off gro off )

 並列度1回目2回目3回目
送信(TX) 1並列 148 Mbits/sec 145 Mbits/sec 136 Mbits/sec
送信(TX) 100並列 150 Mbits/sec 144 Mbits/sec 154 Mbits/sec
受信(RX) 1並列 479 Mbits/sec 479 Mbits/sec 475 Mbits/sec
受信(RX) 100並列 324 Mbits/sec 304 Mbits/sec 337 Mbits/sec

 おっと、送信速度が約65%低下しました。これはダメダメですね。

 

まとめ

 TSO や GSO のようなオフロード機能は通信が不安定になる要因の一つになるから何も考えずに off にしとけって話も一時期ありましたが、どのような環境でもオフロード機能を off にしとけば良いというわけでもないということがわかりました。検証って大事ですね。

 RHEL6 系の OS なら TSO on / GSO off が最も高速な設定ではないかと思います。もしくは、安心のデフォルト設定を採用して TSO on / GSO on のままでも良いと思います。

 Ubuntu 14.04 でも同様の検証をしてみましたが、Kernel 3.x 系のネットワーク周りの作り込みが優秀なのか、ここまで極端な回線速度の落ち込みは確認できませんでした。

 なお、今回の検証は特定のクラウド環境上における仮想サーバでの検証結果であって、物理サーバの場合は結果がさらに変わるはずですし、仮想サーバのために採用されているハイパーバイザーによってもエミュレーターやドライバーのチューニング度合いが各々異なるので結果は変わるはずです。

 また、通信処理の一部をNICにオフロードする機能なので、サーバの負荷次第では TSO や GSO を on にしていると、通信が不安定になることがあります。逆に、TSO や GSOを off にすると通信ができなくなる環境もあるのでチューニングを試みる際には色々と注意が必要です。

 

以上、参考までに。