- 物理機リージョン/AZ今ここ
- ハイパーバイザVM exit で捕まえる今ここ
- VMゲストOS
- コンテナnamespace / cgroup
- プロセスアプリ / DB
第12週では1つのCPUを順番待ちで分け合う話をしました。今回はその外側、1台の機械そのものを区画に分ける話です。
まず結論
1つの処理は機械を使い切れません。待ちが大半なので、余った能力を他へ回したくなります。分け方は2つ、時間で分けるか空間で分けるかです。
しかし分けた瞬間に別の要求が生まれます。「隣に影響されない」という保証です。1974年のPopek & Goldbergは、これを等価性・資源制御・効率という3つの性質として書き下しました。以後の仮想化はこの3つの折り合いの話です。
あなたのMacやWindowsで動いているDockerコンテナは、そのOSのカーネルの上で直接動いていますか。
当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。
機械は、たいてい遊んでいる
ここから先は、アプリとDBの下に何が積まれているかの話です。出発点は身も蓋もない事実、1つの処理は機械を使い切らない、です。ディスクの応答を待ち、通信の返事を待ち、人間の入力を待つ。その間 CPU は仕事をしていません。第12週で見たとおり、コアは同時に1つしか実行できないのに、その1つすら埋まらないのです。
余るなら他へ回したい。分け方は2つです。
- 時間で分ける — 1つの実行装置を短く区切り、順番に使わせる。第12週で見た、OS が高速に切り替えるやり方。
- 空間で分ける — 1台の機械を区画に切り、それぞれに仮想的なCPUとメモリを割り当てる。区画ごとに別のOSが入る。
そして分けた瞬間、新しい要求が生まれます。隣に影響されないこと。 隣が暴走しても落ちない、隣からメモリを覗かれない。これを最初に書き下したのが1974年の論文です。
1974年に決まった3つの条件
Popek と Goldberg は仮想機械を「実機の効率的で隔離された複製」(an efficient, isolated duplicate of the real machine)と置き、監視役が満たすべき性質を3つ挙げました。§5 の逐語です。
The efficiency property. All innocuous instructionsare executed by the hardware directly, with no interven-tion at all on the part of the control program.The resource control property. It must be impossiblefor that arbitrary program to affect the system re-sources, i.e. memory, available to it; the allocator of thecontrol program is to be invoked upon any attempt.The equivalence property. Any program K executingwith a control program resident, with two possibleexceptions, performs in a manner indistinguishable fromthe case when the control program did not exist ...As mentioned earlier, the two exceptions result fromtiming and resource availability problems.
読み替えると、効率は「ほとんどの命令は実機がそのまま実行する」。だからエミュレータは入りません。資源制御は「割り当てられていない資源には触れられず、触ろうとすれば監視役が呼ばれる」。等価性は「実機で動かした場合と区別がつかない」。
最後の1行に注目してください。等価性には2つの例外が最初から認められています。時間と資源の量です。「遅くなること」と「実機より少なく見えること」は、1974年の時点で仕様のうちだと宣言されているわけです。
Popek & Goldberg が挙げた効率(efficiency)の性質は、何を要求していますか。
境界をどこに置くか、という一般則
3つの性質は仮想化に限りません。何かを分けるときは常に、境界をどの層に置くかを選んでいます。
- ・左は第12週で見た構造。カーネルは1つで、その中で順番待ちをする
- ・右は区画ごとにOSが入る。カーネルが壊れても隣には及ばない
- ・動機はどちらも「余った能力を他へ回す」
左は分ける役がカーネルの中にいます。だから分けられた側(task)は同じカーネルを共有し、カーネルが落ちれば全員落ちます。右は分ける役がカーネルより下にいるので、片方のOSが落ちても隣は走り続けます。隔離が強いほど共有できるものが減るという交換条件です。
あなたの手元にも、VMが1つ動いている
これは手元で確認できます。macOS でコンテナを動かしている人は、既に VM を1つ走らせています。
Server Version: 28.4.0Kernel Version: 6.10.14-linuxkitOperating System: Docker DesktopOSType: linuxArchitecture: aarch64CPUs: 10Total Memory: 7.654GiB
この機械の uname -a は Darwin ... 25.5.0 を返すのに、docker info は Linux カーネル 6.10.14-linuxkit と答えている。macOS の中で別のカーネルが動いているわけです。
最後の行も見てください。この Mac の物理メモリは 24 GiB ですが Total Memory は 7.654 GiB。等価性の2つ目の例外、資源の量です。VM の中から見える量は物理量ではなく割り当て量です。
Linux の top に出る st(steal)の列は、何の時間を表していますか。
第12週の OS — 1コアを task で分ける
コア1つは同時に1つしか実行できないので、OSが高速に切り替えて順番待ちさせます。分けられた側は同じカーネルの中にいて、待ちは実行順という形で現れ、ps や top でプロセスの状態として見えます。
境界を置く層 カーネルの中(スケジューラ)分けられる単位 task(プロセス/スレッド)カーネル 1つを全員で共有隣の影響 実行順の待ち。自分のOSから見える
ハイパーバイザ — 1台を区画で分ける
1台の物理機をvCPUとメモリ区画に切り、区画ごとに別のOSを入れます。分ける役はカーネルより下にいるので、ゲストOSは分けられていることを原則として知らず、待ちは外側で起きます。
境界を置く層 カーネルの下(ハイパーバイザ)分けられる単位 VM(vCPU・メモリ区画)カーネル 区画ごとに別々隣の影響 外側の待ち。st / %steal という数値
時間で分けるときと空間で分けるとき、隣の影響はどこに、どういう形で現れるでしょうか。
「自分のOSの中を調べれば原因が分かる」のはどちらでしょうか。分からない側は何を手がかりにしますか。
この章のまとめ
- 分ける動機は余り。1つの処理は待ちが大半で、機械を使い切らない。
- 分け方は2つ。時間で分ける(第12週のOS、カーネルは1つ)か、空間で分ける(ハイパーバイザ、区画ごとに別のOS)か。
- 分けたら隣に影響されない保証が要る。3性質は等価性・資源制御・効率。
- 等価性には最初から2つの例外がある。時間と資源の量。遅くなること、物理より少なく見えるのは仕様のうち。
- OSが分けたなら待ちは実行順として内側から見えるが、ハイパーバイザが分けたなら外側で起き、st / %steal でしか見えない。
- Docker Desktop も WSL 2 も、公式文書が VM を使うと明記している。「macOS でネイティブに」は誤り。
docker infoのKernel Versionで確かめられる。
次回は、その分ける役がどうやって区画を取り締まっているのかを見ます。ゲストOSは本物の機械を触っているつもりで特権命令を出しますが、実行させるわけにはいきません。どこで捕まえているのかを扱います。
問題で確かめるなら入口は クラウドとコンテナ のカテゴリ、steal time や隣の影響は システム性能分析 グループの 性能分析XI(クラウド環境の性能) にあります。
自分の現場で確かめる
読んだだけでは身につきません。手元の環境で実際に見てみてください。
理解度チェック
読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。
「1台の機械を分ける」動機として、このレッスンの出発点はどれですか。
用語集(5語)
- ハイパーバイザ (VMM)
- 1台の機械を複数の仮想機械に分ける監視役。Popek & Goldberg は等価性・資源制御・効率の3性質で定義。
- 等価性 (equivalence)
- 監視役がいない実機で動いた場合と区別できないこと。ただし時間と資源の量は例外とされる。
- 資源制御 (resource control)
- 割り当てられていない資源に触れられず、監視役は割り当て済みの資源を取り戻せること。
- 効率 (efficiency)
- 無害な命令は監視役の介入なしにハードウェアが直接実行すること。エミュレータやインタプリタとの境目になる。
- steal time (st / %steal)
- ハイパーバイザが他の仮想プロセッサを処理している間に、仮想CPUが不本意に待たされた時間の割合。内側からは原因が見えない。