akam1oの日記

クラウドを作るお仕事をしています

Proxmox で NUMA チューニングされた VM を作成する

0. 目次

1. 概要

Proxmox で NUMA チューニングをする方法についてまとめます。

2. 目的

2 socket 以上を持つコンピュータ上での仮想化において、NUMA を考慮した VM 配置にすることはパフォーマンスを改善する上で重要です。 しかしながら Proxmox の設定だけで完結した NUMA チューニングについてはインターネット上の情報が乏しかったため、備忘録として記事に残します。

3. 手順

3.1 grub の変更

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