クロスプラットフォームなハイパーバイザ Intel HAXM
HAXM (Hardware Accelerated Execution Manager)はIntelが作成しているハイパーバイザです.もとはAndroid Emulatorのバックエンドとして開発が開始されたもののようです. 以下のような特徴があります.
- KVMのようなインタフェース
- QEMUのサポート
- クロスプラットフォーム
- VT-xのみ
- BSDライセンス
細かい違いは当然ありますが,HAXMはKVMやHypervisor.Frameworkのようなインタフェースを提供します. Windowsではデバイスドライバ,Macではkernel extension, Linuxではカーネルモジュールとして実装されており,それに対してioctlでやりとりすることになります.
HAXMはもともとWindowsとMacがサポート対象でしたが,気づいたら昨年にLinuxのサポートが追加されていたので,今回試してみました.
ドキュメント
HAXMといえばドキュメントが全く無くて一体どうやって使うんだという感じでしたが,Linuxサポート追加と同時期にドキュメントも(少し)追加されて,人間に多少は優しくなりました.
特に,HAXMのAPIに関するドキュメントはここにあります.
Linuxでの利用
インストール
マニュアルに従ってインストール(make && make install)するだけです.簡単.
インストールが完了すると,/dev/HAX
というデバイスが作成されています.
Linuxではこのデバイスに対してioctlでやりとりすることになります.
QEMUからの利用
QEMUのHAXMサポートはもともとWindows用に前からありましたが,Linux向けの対応は昨年の11月と比較的最近に入ったので,おそらく自分でQEMUをコンパイルする必要があると思います.
./configure --enable-hax
をつけてコンパイルします.
QEMUからHAXMを利用する場合は起動オプションとして-accel hax
をつけます (KVMの場合は-accel kvm
).
とりあえず,Ubuntuなゲストは普通に起動しました.
ちなみに,原因は調査していませんが,vcpuを17個以上作成しようとするとsegvしました
(2019-3-23追記: QEMUのソースの中で最大のvCPU数が16個になっていました).
また,-cpu host
はKVMでないと使用できないようです.
KVMとHAXMの共存(同時実行)はできません.
HAXMを使ってVMを起動すると,以下のようなデバイスが作成されます.
/dev/hax_vm/vm00 /dev/hax_vm00/vcpu0
それぞれVMやvCPUの設定に利用します.
性能比較
KVMとHAXMで簡単なベンチマークを取ってみました. いま手元にNAS Parallel Benchmarks (NPB)の評価スクリプトがあったので,それを利用しました. vcpu数は16,メモリは32GB, KVMはVMCS shadowing及びAPICVや準仮想化機能を有効にしています. ホストのLinuxは5.0, HAXM及びQEMUは現時点のmasterのものを利用しています.
左側のグラフは実行時間のグラフ,右側はKVMを基準とした相対値のグラフ(数字はKVMの実行時間)です.3回実行の中央値をプロットしています. NPBは基本的にOpenMPを利用した数値計算のベンチマークであまりI/Oは関係ないので,今回は単純に計算中に生じたタイマ割り込みなどのVMEXITのハンドリングの速度差が出るのかと思いますが,HAXMの方が20%程度遅いベンチマークが結構あります.
機能・性能的にはやはりKVMの方がいろいろと上のようです. コードを軽くみた感じ,VMCS ShadowingやAPICVなどの機能や,KVMの準仮想化機能のようなものは入っていないように思います. ネステッドのサポートも現時点ではありません.
本当はもっといろんなマイクロベンチマークや,sysbenchなどの結果を比較をして,速度低下の要因が特定できるとよいのですが,まぁそれはまたの機会に.
APIについて
- System IOCTLs
HAX_IOCTL_VERSION
HAX_IOCTL_CAPABILITY
HAX_IOCTL_SET_MEMLIMIT
HAX_IOCTL_CREATE_VM
- VM IOCTLs
HAX_VM_IOCTL_VCPU_CREATE
HAX_VM_IOCTL_ALLOC_RAM
HAX_VM_IOCTL_ADD_RAMBLOCK
HAX_VM_IOCTL_SET_RAM
HAX_VM_IOCTL_SET_RAM2
HAX_VM_IOCTL_NOTIFY_QEMU_VERSION
- VCPU IOCTLs
HAX_VCPU_IOCTL_SETUP_TUNNEL
HAX_VCPU_IOCTL_RUN
HAX_VCPU_IOCTL_SET_MSRS
HAX_VCPU_IOCTL_GET_MSRS
HAX_VCPU_IOCTL_SET_FPU
HAX_VCPU_IOCTL_GET_FPU
HAX_VCPU_SET_REGS
HAX_VCPU_GET_REGS
HAX_VCPU_IOCTL_INTERRUPT
EPTの細かい設定だったり,VMCALLの追加だったりは直接ソースをいじる必要があるみたいです. コンパイル自体はKVMより楽だと思います.
所感
QEMUが対応していてマルチプラットフォームかつBSDライセンスなハイパーバイザはHAXMだけだと思います. 個人的にはIntel CPUに新しい機能が入った時に,リファレンス実装的な感じでその機能のサポートがHAXMに入るといろんなプロジェクトで参考にできて便利になるなと思いました. 現状は特別機能的なアドバンテージがある訳ではないようですけれども.
IntelといえばIoT向けのARCN hypervisorも作っていて,Intel的にHAXMの優先度がどうなのかはよく分かりませんが,今後も開発続くと良いですね.