飯島 徹 日本ヒューレット・パッカード


 「仮想化はI/Oに弱い」――。標準化団体のPCI-SIGが仕様策定作業を進めている「I/OV(I/O Virtualization)」やその周辺の技術が確立され,実装されるまでの間,これは事実として存続するであろう。

 しかしながら,人によって解釈が異なり,誤解も含まれているのもまた事実である。「I/Oのどの部分が,どれくらい弱いのか」について,具体的に言及している技術資料はあまりない。そこで本稿では,「仮想化はI/Oに弱い」という具体的な理由を探るべく,「ディスクI/O」に焦点を絞っていくつかの検証を実施した。

仮想化環境におけるディスクI/Oの負荷とは

 検証の対象を整理するために,まず仮想化環境におけるディスクI/Oの負荷を分解してみた。説明が少し長くなるが,仮想化環境におけるディスクI/Oの特性を理解する上でも役立つので,よく読んでおいてもらいたい。

 ディスクI/Oの負荷を分解する仕方はいくつかあると思われるが,図1に筆者による分解例を示す。図中の「+」や「×」は,要素の「和」もしくは「積」を示している。例えば「(2)仮想化によるオーバーヘッド」は,「(4)ディスクI/O性能以外への影響」と「(5)ディスクI/O性能自体への影響」とを足し合わせて構成されることを意味する。

図1●ディスクI/Oの負荷を分解した例
図1●ディスクI/Oの負荷を分解した例

 なお,図1に示した要素以外にも,仮想化環境でディスクI/Oが発生する要素として「仮想マシン構成ファイル」の読み書き,ライブ・マイグレーション実行時やスナップショット生成時における「メイン・メモリー上のデータのコピー」などが存在する。だが,いずれも永続的に続く負荷ではなく,特定の操作時にのみ一時的に発生する負荷である。このため,ここでは考察対象から除外している。

ディスクI/Oに限らず,仮想化環境に共通するオーバーヘッド

 図1におけるツリー構造の右端にある要素を順に見ながら,検証対象を絞り込んでいこう。まず「(8)仮想マシンの切り替え」について考えてみるが,その前に仮想化したサーバーのシステム構成について説明しておきたい。

 サーバー仮想化ソフトを使ってサーバーを仮想化した場合のシステム構成を図2に示す。ハードウエアの上には「ハイパーバイザー」と呼ぶ薄いソフトウエア・レイヤーがあり,さらにその上に「仮想マシン」がある。仮想マシンには,ゲストOSに対してハードウエア・リソースを提供するVirtual Machine Monitor(VMM)が含まれている。VMMには1つまたは複数の仮想プロセッサを割り当てられる。

図2●物理プロセッサと仮想プロセッサの関係
図2●物理プロセッサと仮想プロセッサの関係

 1つの物理プロセッサ・コアは,ある時点では1つの「仮想プロセッサ」の処理のみを担う。そのため,仮想プロセッサの数がサーバー機に搭載された物理プロセッサ・コア数を超える場合,物理プロセッサ・コアが処理の対象を切り替える必要がある。この切り替えは,ハイパーバイザーがスケジューリングしており,そこにオーバーヘッドが発生する。

 しかし,これはなにもディスクI/Oに限った話ではない。よって,本稿では「(8)仮想マシンの切り替え」に関しては検証の対象外とした。同様に,「(10)仮想マシンが動作すること自体の負荷」もディスクI/Oに限った話ではないため,検証の対象とはしなかった。ただし,そのほかの検証を実施した過程で負荷を測定できたため,最後に参考情報として紹介する。

 次に「(9)I/Oエミュレーション」と「(5)ディスクI/O性能自体への影響」を見てみよう。ゲストOS上でディスクI/Oが発生すると,VMMがそのI/O命令を横取りしてエミュレーションする。この複雑な過程はすべてプロセッサで処理されるため,プロセッサに少なからぬ負荷がかかることは容易に推測できる。また,この過程を経て実行されたディスクI/Oの性能がどの程度のものなのか,非常に重要なポイントである。よって,この2つについては,実機による検証をしてみることにした。