クロスプラットフォームなハイパーバイザ Intel HAXM

HAXM (Hardware Accelerated Execution Manager)Intelが作成しているハイパーバイザです.もとはAndroid Emulatorのバックエンドとして開発が開始されたもののようです. 以下のような特徴があります.

細かい違いは当然ありますが,HAXMはKVMやHypervisor.Frameworkのようなインタフェースを提供します. WindowsではデバイスドライバMacではkernel extension, Linuxではカーネルモジュールとして実装されており,それに対してioctlでやりとりすることになります.

HAXMはもともとWindowsMacがサポート対象でしたが,気づいたら昨年に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 hostKVMでないと使用できないようです. 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のものを利用しています.

f:id:mm_i:20190322210330p:plain
NPB-OMP ベンチマーク結果

左側のグラフは実行時間のグラフ,右側はKVMを基準とした相対値のグラフ(数字はKVMの実行時間)です.3回実行の中央値をプロットしています. NPBは基本的にOpenMPを利用した数値計算ベンチマークであまりI/Oは関係ないので,今回は単純に計算中に生じたタイマ割り込みなどのVMEXITのハンドリングの速度差が出るのかと思いますが,HAXMの方が20%程度遅いベンチマークが結構あります.

機能・性能的にはやはりKVMの方がいろいろと上のようです. コードを軽くみた感じ,VMCS ShadowingやAPICVなどの機能や,KVMの準仮想化機能のようなものは入っていないように思います. ネステッドのサポートも現時点ではありません.

本当はもっといろんなマイクロベンチマークや,sysbenchなどの結果を比較をして,速度低下の要因が特定できるとよいのですが,まぁそれはまたの機会に.

APIについて

ドキュメントによると以下のような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の優先度がどうなのかはよく分かりませんが,今後も開発続くと良いですね.