物理CPU个数等于/proc/cpuinfo中physical id去重后的数量,即执行cat /proc/cpuinfo | grep "physical id" | sort -u | wc -l所得结果;该方法最可靠,不受虚拟化或旧内核误导,而lscpu的“Socket(s)”字段在KVM/QEMU等环境中可能错误。

直接看 physical id 的去重数量,就是物理CPU个数;别信 nproc 或 lscpu 里“Socket(s)”字段的表面数字——某些虚拟化环境或旧内核会把它填错。
怎么准确数出物理CPU个数
物理CPU对应主板上的插槽(socket),每个插槽有唯一 physical id。关键不是看值本身,而是看有多少个不同的 physical id:
-
cat /proc/cpuinfo | grep "physical id" | sort -u | wc -l—— 最可靠,不依赖内核补丁或虚拟化层欺骗 -
lscpu | grep "Socket(s)"—— 多数情况可用,但在 KVM/QEMU 虚拟机、某些 ARM 服务器或老版内核中可能返回1即使实际是多路 - 错误做法:
grep "processor" /proc/cpuinfo | wc -l这只给逻辑CPU总数,和物理CPU无关
为什么 cpu cores 和 siblings 要一起看
cpu cores 是单颗物理CPU里的物理核心数,siblings 是同一颗物理CPU下的逻辑CPU数。两者比值直接暴露超线程状态:
- 如果
siblings == cpu cores:该物理CPU未启用超线程(HT) - 如果
siblings == cpu cores * 2:已启用超线程(常见于 Intel Xeon / Core 系列) - 如果
siblings == cpu cores * 4:可能是 AMD Zen 3+ 的 SMT 或特殊配置,需结合flags中是否有ht或smt - 注意:
cpu cores每行都一样,取任意一行的值即可;但siblings可能因 BIOS 设置不一致而出现多值,建议用sort -u去重后判断
top、htop 显示的“CPU”到底是什么
它们显示的是逻辑CPU个数,也就是 /proc/cpuinfo 中 processor 字段的总行数:
-
grep "processor" /proc/cpuinfo | wc -l—— 这个数字 =top里 CPU0、CPU1… 的最大编号 + 1 - 这意味着:一个 2 路 × 16 核 × HT 开启的机器,
top会显示 64 个 CPU 条目,但物理CPU只有 2 个、物理核心共 32 个 - 混淆点:
nproc输出的也是这个逻辑数,不是物理CPU个数;它等价于getconf _NPROCESSORS_ONLN,对调度器有意义,但对硬件评估没用
真正容易被忽略的是:同一台机器上不同内核版本或虚拟化平台对 physical id 的填充逻辑可能不一致——比如某些容器运行时会伪造该字段为 0。所以第一次查完,最好交叉验证 dmidecode -t processor | grep "Socket Designation"(需 root),虽然慢一点,但绕过了 procfs 的抽象层。


















