KVM+Windowsを高速化するVirtio
Linux KVM(以下KVM)は、Linuxカーネルに組み込まれた仮想化環境ですが、KVM上の仮想マシンではLinuxだけでなくWindowsも動作させることができます。これはKVMが実現している仮想マシンが「完全仮想化」であるためです。
完全仮想化はOSに修正が必要ない点がメリットですが、I/Oなどの速度面ではOSに修正を加える「準仮想化」が有利な場合があります。そこで、I/Oを司るデバイスドライバを準仮想化で動作させることで性能を向上させる部分的な準仮想化の方式が、現在の主流となっています。このデバイスドライバを「パラバーチャル(準仮想化)ドライバ」と呼びます。
KVMでは、I/Oの準仮想化方式として「Virtio」が採用されています。VirtioはVirtualBoxなどでも採用されている実装になっています。今回は、VirtioのWindows用ドライバをインストールして動作させてみる手順を解説します。
Virtio-KVM
URL:http://www.linux-kvm.org/page/Virtio
今回の環境は、CentOS 5.4 x86_64版、ゲストOSはWindows Server 2008 64ビット版を選択しました。環境の設定方法およびゲストOSのインストールは、以前の記事 で説明した通りです。
64ビット版Windowsとドライバ署名
Windows Server 2008やWindows Vista、Windows 7などの64ビット版は、デバイスドライバへのデジタル署名が必要となります。しかし、今回ダウンロードして利用したlinux-kvm.orgで配布されているデバイスドライバはデジタル署名がされていないため、そのままでは利用することができません。インストールできたように見えても、ドライバがロードされないため、デバイスは利用不可になっています。
今回は動作確認を行う目的のため、起動直後にF8キーを押し「デジタル署名の強制を無効にする」を選択して起動することでこの問題を回避しました。継続して64ビット版WindowsをKVM上の仮想マシンで使用する場合には、署名済みのドライバを入手するか、自分自身でドライバに署名を行うなどの作業が必要となります。
図1 起動時にF8キーを押すことで、一時的にデジタル署名の強制を無効化できる。
Windows用Virtioドライバの入手
ドライバはLinux KVMのWebサイト からダウンロードできます。ここで配布されているドライバはZIPアーカイブ形式なので、ゲストOSでダウンロードするか、別途コピーしてください。ISOイメージでの配布も別サイトで行われているので、ISOイメージを仮想マシンにマウントしてインストールすることもできます。
ネットワーク用とストレージ用の2種類が配布されているので、必要に応じてダウンロードしてください。他の仮想化ソフトウェアのように、ドライバのインストーラは付属していないので、個別に手動でインストールする必要があります。
ネットワークデバイスのVirtio化
ネットワークデバイスのVirtio化は比較的簡単です。停止中の仮想マシンに新しいネットワークデバイスを追加し、「 デバイスモデル」は「virtio」を選択します。
図2 仮想マシンにネットワークデバイスを追加します。デバイスの種類はe1000なども選択できるので、場合によってはVirtioでなくてもよいだろう。
ゲストOSを起動すると新しいデバイスとして認識されるので、ダウンロードしておいたデバイスドライバをWindowsの通常の手順でインストールします。指定するフォルダはOSのバージョンや32ビット、64ビットで分かれていますので注意してください。
図3 新しいイーサネットコントローラとして認識されるので、デバイスドライバをインストールする。
正常にインストールが終了すると、ネットワークデバイス「Red Hat VirtIO Ethernet Adapter」が追加されているはずです。今まで使用していたネットワークデバイスは削除しても良いでしょう。
仮想ディスクのVirtio化
仮想ディスクのVirtio化は、手順としてはやや手間がかかります。Virtio用のデバイスドライバをインストールするにはデバイスを認識させる必要がありますが、仮想マシンに最初に作成した仮想ディスクが1つしか付いていないと、ドライバのインストールを行うことができません。まずはダミーのvirtio仮想ディスクを仮想マシンに追加します。
停止中の仮想マシンに新しいストレージデバイスを追加し、「 装置タイプ」は「Virtio Disk」を選択します。
図4 仮想マシンにストレージデバイスを追加。ダミーで作成するのであれば、容量は適当な値で構わない。
ゲストOSを起動すると新しいデバイスとしてSCSIコントローラが認識されるので、ダウンロードしておいたデバイスドライバをインストールします。
こちらもOSの種類によってフォルダが分かれています。曖昧に選択すると、使用できないドライバがインストールされてしまい動作しないので、その場合にはデバイスとドライバファイルを削除してからインストールし直す必要がありました。
図5 Virtioは仮想ディスク+SCSIコントローラで構成されているので、まずSCSIコントローラのデバイスドライバをインストールする。
正常にインストールが終了すると、記憶域コントローラ「Red Hat VirtIO SCSI controller」と、ディスクドライブに「Red Hat VirtIO SCSI Disk Device」が追加されているはずです。ディスクは、別途NTFSなどでフォーマットすれば使用可能になります。
図6 デバイスドライバが正常に動作している状態のデバイスマネージャ画面。ネットワークとストレージでVirtioが有効になっている。
起動ディスクもVirtio化できます。仮想マシンマネージャーで、起動ディスクとして使用している仮想ディスクを一旦削除し、あらためてVirtio Diskとして仮想ディスクイメージを登録し直します。その時、デバイス名が「vda」などvdで始まるデバイス名に変更されることを確認してください。
ただし、64ビット版Windowsのデバイスドライバへのデジタル署名の問題が解決できていない場合、起動時に毎回デジタル署名強制の無効化を行わなければならないので、実用上はあまり現実的ではないかもしれません。
ベンチマークによる性能検証
Virtio化を行うことで、どの程度速度が向上するのか、ベンチマークテストを行ってみました。
環境
HP ML350 G5
CPU Xeon E5110(1.6GHz × 2core)
メモリ 4Gバイト
HDD SATA 250Gバイト7200rpm × 4(RAID 1+0)
ホストOS CentOS 5.4
ゲストOS Windows Server 2008 Standard Edition(64ビット版)
ベンチマーク方法
Mac OS XクライアントからゲストOSのWindowsファイル共有に接続し、ddコマンドで100Mバイトと1000Mバイトのファイルを作成する際のネットワーク転送速度(バイト/秒)を計測します。5回計測し、最高値と最低値を除いた3回を結果として採用します。測定は、Virtio化を行っていない状態とネットワークデバイスをVirtio化した状態、そして仮想ディスクもVirtio化した状態の3種類を計測しています。また、ハードウェアそのものの性能を測定するために、Linux上でSambaを動かして同様に性能を測定しています。
ベンチマークテスト結果
表1 ベンチマークテストの結果
100Mバイト
非Virtio NICのみVirtio 両方Virtio ホスト Linux
1 9,768,456 18,448,466 23,060,460 50,018,009
2 11,184,355 19,277,377 23,868,970 50,424,430
3 11,323,776 19,445,261 24,727,084 50,502,244
平均 10,758,862 19,057,035 23,885,505 50,314,894
比率 100% 177.1% 222.0% 467.7%
1000Mバイト
非Virtio NICのみVirtio 両方Virtio ホスト Linux
1 9,442,375 14,776,960 14,884,233 32,380,259
2 9,824,460 14,979,757 15,104,564 32,838,428
3 10,307,215 15,478,836 15,317,783 34,263,982
平均 9,858,017 15,078,518 15,102,193 33,160,890
比率 100% 153.0% 153.2% 336.4%
測定結果の評価
まず100Mバイト転送の結果ですが、Virtio化する前に比べてネットワークデバイスをVirtio化することで、速度が約1.8倍に向上しています。デフォルトの状態が100Mbpsに制限されていますが、ギガビット化されることによる速度向上と考えられます。
さらに仮想ディスクをVirtio化することで、デフォルトの状態に比べて約2.2倍の性能となりました。ストレージの書き込みが高速化した分、さらに性能が向上しています。
次に1000Mバイトの結果ですが、Virtio化する前の性能は100Mバイトの時とあまり変わりません。そしてVirtio化することでそれぞれ約1.5倍程度の性能向上となっており、特にストレージをVirtio化しても性能はほとんど向上していません。
どちらの結果も物理性能の半分程度となっており、ネットワーク帯域よりも、物理的なストレージ性能にボトルネックがあるようです。どのような仮想化を利用する場合でも同じですが、書き込み性能はボトルネックになりやすいポイントです。できるだけ書き込みの量を減らすか、より高性能なストレージを利用するなどの工夫が必要となります。
まとめ
Linux KVMでは、ゲストOSは主にLinuxでの利用が中心になると考えられますが、Windowsも入れた混在環境も珍しくはないでしょう。それほど高いパフォーマンスが必要ないのであれば、Virtioのような準仮想化による高速化は必要ありませんが、あと少しの性能が欲しい時には有効だと思われます。
ただし、他の環境に比べると、ややドライバのインストールにWindows環境への「慣れ」のようなものが必要に思います。また、64ビット版Windows自体の制限にはなりますが、デジタル署名の強制は重要な問題ですので、32ビット版を使うか(Windows Server 2008 R2は64ビット版しかない) 、デジタル署名されたドライバを用意する必要があるでしょう。