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