(CentOS)KVMゲストOSのリソース制御(CPU編)
KVMの各仮想マシンにはVirtual CPU(VCPU)と呼ばれる仮想的なCPUが割り当てられます。
ゲストOSからは、1つのVCPUが1コアのCPUのように見えます。
(ホストOS環境)
ゲストOSのVCPUを増やす
設定ファイルの
$ sudo virsh edit dev-cent01
(省略) <!-- 1から2に変更 --> <vcpu>2</vcpu> (省略)
ゲストOSを起動して、CPU数を確認します。
$ sudo virsh start dev-cent01 ドメイン dev-cent01 が起動されました $ sudo virsh dominfo dev-cent01 Id: 5 名前: dev-cent01 UUID: dd8ae813-5ae2-9248-d22a-8073af072aab OS タイプ: hvm 状態: 実行中 CPU: 2 <--- CPU数 CPU 時間: 416.5s 最大メモリー: 1048576 kB 使用メモリー: 1048576 kB 自動起動: 無効にする
ゲストOS上からも、"$ cat /proc/cpuinfo"で2CPUになっていることが確認できます。
物理CPUとVCPUの対応付け
ゲストOSへ割り当てられるVCPUは、デフォルトでは全ての物理CPUに対応付けられており、Linuxのスケジューラにより物理CPUが割り当てられます。
全ての物理CPUと対応付けられていると、VCPUが他CPUにスケジュールされることによるキャッシュのミスヒットなどのオーバーヘッドの発生が考えられます。
そこで、VCPUと特定の物理CPUを対応付けることで、上記のようなオーバーヘッドの発生を防ぎます。*1
デフォルトでは、以下のように全ての物理CPUに対応付けられています。
$ sudo virsh vcpuinfo dev-cent01 VCPU: 0 CPU: 1 状態: 実行中 CPU 時間: 419.6s CPU アフィニティー: yyyy
CPUアフィニティーが実行可能な物理CPUを表しています。
"y"は実行可能、"-"が実行不可能で、左からCPU0, CPU1, ...となります。
上記では、4コア全てが実行可能となっています。
以下では、CPU1のみ実行可能となるよう設定しています。
$ sudo virsh edit dev-cent01
(省略) <!-- cpuset='CPU番号' を追記 --> <vcpu cpuset='1'>1</vcpu> (省略)
$ sudo virsh vcpuinfo dev-cent01 VCPU: 0 CPU: 1 状態: 実行中 CPU 時間: 474.8s CPU アフィニティー: -y--
"cpuset"は、以下のような設定も可能です。
-
- cpuset='0-3' : CPU0〜CPU3を実行可能
- cpuset='0,1,3' : CPU0, CPU1, CPU3を実行可能
- cpuset='0-1,3' : CPU0, CPU1, CPU3を実行可能
- cpuset='^2' : CPU2以外のすべてのCPUを実行可能
ゲストOSに複数のVCPUを割り当てている場合
上記設定から分かるように、"cpuset"はドメイン(ゲストOS)毎に設定するため、1つのゲストOSに複数のVCPUが割り当てられている場合、設定ファイルでは各VCPU毎に物理CPUを対応付けることができませんでした。
ゲストOSが実行中であれば、"vcpupin"コマンドで個別に対応付けができるようです。
$ sudo virsh vcpupin <domain> <vcpu> <physical cpu>
*1:必ずしもパフォーマンスが向上するわけではないと思いますので、環境に合わせて実施してください。システム全体で負荷が少ない場合などは、パフォーマンス向上は望めないかもしれません。