vCPUとは
Docker Desktopなどでコンテナを触っているとvCPUというワードを目にすることが多いと思います。「頭のvが何のことかわからないけど、多分コンテナのCPU使用率のことだろうなあ」くらいに考えてた私ですが、ちゃんと調べてみると、virtual CPUの略だそうです。物理的なCPUコアを仮想化して割り当てたものがvCPUで、各コンテナにどれだけのCPUを割り当てるかを表しています。
ざっくりいうと「1 vCPU ≒ 1論理コア」と換算します。(厳密には違うのでnearly equalにしています)
CPUのコア数とは
CS専攻でない私にとっては、恥ずかしながらそもそもCPUのコア・スレッド・クロック数などの概念が曖昧になりがちです。ここも改めて整理します。
コア・スレッド
コアとは文字通りCPUの核となる部品です。昔のCPUではコア数とスレッド数はイコールで結ばれており、シングルコアなら基本的に1スレッドしか動かせないことが多かったのですが、ハードウェア技術の進歩により4コア8スレッドなどのパフォーマンスを発揮するCPUもあります。これはハイパースレッディングという技術のおかげで、1つの物理コアを2つの論理コアに見せかけることで処理できるスレッド数を増やしています。
クロック数
PCの中身にはメトロノームのように一定の間隔で信号を送る機器が実装されています。この信号をクロック信号といい、クロック信号の周波数に合わせてCPUは仕事をします。クロック信号の周波数が高いほどCPUの仕事が早くなります。
わかりやすい例え
このサイトでCPUのことをシェフに例えて説明しており、この説明が個人的に一番わかりやすいと思っています。
サイトの言葉を借りると、以下のように例えることができます。
- コア数
- シェフの人数
- スレッド数
- シェフが使えるコンロの数
- クロック数
- シェフの動きの速さ
CPUコア数とvCPUの関係
物理CPUが8コアのPCを使っているならコンテナ側は最大8 vCPUまで上限を設定できそうに見えますが、実際は9 vCPUでも10 vCPUでも設定が可能です。(※説明を簡単にするためにハイパースレッディングは無効になってる前提で話します)これは「オーバーコミット(オーバーサブスクリプション)」と呼ばれる手法で、仮想化環境では一般的に使用されています。vCPUは「CPUの処理時間をどれだけ要求できるか」を表す単位であり、物理CPUのコア数に合わせた単位ではないためです。ただし、物理コア数以上の仕事をできるわけではないので、一つのコンテナに9 vCPUの上限を設定したコンテナは8コア分のパフォーマンスしか出すことができません。
ただ、同時に起動するコンテナの数によって解釈が異なります。
例えば1 vCPUのコンテナを同時に9つ稼働させる場合。
コンテナの中身によりますが、一般的に一つのコンテナがCPU利用率が常に100%になることは考えにくく、アイドル状態になっているタイミングなどではCPU利用率は低くなります。それゆえ、9つのコンテナの合計vCPUが9 vCPUであってもパフォーマンスの面で大きな問題になることはあまりありません。9つのコンテナ全てが高負荷な処理を同時に実行しCPU利用率が100%に近くなると、8コアしかないPCではもちろんキャパオーバーとなりパフォーマンスが劣化します。