(CentOS)KVMゲストOSのリソース制御(CPU編)

KVMの各仮想マシンにはVirtual CPU(VCPU)と呼ばれる仮想的なCPUが割り当てられます。
ゲストOSからは、1つのVCPUが1コアのCPUのように見えます。


(ホストOS環境)

ゲストOSのVCPUを増やす

設定ファイルのパラメータに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:必ずしもパフォーマンスが向上するわけではないと思いますので、環境に合わせて実施してください。システム全体で負荷が少ない場合などは、パフォーマンス向上は望めないかもしれません。