0. 目次
1. 概要
Proxmox で NUMA チューニングをする方法についてまとめます。
2. 目的
2 socket 以上を持つコンピュータ上での仮想化において、NUMA を考慮した VM 配置にすることはパフォーマンスを改善する上で重要です。
しかしながら Proxmox の設定だけで完結した NUMA チューニングについてはインターネット上の情報が乏しかったため、備忘録として記事に残します。
3. 手順
kernel cmdline に default_hugepagesz を追加します。
今回はより TLB miss を減らしたかったため 1GB hugepage を用意しています。
# cat /etc/default/grub
~~~
GRUB_CMDLINE_LINUX_DEFAULT="quiet elevator=deadline cpufreq.default_governor=performance default_hugepagesz=1G"
~~~
# update-grub
# reboot
3.2 hugepage の設定
https://github.com/akam1o/hugepages-reserve-service
deb パッケージをインストール
設定ファイルを書き換え
# cat /etc/hugepages.conf
node0 1G 72
node1 1G 72
hugepage service enable/start
# systemctl enable hugepages-reserve.service
# systemctl start hugepages-reserve.service
確認
# cat /proc/meminfo | grep Huge
AnonHugePages: 24576 kB
ShmemHugePages: 0 kB
FileHugePages: 0 kB
HugePages_Total: 144
HugePages_Free: 144
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 1048576 kB
Hugetlb: 150994944 kB
3.3 VM への設定
qm set コマンドを用いて NUMA チューニングを入れていく
対象の VM は 6core 24GB
node0 側
# qm set 101 --numa 1 --numa0 cpus=0-5,memory=24576,hostnodes=0,policy=preferred --cpu host --hugepages 1024
node1 側
# qm set 102 --numa 1 --numa0 cpus=0-5,memory=24576,hostnodes=1,policy=preferred --cpu host --hugepages 1024
引数の説明
--numa: VM の NUMA node の数、SMP としたいので 1 としている
--numa0: VM の numa0 側の設定
cpus: node あたりの cpu 数
memory: node あたりの memory GB
hostnodes: VM の起動させるホストの NUMA node を設定する
policy: メモリの割当ポリシー、通常は preferred で問題ない
--cpu: host passthrough としたいので host を指定
--hugepages: hugepage サイズ、今回は 1GB なので 1024 を指定
3.5 VM を pinning したい場合
さらに CPU コアで pinning したい場合、affinity の設定を行う
affinity を設定する場合は、CPU の sibling や NUMA を意識して設定する
sibling の確認
# cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | sort -n | uniq
0,24
1,25
2,26
3,27
4,28
5,29
6,30
7,31
8,32
9,33
10,34
11,35
12,36
13,37
14,38
15,39
16,40
17,41
18,42
19,43
20,44
21,45
22,46
23,47
NUMA の確認
# numactl -H
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 24 25 26 27 28 29 30 31 32 33 34 35
node 0 size: 96256 MB
node 0 free: 52015 MB
node 1 cpus: 12 13 14 15 16 17 18 19 20 21 22 23 36 37 38 39 40 41 42 43 44 45 46 47
node 1 size: 96756 MB
node 1 free: 93321 MB
node distances:
node 0 1
0: 10 21
1: 21 10
今回の例では numa0 側は 3-5,27-29, numa1 側は 15-17,39-41 として設定
qm set コマンド
numa0 側の VM
# qm set 101 --affinity 3-5,27-29
numa1 側の VM
# qm set 102 --affinity 15-17,39-41
まとめて下記のように設定もできる
# qm set 101 --numa 1 --numa0 cpus=0-5,memory=24576,hostnodes=0,policy=preferred --cpu host --hugepages 1024 --affinity 3-5,27-29
# qm set 102 --numa 1 --numa0 cpus=0-5,memory=24576,hostnodes=1,policy=preferred --cpu host --hugepages 1024 --affinity 15-17,39-41
⚠️ 注記
通常、VM を CPU pinning をする場合には isolcpus, nohz_full, rcu_nocbs を設定することが多いが、Proxmox でこの設定を入れたところ、VM に不具合が出たため意図的に設定していません
4. 結果
起動してくるマシン構成
numa0 側
# cat /etc/pve/qemu-server/101.conf
affinity: 3-5,27-29
boot: order=scsi0
cipassword: xxxxxx
ciuser: xxxxxx
cores: 6
cpu: host
hugepages: 1024
ide2: data1:vm-101-cloudinit,media=cdrom,size=4M
ipconfig0: ip=xxxxxx,gw=xxxxxx
memory: 24576
meta: creation-qemu=9.2.0,ctime=1750411305
name: xxxxxx
net0: virtio=xxxxxx,bridge=xxxxxx
numa: 1
numa0: cpus=0-5,memory=24576,hostnodes=0,policy=preferred
scsi0: data1:vm-101-disk-0,size=100G
scsihw: virtio-scsi-pci
smbios1: uuid=xxxxxx
sockets: 1
vmgenid: xxxxxx
numa1 側
# cat /etc/pve/qemu-server/102.conf
affinity: 15-17,39-41
boot: order=scsi0
cipassword: xxxxxx
ciuser: xxxxxx
cores: 6
cpu: host
hugepages: 1024
ide2: data2:vm-102-cloudinit,media=cdrom,size=4M
ipconfig0: ip=xxxxxx,gw=xxxxxx
memory: 24576
meta: creation-qemu=9.2.0,ctime=1750411305
name: xxxxxx
net0: virtio=xxxxxx,bridge=xxxxxx
numa: 1
numa0: cpus=0-5,memory=24576,hostnodes=1,policy=preferred
scsi0: data2:vm-102-disk-0,size=100G
scsihw: virtio-scsi-pci
smbios1: uuid=xxxxxx
sockets: 1
vmgenid: xxxxxx