■ QEMUには同じ目的の仮想デバイス実装が複数ある
オープンソースで VMware 同様に IA をエミュレーションできるソフトウェアとしては QEMU, Xen, KVM, VirtualBox など多くのものがありますが、これらのほとんどは QEMU 由来のデバイスエミュレータがベースとなっています。
QEMU にはタイマ、ディスクコントローラ、ビデオコントローラ、ネットワークコントローラ、シリアルインターフェイス、サウンドカード、タイマ… PC/AT 互換機をエミュレーションする上で必要となるハードウェアのエミュレーションが一通り揃っていますが、実はネットワークコントローラやサウンドカードは複数の実装があり、設定によって使い分けることができます。
今回は、その中でも実用面でもメリットが多いにあるネットワークコントローラを取り上げます。
■ Realtek 8139 とその功罪
QEMU 由来の仮想マシンソフトウェアのほとんどは、標準の設定では Realtek 8139 によって仮想ネットワークを提供します。
Realtek 8139 は2000年以前でも比較的安価に手に入るネットワークカードだったため広く流通しています(いました)。ただしハードウェアの性能としてはそれほど高い物ではなく、高トラフィックには耐えられないことが知られています。ハードウェアデザイン上の問題について興味があれば
FreeBSD の rl ドライバのソースコード に書かれたメッセージを見るとよいでしょう。
しかし、 Realtek 8139 は結果的に現在実行される IA 向けのほとんどの OS にドライバが含まれています(Solarisなど、標準でドライバを持たないOSも幾つかはあります)。また、PCIバスに対応した製品のため、ネットワークチップの元祖とも言える NE2000 系と違い面倒な設定も不要です。このため、「仮想マシンとして Realtek 8139 をエミュレートしておけば大抵の場合ゲスト OS が認識できる」という利点があるのです。ただ、この場合でもネットワークのパフォーマンスはそれほど期待できません。
具体的に Realtek 8139 をエミュレーションしたゲスト OS が出す性能を iperf で計ってみました。なお、この結果は Q8400 プロセッサ、 Xen 開発ツリー最新版の上で 1CPU 構成の Windows xp 環境を作って計測しています。仮想CPUの性能で頭打ちになっているため、この値が上限かどうかについては確認していません。
C:\>iperf -c 192.168.44.75 -w 4M
------------------------------------------------------------
Client connecting to 192.168.44.75, TCP port 5001
TCP window size: 4.00 MByte
------------------------------------------------------------
[1912] local 192.168.44.77 port 3318 connected with 192.168.44.75 port 5001
[ ID] Interval Transfer Bandwidth
[1912] 0.0-10.5 sec 73.1 MBytes 58.3 Mbits/sec
■ QEMU がエミュレートする Intel PRO/1000MT Desktop
QEMU がエミュレートできる他のネットワークコントローラとして Intel PRO/1000MT Desktop 相当、 PCI もしくは PCI-X に刺さる初期の Intel 製コントローラ 82540EM があります。このモデルも決してパフォーマンスが高いものではないのですが(ノートパソコンの GbE NIC が PCI Express 経由で接続されている現代としてはレガシなものといわざるを得ないでしょう)、 Realtek 8139 と比べると OS にかかる負荷が少ない設計になっています。これはつまり、仮想マシンでエミュレーションする場合に、 Realtek 8139 と比べるとゲスト OS の負荷を低減でき、当然ながらその相手となるハードウェアエミュレーションの負荷も低くなる、ということです。
C:\>iperf -c 192.168.44.25 -w 4M
------------------------------------------------------------
Client connecting to 192.168.44.25, TCP port 5001
TCP window size: 4.00 MByte
------------------------------------------------------------
[1912] local 192.168.44.77 port 3334 connected with 192.168.44.25 port 5001
[ ID] Interval Transfer Bandwidth
[1912] 0.0-10.1 sec 474 MBytes 394 Mbits/sec
iperf の結果(先ほどと同条件で、ネットワークカードのデバイスモデルのみ変更)を見ればそのパフォーマンス差は明らかです。
今回の検証に利用したゲストOS (Windows xp SP3)ではコントローラのドライバを標準で持っておらず認識できなかったため、 Intel PROSet のドライバをダウンロードしインストールしました。つまり OS によってはドライバを別途準備する必要がある、ということです。
これは単なる手間の問題もありますが、もうひとつの問題としてドライバのライセンス問題もあります。たとえば今回ダウンロードした Intel のドライバは License Agreement において「 Intel のコンポーネントとの組み合わせでのみ使用を許可する」と明記されており、 QEMU との組み合わせは本当はライセンス違反です。とはいえ、では QEMU が他にエミュレーションする CirrusLogic のビデオカードは大丈夫なのかと言えば、確認してみれば、同じような問題を抱えている可能性は高いでしょう。
Linux や FreeBSD などでは、上記の問題は無視できると言えます。 GPL ないしは BSD ライセンスで自由に利用できるドライバが標準で付属されていますので、上記の問題はどちらも関係ないと言えるでしょう。
■ Xen の場合の設定方法
思いのほか前置きが長くなってしまいましたが、実際にデバイスモデルを切り替えるのは簡単です。 Xen の仮想マシン定義ファイルでデバイスモデルを変更する場合は、 vif 行の model= パラメータを指定します。
Realtek 8139 をエミュレーションする場合
vif = [ 'type=ioemu, bridge=xenbr0, model=rtl8139' ]
Intel 82540EM をエミュレーションする場合
vif = [ 'type=ioemu, bridge=xenbr0, model=e1000' ]
■ ちなみに....
Xen で利用できる GPLPV Drivers に含まれるネットワークドライバを利用した場合は、さらに高いパフォーマンスを、より低い CPU 負荷で達成できます。仮想マシン技術にあわせた専用インターフェイスにはさらなる性能面の優位点があるということがが判ります。
C:\>iperf -c 192.168.44.71 -w 4M
------------------------------------------------------------
Client connecting to 192.168.44.71, TCP port 5001
TCP window size: 4.00 MByte
------------------------------------------------------------
[1912] local 192.168.44.77 port 3277 connected with 192.168.44.71 port 5001
[ ID] Interval Transfer Bandwidth
[1912] 0.0-10.0 sec 518 MBytes 432 Mbits/sec