首页 » 博客 » PVE 绑定核心(CPU Pinning) [切换主题] [English] [繁體]

PVE 绑定核心(CPU Pinning)

使用 taskset 绑定 vCPU 线程


拓扑

9950X 是双 CCD(每颗 8 核 32MB L3),Linux 编号按 CCD 分组:

线程范围归属
0-7、16-23CCD0
8-15、24-31CCD1

lscpu -eCORE 列同值的两个 CPU 是同一物理核的双线程(如 0 和 16),L3 编号末位 0/1 就是 CCD 分组。绑定时把 vCPU 成对分到同一物理核的两个线程上,L3 共享。vCPU ≤ 16 的 VM 全塞一个 CCD,另一个留宿主;目前分配的 30 vCPU 超了单 CCD,只能按下面脚本成对绑后进虚拟机重新指定。

脚本


#!/bin/bash
VMID=101
# vCPU N → 物理线程 M;9950X 双 CCD:0-7+16-23=CCD0,8-15+24-31=CCD1
# 线程 15、31 留出给宿主
PIN_MAP=(
    "0:0" "1:1" "2:2" "3:3" "4:4" "5:5" "6:6" "7:7"
    "8:16" "9:17" "10:18" "11:19" "12:20" "13:21" "14:22" "15:23"
    "16:8" "17:9" "18:10" "19:11" "20:12" "21:13" "22:14"
    "23:24" "24:25" "25:26" "26:27" "27:28" "28:29" "29:30"
)
for map in "${PIN_MAP[@]}"; do
    vcpu="${map%:*}"
    pcpu="${map#*:}"
    tid=$(ps -eLo tid,comm | grep "CPU $vcpu/KVM" | awk '{print $1}')
    if [ -n "$tid" ]; then
        taskset -cp $pcpu $tid
    fi
done

逻辑三步:ps -eLo tid,comm 列线程 → grep "CPU $vcpu/KVM" 找对应 vCPU 线程(/KVM 后缀防止 CPU 1 误匹配 CPU 10)→ taskset -cp $pcpu $tid 钉核。VM 没开机时找不到线程会自动跳过。

使用


chmod +x /root/pin-vcpu.sh
bash /root/pin-vcpu.sh   # 确认 VM 开机后执行

验证


taskset -p $(ps -eLo tid,comm | grep 'CPU 0/KVM' | awk '{print $1}')

« NUT65 CU 返回主页