CPUInfo核心数与线程数解析
一 关键概念与关系
- 物理CPU(Socket):主板上实际的CPU芯片个数,对应/proc/cpuinfo中的physical id。
- 物理核心(Core):单个物理CPU内部的处理单元个数,对应cpu cores与core id。
- 逻辑处理器(Logical CPU/线程):操作系统可见的处理单元,对应processor;若启用超线程(HT/SMT),通常线程数 = 核心数 × 2。
- 常用关系:
- 总物理核心数 = Socket(s) × Core(s) per socket
- 总逻辑CPU数(线程数) = Socket(s) × Core(s) per socket × Thread(s) per core
- 术语对照:日常说的“几核几线程”里,“几线程”指的就是逻辑CPU数。
二 在 Linux 中从 cpuinfo 读取与计算
- 统计与含义一览:
- 查看逻辑CPU数(总线程数):
cat /proc/cpuinfo | grep -i "processor" | wc -l
- 查看物理CPU数(插槽数):
cat /proc/cpuinfo | grep "physical id" | sort -u | wc -l
- 查看每颗物理CPU的物理核心数:
cat /proc/cpuinfo | grep "cpu cores" | uniq
- 查看每颗物理CPU的逻辑处理器数:
cat /proc/cpuinfo | grep -i "siblings" | uniq
- 辅助判断是否启用超线程:比较同一物理CPU的siblings与cpu cores,若siblings > cpu cores则已启用超线程;或检查flags是否含ht。
- 交叉校验与计算示例:
- 若
Socket(s)=2、Core(s) per socket=8、Thread(s) per core=2,则:
- 总物理核心数 = 2 × 8 = 16
- 总逻辑CPU数 = 2 × 8 × 2 = 32(即32线程)
- 快速命令汇总:
lscpu:直接查看CPU(s)、Core(s) per socket、Socket(s)、Thread(s) per core等字段,便于核对上述计算。
三 读懂关键字段与判断超线程
- 字段释义:
- processor:逻辑处理器的唯一编号(从0开始)。
- physical id:物理封装(插槽)的唯一编号。
- core id:同一物理CPU内物理核心的唯一编号。
- cpu cores:该物理CPU内的物理核心数量。
- siblings:该物理CPU内的逻辑处理器数量。
- flags:功能标志,含ht表示支持超线程。
- 判断要点:
- 同一physical id下的不同processor属于同一颗物理CPU。
- 同一physical id且同一core id的多个processor通常就是同一物理核心的超线程伙伴。
- 若对每个物理CPU都有siblings == cpu cores,则未启用超线程;若siblings > cpu cores,则已启用超线程。
四 快速示例与常见误区
- 示例解读:
- 命令输出:
physical id有0、1两种、processor共32个、cpu cores=8、siblings=16
- 结论:物理CPU数2,每颗8核,每核2线程,总逻辑CPU数32,即2路 8核 16线程/每CPU,合计32线程。
- 常见误区:
- “逻辑CPU=线程数”,不要把逻辑CPU误称为“核”。
- **“几路几核几线程”**需同时给出三要素:物理CPU数、物理核心数、线程数。
- 超线程并非性能翻倍:它提升的是资源利用率,受工作负载类型与并行度影响,很多场景达不到2倍加速。