TSO on ESX3.5

IT Proに日本HPの前田氏・飯島氏が連載している「VMware Infrastructure 3 の全貌」の第6回『仮想マシンのネットワークI/O負荷の軽減』がなかなかよくまとまっていて興味深い。テーマはESX3.5の新機能として搭載されたTSO (TCP Segmentation Offload)サポートの効果について。

ここではESX 3.5でTSOを有効化する方法と効果について解説したい。TSOを有効/無効としたときのパフォーマンスについては実際に検証を行った結果をもとに説明する。

http://itpro.nikkeibp.co.jp/article/COLUMN/20081203/320632/

単純に物理サーバ上にWindowsLinux OSをインストールして使うのであればTSOはかなり単純。TSOに対応したNICが搭載されていて、OSにインストールされたドライバ・ユーティリティでTSOを有効化すればできあがり。最近のサーバハードウェアに搭載されているハイエンド向けのIntelBroadcomNICはほとんどが標準的にTSOに対応しているので、OS側で有効化さえすれば使える状態になっている。最近ではTCPだけでなくiSCSI通信をOffload処理できるNICも出てきていて、iSCSI Bootにも対応するなど、NICと比較して非常に高価なiSCSI HBAの代わりにも使えるようなNICもある。
NICはデータ通信を電気信号に変換する役割を担っているが、アプリケーションデータをIPパケット化し、データフレーム化する処理はOS側で処理されており、その処理はCPUリソースを使って行われている。100Mbpsから1Gbpsに通信速度が伸び、そして現在では次第に10Gbps通信が使用されるようになっている状況において、通信データの処理がCPUリソースに対して与える負荷は無視できないものになりつつある。この状況に対して、NIC側でその処理の一部をハードウェア処理という形で請け負うことによってCPU負荷を低減させようという仕組みの1つがTSO。TSOはその名の通りTCPパケットを生成する段階において1つのパケットに収まらないデータを送信する際に、そのデータを複数のTCPパケットに区分け処理する機能をNIC側で受け持つ。
で、ここからがESXにおけるTSOのお話。ESXでは普通のサーバと違い1つのハードウェアの中で複数のOSが動作している。VMkernel、Service Console、そして複数の仮想マシン。ESXでは全ての通信がVMkernelが提供する仮想スイッチによって処理されているが、TCPセグメンテーションの処理はVMkernelやService Console、そしてゲストOSを含めた各OS側で処理されているはずだ(VMkernelは正確には仮想スイッチもVMkernelが提供する機能の一部なので話がややこしいが)。つまり「普通のサーバ」よりも多くのTCPセグメンテーション処理が行われている。そんなESXがTSOに対応することは「普通のサーバ」よりも効果が高いのではないかと思う。
ESX3.5ではTSOに対応したので何もしなくてもVMkernelの通信はTSOが有効なのでTSOの効果が働く。続いて仮想マシン。TSOがない場合、仮想マシンでは仮想マシン上に導入されたゲストOSにおいてCPUリソースを使ってTCPセグメンテーションが処理されている。これをTSO対応にできれば効果は結構大きい。なんといっても複数のゲストOSが同時に稼働しているのだから、当然ながらTCPセグメンテーション処理がCPUに与える影響もその分大きいわけで、それが解消されるメリットはその分大きいわけだ。ESXではVMware Toolsに含まれるドライバと仮想マシンレベルで一部ゲストOSの場合のみ選択できるEnhanced vmxnet仮想NICを選択すればTSOのメリットを仮想マシン通信においても享受することができるようになる。
仮想マシンが多ければ多いほどESXホスト全体としてもより効果的なTSO対応。地味ではあるものの価値ある機能だと思う。