最直接可靠的方式是用lscpu命令,它明确列出socket(s)、core(s) per socket和thread(s) per core三个字段,物理核心总数=socket(s)×core(s) per socket,thread(s) per core为2表示启用超线程。

最直接可靠的方式是用 lscpu 命令,它把物理核心数、线程数、超线程开关状态全列清楚了,不用拼接、不易出错。
看 lscpu 输出里的三个关键字段
运行 lscpu 后重点关注:
- Socket(s):物理 CPU 插槽数(即实际插了几颗 CPU 芯片)
- Core(s) per socket:每颗物理 CPU 的真实核心数
- Thread(s) per core:每个物理核心能跑几个逻辑线程
物理核心总数 = Socket(s) × Core(s) per socket。
如果 Thread(s) per core 是 2,说明启用了超线程;如果是 1,说明没开。
从 /proc/cpuinfo 验证超线程是否启用
超线程的本质是:同一物理核心上出现多个逻辑 processor,但共享一个 cpu cores 计数。可以这样比对:
- 查每个物理 CPU 的核心数:
grep "cpu cores" /proc/cpuinfo | head -1(输出如cpu cores : 8) - 查每个物理 CPU 的逻辑线程数:
grep "siblings" /proc/cpuinfo | head -1(输出如siblings : 16)
如果 siblings 是 cpu cores 的 2 倍,就是开了超线程;相等就表示关闭。
快速算出物理核心总数(不依赖人工数)
避免手动统计 physical id 或 core id 出错,推荐用这一行命令:
lscpu | awk '/^Core\(s\) per socket:/ {cores=$4} /^Socket\(s\):/ {sockets=$2} END {print cores * sockets}'它自动提取并相乘,结果就是整机的物理核心总数,准确且可脚本化。
注意云主机的常见干扰项
有些云服务器显示 Socket(s): 2 但 NUMA node(s): 1,这是虚拟化层模拟的,不代表真有两颗物理 CPU。此时仍以 CPU(s)(逻辑核总数)和 Thread(s) per core 为准判断超线程状态,物理插槽数仅供参考,不必深究。











