>>前回

 まず、UnixBench 5.1.3を利用してKVMのCPU演算性能を調べた。具体的には、整数演算性能を調べるDhrystoneベンチマークと、浮動小数点数演算性能を調べるWhetstoneベンチマークを検証(3)として行った(図4)。

図4●KVMのCPU演算性能
図4●KVMのCPU演算性能
整数演算(左)はUnixBench 5.1.3のDhrystoneベンチマーク、浮動小数点数演算(右)はWhetstoneベンチマークで性能を調べた
[画像のクリックで拡大表示]

 整数演算のオーバーヘッドは1.5~2.0%で、無いに等しいという結果になった。浮動小数点数演算でも、オーバーヘッドは1.3~4.9%と小さかった。整数演算と浮動小数点数演算とも、コア数に応じて性能が向上した。

 一般に、80x86アーキテクチャーのCPUでは、OSを特権モード(リング0)で、一般アプリケーションをユーザーモード(リング1~3)で動かす。仮想化した場合は、仮想化ソフトが特権モードで動作し、仮想環境(ゲスト環境)のOS(ゲストOS)やアプリケーションはユーザーモードで動作する。ゲストOSを通常の特権モードではなく、ユーザーモードで動作させるので、モードの違いで命令実行時の動作が異なることがある。動作が同じかどうかで仮想化ソフトの処理内容が変わる。

 両モードで動作が変わらないCPU命令がゲスト環境で発行された場合は、性能を高めるために仮想化ソフトは余計な手出しをせず、CPUでそのまま実行させる。検証!)で、DhrystoneやWhetstoneベンチマークを動かした際にKVMのゲスト環境で発行された命令の大半が、そうした両モードで動作が変わらないCPU命令だったので、オーバーヘッドはほとんど生じなかった。

仮想化支援機構を持つCPUが必須

 特権モードとユーザーモードで動作に差がある命令については、仮想化ソフトは次のように対処する。

 ユーザーモードで動かすと特権違反が起こる命令(特権命令)がゲスト環境で発行された場合は、特権モードで動作する仮想化ソフトに制御が移り、本来の動作になるように仮想化ソフトがハードウエアをエミュレーションする。KVMの場合、大半のエミュレーションはKVM本体ではなく、PCエミュレーターの「QEMU」を機能拡張した「qemu-kvm」が行う。メモリーアクセスやディスク読み書き、ネットワーク転送では、ハードウエアのエミュレーションが不可欠になる。続く検証(4)~(6)はそれらの検証で、KVMやqemu-kvmを介した処理性能を測定することになる。

 また、特権違反が起こらないのに、両モードで動作が異なるCALLやJMP、RETなどの命令(非特権センシティブ命令)がゲスト環境で実行された場合の処理については、一般に大きく三つの対処策がある。一つは、非特権センシティブ命令を本来の動作になるよう別の命令に変換するために、ゲストOSをあらかじめ修正しておく「静的変換(準仮想化)方式」。二つ目は、非特権センシティブ命令を本来の動作になるよう別の命令に動的に変換する「動的変換方式」。そして三つ目は、Intel VT-xやAMD-Vといった最近のCPUが持つ機能により非特権センシティブ命令をフックする「仮想化支援機構活用方式」。この方式はゲストOSとして任意のOSを利用でき、動作がシンプルでオーバーヘッドが小さいという特徴がある。

 KVMはこの3方式のうち、三つ目の「仮想化支援機構活用方式」を使う。そのためKVMは、仮想化支援機構を持たないCPU搭載機では動作しない。