用于将 PVE 虚拟机 vCPU 锁定到物理 CPU
-
自动 NUMA 绑定
虚拟机 vCPU 会完全绑定到对应 NUMA 节点上的核心
防止跨 NUMA 访问内存
-
核心绑定
使用 虚拟机 ID (VM ID) 作为随机数种子, 随机绑定到物理核心, 避免多个虚拟机全部分配到靠前的 CPU 物理核心
超线程核心不会被绑定, 请开启虚拟机超线程后使用超线程绑定
-
超线程绑定
将虚拟机的一对超线程核心绑定到物理的一对超线程核心
避免宿主机调度器将两个 vCPU 线程 (物理核心) 分配到同一个物理核心的超线程核心
避免虚拟机认为两个核心都是完整核心, 优化虚拟机调度
需要手动写配置文件, PVE Web-UI 暂时不支持
bash <(curl -sSL "https://gitlab.com/CoiaPrant/pve-vcpu-pinning/-/raw/master/scripts/install.sh") # 安装
bash <(curl -sSL "https://gitlab.com/CoiaPrant/pve-vcpu-pinning/-/raw/master/scripts/update.sh") # 升级
bash <(curl -sSL "https://gitlab.com/CoiaPrant/pve-vcpu-pinning/-/raw/master/scripts/uninstall.sh") # 卸载
# 设置虚拟机
qm set <VMID> --hookscript local:snippets/pve-vcpu-pinning不需要此工具
affinity: 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63
cores: 32
memory: 32768
numa: 1
numa0: cpus=0-31,memory=32768,hostnodes=1,policy=bind
sockets: 1虚拟机 32 核心 32 线程 32 GB 内存分配在 NUMA 1 上
vCPU 线程由 pve-vcpu-pinning 自动锁定
其他线程 (例如 I/O 线程) 由 CPU 亲和性锁定到 NUMA 1
cores: 32
memory: 65536
numa: 1
numa0: cpus=0-31,memory=32768,hostnodes=1,policy=bind
numa1: cpus=32-63,memory=32768,hostnodes=0,policy=bind
sockets: 2虚拟机 2 节点 NUMA, 每个节点 32 核心 32 线程 32 GB 内存
vCPU 线程由 pve-vcpu-pinning 自动锁定
其他线程 (例如 I/O 线程) 由内核调度器决定
直接使用本工具即可, 虚拟机核心数不得超过物理核心数
args: -smp 16,sockets=1,cores=8,threads=2,maxcpus=16
cores: 16
sockets: 1虚拟机 8 核心 16 线程
vCPU 线程由 pve-vcpu-pinning 自动锁定
affinity: 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63
cores: 16
memory: 32768
numa: 1
numa0: cpus=0-15,memory=32768,hostnodes=1,policy=bind
sockets: 1虚拟机 16 核心 16 线程 32 GB 内存分配在 NUMA 1 上
vCPU 线程由 pve-vcpu-pinning 自动锁定
其他线程 (例如 I/O 线程) 由 CPU 亲和性锁定到 NUMA 1
affinity: 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63
args: -smp 32,sockets=1,cores=16,threads=2,maxcpus=32
cores: 32
memory: 32768
numa: 1
numa0: cpus=0-31,memory=32768,hostnodes=1,policy=bind
sockets: 1虚拟机 16 核心 32 线程 32 GB 内存分配在 NUMA 1 上
vCPU 线程由 pve-vcpu-pinning 自动锁定
其他线程 (例如 I/O 线程) 由 CPU 亲和性锁定到 NUMA 1
cores: 16
memory: 65536
numa: 1
numa0: cpus=0-15,memory=32768,hostnodes=1,policy=bind
numa1: cpus=16-31,memory=32768,hostnodes=0,policy=bind
sockets: 2虚拟机 2 节点 NUMA, 每个节点 16 核心 16 线程 32 GB 内存
vCPU 线程由 pve-vcpu-pinning 自动锁定
其他线程 (例如 I/O 线程) 由内核调度器决定
args: -smp 64,sockets=2,cores=16,threads=2,maxcpus=64
cores: 32
memory: 65536
numa: 1
numa0: cpus=0-31,memory=32768,hostnodes=1,policy=bind
numa1: cpus=32-63,memory=32768,hostnodes=0,policy=bind
sockets: 2虚拟机 2 节点 NUMA, 每个节点 16 核心 32 线程 32 GB 内存
vCPU 线程由 pve-vcpu-pinning 自动锁定
其他线程 (例如 I/O 线程) 由内核调度器决定
PVE 暂时不支持 pxb-pcie 设备, 无法为 PCIe 设备设置 NUMA
推荐将虚拟机固定到 PCIe 设备同 NUMA, 不要跨 NUMA
GPU 在哪个 NUMA 就分配到哪个 NUMA, 网卡和存储可以跨 NUMA (吞吐量大的优先, 其次延迟敏感的优先)