前田 裕貴,飯島 徹
日本ヒューレット・パッカード

 VMware Infrastructure 3 v3.5の中の仮想化ソフトVMware ESX 3.5(以下ESX 3.5と略)の新機能の一つに,TCPセグメント化オフロード(TSO:TCP Segmentation Offload)のサポートがある。TSOは,NICに実装された専用チップがTCPパケット生成時の演算の一部を担うことにより,CPU負荷を軽減させる機能だ。現在販売されているほぼすべてのサーバー機用のNICがTSO機能を搭載しているにもかかわらず,これまでのESXではTSOをサポートしていなかった。

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

TCPのセグメント化処理をNICで実行

 初めにTSOについて説明しよう。ここでは簡単な説明にとどめるので,TSOの詳細に興味をお持ちの方は,この記事の最後にある別掲記事をご覧いただきたい。

 そもそもTCP/IPネットワーク通信では,CPUに負荷がかかる計算処理が少なからず発生し,この負荷は通信速度が上がるほど高まる。そこでネットワークの通信に伴う計算処理を,CPUではなくNIC上で行う仕組みが作られた。これは一般にネットワーク・タスクのオフロードと呼ばれる。

 TSOはこのネットワーク・タスクのオフロードの一種だ。図1に示すようにTSOを有効にすると,本来はCPU上で行われるTCPセグメント化処理をNIC上で行うようになる。TCPセグメント化とは,一つのパケットでは送信できない大きなデータを送信するとき,データを複数のTCPパケットに分割する処理である。

図1●TSO有効/無効時のTCPセグメンテーション化処理の流れ
図1●TSO有効/無効時のTCPセグメンテーション化処理の流れ
[画像のクリックで拡大表示]

 単なる分割処理だと侮ってはいけない。意外に思われるかもしれないが,多数のTCPパケットが演算対象となるため「塵も積もれば山となる」と同様,トラフィック量によっては無視できない負荷になる。そこで,この処理をNICにオフロードすると,CPU負荷を大きく軽減することが期待できる。

物理と仮想の両NICでTSOを有効に

 TSOを有効にするにはNIC,NICのデバイス・ドライバ,そしてOSがTSOに対応していればよい。ESX 3.5では,ESXの中核部分であるVMkernelインターフェース上,および仮想マシン上のそれぞれでTSOを有効に設定できる。

 まず,VMkernelインターフェースでの設定について言及しよう。VMotionやIPストレージ処理を行う際に利用するVMkernelインターフェースでは,デフォルトでTSOが有効になっている。つまり,VMotionおよびIPストレージ処理のいずれにおいてもデフォルトで大幅なCPU負荷の軽減が見込めるであろう。

 VMkernelインターフェースでTSOが有効になっているかどうかを確認するには,サービス・コンソールで,以下のコマンドを実行すればよい。

 esxcfg-vmknic -l

 TSOが有効な場合は,TSO MSSが「40960」に設定されている(図2a)。一方,TSOが無効な場合は,TSO MSSが「disabled」になる(図2b)。

図2●VMkernelインターフェースのTSO有効化設定を確認する
図2●VMkernelインターフェースのTSO有効化設定を確認する
[画像のクリックで拡大表示]

 VMkernelインターフェースでは,TSOはデフォルトで有効になっている。VMkernelインターフェースのTSO有効/無効を切り替えるには,一度対象のVMkernelインターフェースを削除してから,VMkernelインターフェースを再作成する必要がある。