KVM CPUのリソース制限

・物理コアとVCPUの紐付け

仮想マシンのVCPUがどの物理コアを使用するか制限する。
特定コアのみ使用するように制限すればCPUのキャッシュヒット率が向上し、性能が上昇する可能性がある。

# virsh vcpupin VM_NAME 0 0-1
# virsh vcpupin VM_NAME 1 2-3

# virsh vcpuinfo VM_NAME
VCPU:           0
CPU:            0
State:          running
CPU time:       952862.4s
CPU Affinity:   yy--

VCPU:           1
CPU:            3
State:          running
CPU time:       937542.2s
CPU Affinity:   --yy

・物理コアの利用優先度の設定

複数仮想マシンに対して同一物理コアが割り当てられた場合の利用優先度を設定する。
cpu_shares の比率で利用時間が配分される。

# virsh schedinfo VM_NAME --set cpu_shares=2
※「2」が優先度最低

# virsh schedinfo VM_NAME
Scheduler      : posix
cpu_shares     : 2
vcpu_period    : 100000
vcpu_quota     : -1

・CPU処理利用時間の制限

仮想マシンに対するCPU処理時間の割り当てを制限する。
vcpu_period の期間内で「CPU処理時間の合計」> vcpu_quota となると、それ以上はCPUを使用できなくなる。
CPU処理時間は仮想CPU全体で合計されるため、period < quota と設定する場合もある。

例えば仮想CPUを4コア割り当てている仮想マシンの場合、
vcpu_period=100000 vcpu_quota=400000 とすればCPUを100%使用できるが、
vcpu_period=100000 vcpu_quota=200000 とすれば50%に制限される。

# virsh schedinfo VM_NAME --set vcpu_period=100000 vcpu_quota=200000

# virsh schedinfo VM_NAME
Scheduler      : posix
cpu_shares     : 1024
vcpu_period    : 100000
vcpu_quota     : 200000 ※「-1」を指定すると制限なしとなる

・設定の恒久化

コマンドラインで設定した値は仮想マシンを停止すると失われるため、恒久化する場合は
仮想マシン設定に下記設定を追加する。

<domain>
  <cputune>
    <vcpupin vcpu="0" cpuset="0,1"/>
    <vcpupin vcpu="1" cpuset="2,3"/>
    <shares>2</shares>
    <vcpu_period>100000</vcpu_period>
    <vcpu_quota>200000</vcpu_quota>
  </cputune>
</domain>