ESXiのCPUとメモリの考え方 | IT土方のReminder

IT土方のReminder

英語なんて全く出来ないくせに気が付いたら外資系IT企業のサポートエンジニアになっていた人のブログ。このブログに書いてある事は間違っている可能性もあるので気づいた人が指摘してくれても良いし、指摘しなくても良い。

ESXiのCPU、メモリの考え方についてのメモ。


CPUから仮想記憶域にデータをロードの処理を行う。

仮想記憶域ではデータを連続したデータにソートされているが、実際にデータがどこに
配置されているか分からないので、DATとページテーブルを参照し、仮想記憶域の実データ
がメモリ上 orHDDのどこにあるか確認する。

まずDATでメモリ上からデータをロードする。
DATで見つからなかったデータは、今度はページテーブルを参照し、HDD上からメモリへデータ
をロードする。

CPU→仮想記憶域-+→DAT→メモリ
             |
             +→ページテーブル→HDD
(メモリにデータがない場合、HDDを参照する)

DAT:仮想記憶域のアドレスと物理メモリのアドレスマッピング。主記憶域上にある。
ページテーブル:仮想記憶域上アドレスとHDDのアドレスマッピング。主記憶域上にある。
ページング:仮想記憶域の物理メモリ上になかったデータのページフォルトの判定。
      ページイン、ページアウトを行う。

CPUは命令を処理する際に仮想記憶域からデータをロードする。
しかし、CPUのほうが処理性能が速いため、データをロードしている間にCPUで待ち時間が
発生する。その待ち時間を効率化するため、CPU上にページテーブルのコピーをTLB上に
持っておき、ページインの時間を短縮させている。



物理CPUに対して、仮想マシンに割り当てるCPUをvCPUという。vCPUはオーバーコミット
が可能。vCPUのオーバーコミット時はスケジューリング機能で物理CPUの所有権を順番に
vCPUに割り当てる。

1つの仮想マシンに複数のvCPUを割り当てる、かつCPUのオーバーコミット時はskewが発生する。
複数割り当てられたvCPUのうち1つでもCPUの所有権が取れない場合、すべてのCPUが所有権を
持つまで、vCPUは動作しない。ただし、ESX4i以降はCPUの所有権が取れなくてもOSのCPUのskew
の閾値を超えない範囲でvCPUを動作するようになった。

通常複数のCPUが割り当てられたマシンは、CPU間の時間は一致しなければ処理の不一致が
発生する。そのため、必ず複数あるCPUは同時に動かす必要がある。しかし、OSではある程度
CPU間の時刻の不一致を許可している。その不一致の範囲を利用して、仮想OSにCPU使用権が
割り当てられない時の処理停止を回避している。

たとえば物理サーバに4つCPUがあるとする。
その上に仮想サーバを3台構築し、それぞれの仮想サーバにvCPUを2つずつ割り当てる。

CPU=4個
vCPU=2×3個

つまりvCPUが物理CPUより2個多く仮想上に作られることになる。
その時の物理CPUは順番にvCPUに使用権を割り当てるが、残り2つのvCPUは待機となる。
具体的には以下のようにCPUの使用権が順番に割り当てられて行く。

スケジュール1回目
物理CPU: CPU1    CPU2   CPU3    CPU4    stop      stop
         ↓       ↓      ↓       ↓      ↓       ↓
仮想CPU:vCPU1―+―vCPU2  vCPU3―+―vCPU4  vCPU5―+―vCPU6
              ↓               ↓               ↓
仮想OS:     仮想OS1(実行中)     仮想OS2(実行中)     仮想OS3(停止中)


スケジュール2回目
物理CPU:  stop     CPU1    CPU2   CPU3    CPU4    stop
          ↓       ↓      ↓       ↓      ↓       ↓
仮想CPU:vCPU1―+―vCPU2  vCPU3―+―vCPU4  vCPU5―+―vCPU6
              ↓               ↓                ↓
仮想OS:     仮想OS1(実行中)     仮想OS2(実行中)     仮想OS3(実行中)


スケジュール3回目
物理CPU:  stop     stop    CPU1    CPU2   CPU3    CPU4
         ↓       ↓      ↓       ↓      ↓       ↓
仮想CPU:vCPU1―+―vCPU2  vCPU3―+―vCPU4  vCPU5―+―vCPU6
              ↓               ↓                ↓
仮想OS:     仮想OS1(停止中)     仮想OS2(実行中)     仮想OS3(実行中)


仮想化を実装した場合、仮想OSで利用するカーネル領域と、ESXで利用カーネル領域が
2つ存在する。仮想OSが直接物理CPUやメモリに変更してしまうと、ほかの仮想OSやESXが
処理を進めることができない。そのためIntel VT-xやAMD-VのCPUでは、仮想OSとESXの処理
を割り込みでマルチで処理できるようにしている。


複数の仮想OSに物理メモリを割り当てるためには、VMMで仮想のメモリを作成して割り当てる
必要がある。この場合、仮想OS上の仮想記憶域のページテーブルと、ESX上の仮想記憶域の
ページテーブルを物理メモリ上で2重管理になり非効率となる。そのためCPU側でテーブルを
持たせることによってメモリ処理を効率化している。