在 Linux 系统中,vCPU(虚拟 CPU)与物理核心的映射关系取决于虚拟化环境(如 KVM、VMware、Xen 等)以及 guest 操作系统内部的配置。以下是几种常用方法:
✅ 方法一:使用 lscpu(推荐)
lscpu | grep -E "Socket|Core|Thread|CPU(s)"
输出示例:
Architecture: x86_64
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
Core(s) per socket: 2
Socket(s): 2
NUMA node(s): 1
Vendor ID: GenuineIntel
- 关键信息:
Socket(s):物理插槽数Core(s) per socket:每个插槽的物理核心数CPU(s):当前系统识别的总 vCPU 数(可能包含超线程或 SMT)- 若
Thread(s) per core > 1,说明启用了超线程(SMT),此时一个物理核可模拟多个逻辑处理器。
⚠️ 注意:在虚拟机中,
lscpu显示的是 guest 视角 的逻辑拓扑,不一定反映宿主机真实物理结构。例如,宿主机是 2 核 4 线程,但 VM 可能被配置为 4 vCPU(对应 2 物理核 + 超线程)。
✅ 方法二:查看 /proc/cpuinfo
grep -E "physical id|core id|siblings|processor" /proc/cpuinfo | paste - - - - | sort -u
更直观的方式(逐行分析):
for i in $(seq 0 $(($(nproc)-1))); do
echo "vCPU $i:"
grep -E "^(processor|core id|physical id)$" /proc/cpuinfo | sed -n "$((i*3+1)),$((i*3+3))p"
done
physical id:对应物理 CPU 插槽(socket)core id:该 vCPU 所在的物理核心编号processor:vCPU 编号(逻辑 CPU)
👉 通过统计相同 physical id + core id 的组合数,可判断哪些 vCPU 共享同一物理核心。
✅ 方法三:结合宿主机信息(需 host 权限)
如果你能访问宿主机(如 KVM/QEMU),可在 host 端 执行:
# 查看宿主机真实拓扑
lscpu -e | awk '{print $1, $2, $3}' | head
# 或使用 virsh 查看 VM 配置
virsh dominfo <vm-name>
virsh vcpuinfo <vm-name>
virsh vcpuinfo 会列出每个 vCPU 绑定的宿主节点(numa/node)和亲和性设置,有助于判断是否跨核/跨 socket。
🔍 补充说明
| 场景 | 说明 |
|---|---|
| 未启用超线程 | 1 vCPU ≈ 1 物理核心(理想情况) |
| 启用超线程 | 1 物理核 → 2 vCPU(逻辑线程),Thread(s) per core = 2 |
| NUMA 绑定 | vCPU 可能固定在某 NUMA 节点,影响性能 |
| 容器环境(Docker/Podman) | 通常只看到分配的 vCPU 数,无法直接获知底层物理映射(依赖 cgroup + host 配置) |
🛠️ 实用脚本:统计每核上的 vCPU 数量
#!/bin/bash
declare -A core_map
while IFS= read -r line; do
if [[ $line =~ ^processor ]]; then
vcpu=${line##*: }
elif [[ $line =~ ^core id ]]; then
core=${line##*: }
elif [[ $line =~ ^physical id ]]; then
socket=${line##*: }
key="${socket}-${core}"
((core_map[$key]++))
fi
done < /proc/cpuinfo
echo "物理核心 -> vCPU 数量分布:"
for key in "${!core_map[@]}"; do
printf "%s: %d vCPUsn" "$key" "${core_map[$key]}"
done
如你有具体虚拟化平台(如 VMware ESXi、OpenStack、KubeVirt)或想进一步分析性能瓶颈,可提供更多信息,我可给出针对性建议。
PHPWP博客