首页 > Sysadmin > 正文

Linux 查看 CPU 核心数:4 条命令

huyuanwen 2026-10-26 Sysadmin

决定编译并发数、配置线程池大小,或者想确认容器实际拿到了几核,先要弄清当前机器有什么。Linux 上常用的 4 种方法,各自返回的数字并不通用。

1. nproc:输出的是“可用”,不是总数

裸 nproc 打印当前进程可用的处理单元数,可能少于在线 CPU 数(nproc 手册)。CPU 亲和性、容器限制(cgroups)都会让它偏小(Linuxize),环境变量 OMP_NUM_THREADS、OMP_THREAD_LIMIT 则分别决定返回值的最小值和最大值(nproc 手册)。“nproc 显示核心总数”的旧解读已过时,coreutils 9.11 手册的定义即为现行定义(引入版本资料未说明)(nproc 手册)。要已安装总数用 nproc --all,它无视 OpenMP 变量和 CPU 配额;nproc --ignore=N 可少数 N 个,结果至少为 1(nproc 手册)。

2. lscpu:要数物理核,看它

lscpu 给出 CPU 数、线程数、核数、插槽数等汇总,物理核心数按 Core(s) per socket × Socket(s) 计算;多路机器可直接用 lscpu -p=SOCKET,CORE | grep -v '^#' | sort -u | wc -l 数(Linuxize)。虚拟机里它反映的是客户机配置,通常和物理宿主机不同(lscpu 手册)。分节展示是 util-linux 2.39 引入的:终端里默认分节,管道里平铺,可用 --hierarchic=always 强制分节,2.39 之前的版本只有平铺格式(Linuxize)。取机器可读结果用 -J 输出 JSON(lscpu 手册)。

3. /proc/cpuinfo:数逻辑线程数

内核按逻辑处理器逐条生成该文件,grep -c 'model name' /proc/cpuinfo 数出的是逻辑线程数(Linuxize)。model name 字段在 ARM 等架构上可能不存在,这样数并不可移植;x86 上可见的 cpu cores、physical id 也只反映单颗物理处理器,全系统物理核数与拓扑仍用 lscpu(Linuxize)。

4. top:逐核实时状态

运行 top 后按 1,汇总的 %Cpu(s) 单行会切换成 %Cpu0、%Cpu1……逐核显示,展开到屏幕高度为止(top 手册)。需要把输出转给其他程序或文件时用 -b 批处理模式(top 手册)。

容器里看到的数字

容器以 --cpus="1.5" 启动(等价于 --cpu-period=100000 + --cpu-quota=150000),容器内裸 nproc 的输出就受该配额约束(Docker Docs),你拿到的是配额数而非硬件数;要无视配额取已安装处理器数,用 nproc --all(nproc 手册)。

数逻辑线程用 nproc,数物理核用 lscpu,看逐核实时状态用 top。

说明:文中命令与参数均逐项对照上述官方手册与文档核查过,未在固定测试环境逐条实际执行,使用前请在你自己的机器上验证。