ハードウェア仮想化に対するOS仮想化の利点と欠点 - ゆううきメモ の続き。 Systems Performance 11.2.1 Overheadの内容。
OS仮想化の性能オーバヘッドは、CPU実行とI/Oのオーバヘッド、他のテナント(ゲスト)からの影響にまとめられる。
CPU
CPU実行のオーバヘッドは、スレッドがユーザモードで実行している限りゼロである。 同期エミュレーションやシミュレーションが不要。スレッドが生成されるか、プリエンプションされるまで、スレッドは直接on-CPUで動作する。
頻繁に呼ばれるわけではないが、システムの状態をカーネルからリストするような挙動は、他のテナントの統計がフィルタされるため、いくらかのCPUオーバヘッドがあるかもしれない。
他のテナントも含めたすべてのプロセスエントリをなめるprstat(1M)やtop(1) などのツールで/proc
を読むことも含まれる。
該当する(Solarisの)カーネルコードは以下のようになっている。
/* * Loop until user's request is satisfied or until all processes * have been examined. */ while ((error = gfs_readdir_pred(&gstate, uiop, &n)) == 0) { uint_t pid; int pslot; proc_t *p; /* * Find next entry. Skip processes not visible where * this /proc was mounted. */ mutex_enter(?dlock); while (n < v.v_proc && ((p = pid_entry(n)) == NULL || p->p_stat == SIDL || (zoneid != GLOBAL_ZONEID && p->p_zone->zone_id != zoneid) || secpolicy_basic_procinfo(CRED(), p, curproc) != 0)) n++;
1000プロセスエントリに対して、40 μsの余分なコストがある。頻繁でなければ、無視できる。
I/O
追加の機能が設定されなければ、I/Oオーバヘッドはゼロである。 OS仮想化を動作させるためには、ソフトウェアスタック上に余分なレイヤは必要ない。 これは以下の図に示されている。UnixプロセスのI/OパスとSolaris ZonesのI/Oパスの比較。
(引用: Systems Performance Figure 11-5 Unix process and Zones I/O path)
DTraceで取得したカーネルのスタックトレースからも両者の違いはみられない。 Brendan's blog » Virtualization Performance: Zones, KVM, Xen
ファイルシステムアクセスのために、Zonesがループバックファイルシステム上にマウントされるように設定されるかもしれない。
それらはホストファイルシステム上にマウントされる。
この方式は、sparse-root zonesモデルと言われている。zone間で read-only でファイルを共有する(/usr/bin
など)方法がある。
もしループバックファイルシステムが使われるなら、ファイルシステムへのI/Oに対して、少量のCPUオーバヘッドがある。
Other Tenants
- 他のテナントが消費して追い出すせいで、CPUキャッシュのヒットレートが悪くなるかもしれない
- CPU実行が短時間で他のテナントのデバイス(ネットワークI/Oなど)にインタラプトされる
- システムリソース(ディスク、ネットワークインタフェースなど)競合があるかもしれない
補足
Dockerの場合、Linux Namaspace自体にオーバヘッドがなくても、AUFSやDevice Mapperまわりでオーバヘッドがある、というのと同じことを言っている。