はじめに
実機のマシンに限りなく近い性能を出すためにGPU Passthrough、HugePageといった設定を行なってきた。CPU Pinningという手法を今回試してみる
CPU Pinningとは
物理マシンで12スレッドあり、仮想マシンに4スレッド割り当てた場合を考える。物理CPUの4スレッドだけを使用すると思ってしまうが、実際には12スレッドを満遍なく使用する。例えば2スレッド5台の場合には複数の仮想マシンの処理を同じ物理スレッドで行うためパフォーマンスが低下してしまう。
物理スレッドと仮想スレッドを1対1で固定するのがCPU Pinningである。
効果あるの?
MicrosoftのCpuStresを負荷確認に使用
https://docs.microsoft.com/ja-jp/sysinternals/downloads/cpustres
スレッドの効率をSandraでベンチマークした
https://www.sisoftware.co.uk/
設定前
親から見た使用状況。スレッドが4以上に分散していることがわかる
Sandraの結果
設定後
スレッドが4に固定されている
Sandraの結果。スレッド間の帯域幅が向上していることがわかる
基本的な設定方法
追記
ProxmoxVEのアップデートによりCUIでtasksetを実行するのと同じことがGUI上でできるようになったので、そちらの方法を推奨
仮想マシン起動後にホストの方で以下のようなコマンドを実行する
taskset --cpu-list --all-tasks --pid 固定するスレッド番号 プロセスID
スレッド番号は0始まりで12スレッドなら0〜11となる。数値を入力しても良いが、「0-3」等の範囲指定もできる。プロセスIDはVMのプロセスIDを指定する。
VMのプロセスIDは「/run/qemu-server/VM番号.pid」で取得できるので、4スレッド、VM番号107の場合は以下のコマンドとなる
taskset --cpu-list --all-tasks --pid 0-3 $(< /run/qemu-server/107.pid)