TECHLOGICS

HYLOGICS分室。作業メモやガジェットのレビューなど、主に技術系のエントリを取り扱います。

【Linux/QEMU/KVM】 CPU Pinning(CPUアフィニティ)の設定でゲスト上のWindowsを快適に動かす

■ 環境

■ 背景

QEMU/KVM上で動かしているWindowsで原因不明のプチフリが多発。軽作業の時は問題がないが、動画を見たりゲームをプレイしているとストレスフルな状態になる。ドライバやディスクI/O、CPU負荷のかかるサービスなどを確認したが問題なし。

■ 原因

標準だとゲスト/ホストのCPUのマッピングが固定ではないためホストの各CPUを浅く広く使おうとするのだが、これが原因でゲスト側のスケジューリングに割り込みが発生しているのかもしれない。

上記は推測だが以下の対策を実施したところ(結果として)実際にプチフリが激減。

■ 対策

QEMUでCPU Pinnningの設定を行う。

以下は仮想マシンgtx970の論理コア0~7にホストの論理コア0~7を割り当てた例。

[kirine@office ~]$ sudo virsh vcpupin gtx970 0 0
[kirine@office ~]$ sudo virsh vcpupin gtx970 1 1
[kirine@office ~]$ sudo virsh vcpupin gtx970 2 2
[kirine@office ~]$ sudo virsh vcpupin gtx970 3 3
[kirine@office ~]$ sudo virsh vcpupin gtx970 4 4
[kirine@office ~]$ sudo virsh vcpupin gtx970 5 5
[kirine@office ~]$ sudo virsh vcpupin gtx970 6 6
[kirine@office ~]$ sudo virsh vcpupin gtx970 7 7

[kirine@office ~]$ sudo virsh vcpuinfo gtx970
VCPU:           0
CPU:            0
State:          running
CPU time:       1517.0s
CPU Affinity:   y-----------

VCPU:           1
CPU:            1
State:          running
CPU Affinity:   -y----------

VCPU:           2
CPU:            2
State:          running
CPU Affinity:   --y---------

VCPU:           3
CPU:            3
State:          running
CPU time:       952.1s
CPU Affinity:   ---y--------

VCPU:           4
CPU:            4
State:          running
CPU time:       1255.5s
CPU Affinity:   ----y-------

VCPU:           5
CPU:            5
State:          running
CPU time:       1231.2s
CPU Affinity:   -----y------

VCPU:           6
CPU:            6
State:          running
CPU time:       1305.4s
CPU Affinity:   ------y-----

VCPU:           7
CPU:            7
State:          running
CPU time:       1031.5s
CPU Affinity:   -------y----

永続化するにはvirsh edit仮想マシンの定義に以下の行を追加すること。

  <cputune>
    <vcpupin vcpu='0' cpuset='0'/>
    <vcpupin vcpu='1' cpuset='1'/>
    <vcpupin vcpu='2' cpuset='2'/>
    <vcpupin vcpu='3' cpuset='3'/>
    <vcpupin vcpu='4' cpuset='4'/>
    <vcpupin vcpu='5' cpuset='5'/>
    <vcpupin vcpu='6' cpuset='6'/>
    <vcpupin vcpu='7' cpuset='7'/>
  </cputune>

以上