CPU Pinningとは
プロセスに割り当てるコアを限定することでパフォーマンスの向上を図ること。仮想マシンが複数相乗りするProxmox VEの場合、各VMが全体のコアをばらばらに参照するのではなくコアをきっちり分けた方がCPUのキャッシュが効率的に機能しやすい。またAMDのRyzenの場合複数CCXのモデルが存在し(59XX、79XX等)CCXを跨ぐと遅延が出やすいため、その場合にも有効ではないかと考えられる(要検証)
この設定はそのプロセスに対して設定されているだけであり、他のプロセスにとっては排他的になっているわけではないので他にPinningされていないVMがある場合はそのコアは使われてしまう点注意
コアのID等確認
cat /proc/cpuinfoでCPUの各コアの番号を確認できるが見づらいので、awkスクリプトを作成した。
gawk -F'[\t]*: ' '/^physical id/ {ps_id=$2} /^processor/ {id=$2} /^core id/ {core_id=$2} /^$/ {printf "physical:%s\tcore:%s\tid:%s\n",ps_id,core_id,id}' /proc/cpuinfo
実行すると下記のように出力される(AMD Ryzen 5700Xの場合)
このCPUはCCXは1つ、物理コアは8つである。16スレッドの内14スレッドをVMに割り当てる。使用するコア番号は1〜7にした。隣のid列の番号で1〜7、9〜15が今回の利用対象となる
physical:0 core:0 id:0
physical:0 core:1 id:1
physical:0 core:2 id:2
physical:0 core:3 id:3
physical:0 core:4 id:4
physical:0 core:5 id:5
physical:0 core:6 id:6
physical:0 core:7 id:7
physical:0 core:0 id:8
physical:0 core:1 id:9
physical:0 core:2 id:10
physical:0 core:3 id:11
physical:0 core:4 id:12
physical:0 core:5 id:13
physical:0 core:6 id:14
physical:0 core:7 id:15
VMへの設定
管理画面で設定。CPUアフィニティという欄で範囲指定に"-"と","が使用できる
反映しているかの確認
VMのプロセスIDをまず特定する。引数にVMの名前が含まれているので、それを元に抽出。
root@sv01:~# ps ax | grep Windows10-Game
929664 ? SLl 5:21 /usr/bin/kvm -id 107 -name Windows10-Game,debug-threads=on -no-shutdown -chardev socket,id=qmp,path=/var/run/qemu-server/107.qmp,server=on,wait=off -mon chardev=qmp,mode=control -chardev socket,id=qmp-event,path=/var/run/qmeventd.sock,reconnect=5 -mon chardev=qmp-event,mode=control
混じっているが、/usr/bin/kvmのプロセスが該当のもの。この場合idは929664。
次にpinningの設定を確認する
root@sv01:~# taskset -p 929664
pid 929664's current affinity mask: fefe
fefe
となっている部分は16進数で、これを2進数にしたものが設定となる。変換サイトを利用して、1111111011111110
ということがわかる。値は後ろから順番に並んでいる(一番右がid0で一番左がid15)
試しにaffinityの欄を消して、再起動したところ下記の通り全体指定となった
root@sv01:~# taskset -p 926835
pid 926835's current affinity mask: ffff