Dev Study
← 仮想化とクラウドの土台
レッスン 1 / 10·約 9 分·第8期 仮想化とクラウドの土台

なぜ1台の機械を分けるのか — 利用率と隔離

アプリと DB の下に何が積まれているか(左が下、右が上)
  1. 物理機リージョン/AZ今ここ
  2. ハイパーバイザVM exit で捕まえる今ここ
  3. VMゲストOS
  4. コンテナnamespace / cgroup
  5. プロセスアプリ / DB

第12週では1つのCPUを順番待ちで分け合う話をしました。今回はその外側、1台の機械そのものを区画に分ける話です。

まず結論

1つの処理は機械を使い切れません。待ちが大半なので、余った能力を他へ回したくなります。分け方は2つ、時間で分けるか空間で分けるかです。

しかし分けた瞬間に別の要求が生まれます。「隣に影響されない」という保証です。1974年のPopek & Goldbergは、これを等価性・資源制御・効率という3つの性質として書き下しました。以後の仮想化はこの3つの折り合いの話です。

? 読む前に予測

あなたのMacやWindowsで動いているDockerコンテナは、そのOSのカーネルの上で直接動いていますか。

当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。

抽象原理

機械は、たいてい遊んでいる

ここから先は、アプリとDBの下に何が積まれているかの話です。出発点は身も蓋もない事実、1つの処理は機械を使い切らない、です。ディスクの応答を待ち、通信の返事を待ち、人間の入力を待つ。その間 CPU は仕事をしていません。第12週で見たとおり、コアは同時に1つしか実行できないのに、その1つすら埋まらないのです。

余るなら他へ回したい。分け方は2つです。

  1. 時間で分ける — 1つの実行装置を短く区切り、順番に使わせる。第12週で見た、OS が高速に切り替えるやり方。
  2. 空間で分ける — 1台の機械を区画に切り、それぞれに仮想的なCPUとメモリを割り当てる。区画ごとに別のOSが入る。

そして分けた瞬間、新しい要求が生まれます。隣に影響されないこと。 隣が暴走しても落ちない、隣からメモリを覗かれない。これを最初に書き下したのが1974年の論文です。

具体実物

1974年に決まった3つの条件

Popek と Goldberg は仮想機械を「実機の効率的で隔離された複製」(an efficient, isolated duplicate of the real machine)と置き、監視役が満たすべき性質を3つ挙げました。§5 の逐語です。

Popek & Goldberg 1974, §5 The Virtual Machine Properties (p.417-418) よりコマンド出力
The efficiency property. All innocuous instructions
are 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 impossible
for that arbitrary program to affect the system re-
sources, i.e. memory, available to it; the allocator of the
control program is to be invoked upon any attempt.
The equivalence property. Any program K executing
with a control program resident, with two possible
exceptions, performs in a manner indistinguishable from
the case when the control program did not exist ...
As mentioned earlier, the two exceptions result from
timing and resource availability problems.

読み替えると、効率は「ほとんどの命令は実機がそのまま実行する」。だからエミュレータは入りません。資源制御は「割り当てられていない資源には触れられず、触ろうとすれば監視役が呼ばれる」。等価性は「実機で動かした場合と区別がつかない」。

最後の1行に注目してください。等価性には2つの例外が最初から認められています。時間と資源の量です。「遅くなること」と「実機より少なく見えること」は、1974年の時点で仕様のうちだと宣言されているわけです。

✓ ここまでの確認

Popek & Goldberg が挙げた効率(efficiency)の性質は、何を要求していますか。

抽象原理

境界をどこに置くか、という一般則

3つの性質は仮想化に限りません。何かを分けるときは常に、境界をどの層に置くかを選んでいます。

同じ「分ける」でも、境界を置く層が違う
1コア実行装置は1つ
1台の物理機CPU・メモリ・ディスク
分ける役を置く
OS のスケジューラ時間で区切る
ハイパーバイザ空間で区切る
分けた結果
task × N同じカーネルを共有
VM × N各vCPU・メモリ区画・別のOS
  • ・左は第12週で見た構造。カーネルは1つで、その中で順番待ちをする
  • ・右は区画ごとにOSが入る。カーネルが壊れても隣には及ばない
  • ・動機はどちらも「余った能力を他へ回す」

左は分ける役がカーネルの中にいます。だから分けられた側(task)は同じカーネルを共有し、カーネルが落ちれば全員落ちます。右は分ける役がカーネルより下にいるので、片方のOSが落ちても隣は走り続けます。隔離が強いほど共有できるものが減るという交換条件です。

具体実物

あなたの手元にも、VMが1つ動いている

これは手元で確認できます。macOS でコンテナを動かしている人は、既に VM を1つ走らせています。

実機(macOS 26.5.2 / Apple M4 / Docker Desktop 4.47.0)。$ docker info の抜粋コマンド出力
Server Version: 28.4.0
Kernel Version: 6.10.14-linuxkit
Operating System: Docker Desktop
OSType: linux
Architecture: aarch64
CPUs: 10
Total 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)の列は、何の時間を表していますか。

⇄ 2つを見比べる
具体例 A

第12週の OS — 1コアを task で分ける

コア1つは同時に1つしか実行できないので、OSが高速に切り替えて順番待ちさせます。分けられた側は同じカーネルの中にいて、待ちは実行順という形で現れ、ps や top でプロセスの状態として見えます。

境界と、影響の出方表
境界を置く層 カーネルの中(スケジューラ)
分けられる単位 task(プロセス/スレッド)
カーネル 1つを全員で共有
隣の影響 実行順の待ち。自分のOSから見える
具体例 B

ハイパーバイザ — 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 / 4正解: 0

「1台の機械を分ける」動機として、このレッスンの出発点はどれですか。

用語集(5語)
ハイパーバイザ (VMM)
1台の機械を複数の仮想機械に分ける監視役。Popek & Goldberg は等価性・資源制御・効率の3性質で定義。
等価性 (equivalence)
監視役がいない実機で動いた場合と区別できないこと。ただし時間と資源の量は例外とされる。
資源制御 (resource control)
割り当てられていない資源に触れられず、監視役は割り当て済みの資源を取り戻せること。
効率 (efficiency)
無害な命令は監視役の介入なしにハードウェアが直接実行すること。エミュレータやインタプリタとの境目になる。
steal time (st / %steal)
ハイパーバイザが他の仮想プロセッサを処理している間に、仮想CPUが不本意に待たされた時間の割合。内側からは原因が見えない。