首页/系统/Linux 内核与性能调优速查/nproc 可用处理单元数
CPU 与调度60 条

nproc 可用处理单元数

返回进程当前可用的处理单元数量(受亲和性与 cgroup 配额影响),是设置并发 worker 数的常用基准。

nproc 是什么

nproc 返回当前进程可用的处理单元数量,数据来自调度器的 CPU 亲和性设置,而不是硬件的核数。它会把亲和性掩码与容器的 CPU 限制一并体现出来:被绑定到两颗核上时只显示 2,加了 nproc --all 才显示系统全部核数。正因为语义贴近「这个进程实际能用多少 CPU」,它比读取硬件拓扑更适合作为并发度设置的基准,比如 make 的并行任务数、应用的工作进程数。

基本信息

适用平台Linux,coreutils 提供
数据来源调度器接口返回的可用 CPU 掩码
常用选项--all 显示全部处理单元,忽略亲和性限制
环境影响taskset 绑定与 cgroup 的 CPU 配置都会改变结果
对比命令lscpu 显示硬件拓扑,反映的是物理信息
典型用途为并发度设置提供基准,例如构建并行度与工作进程数

典型使用场景

  • 构建系统:按可用核数设定并行任务数,避免过度拆分
  • 应用调优:为线程池与工作进程数提供合理起点
  • 容器资源评估:确认容器内实际可见的 CPU 数量
  • 排查性能异常:发现可用核数少于预期时检查亲和性与配额
  • 自动化脚本:用返回值驱动并行度,而不是硬编码核数

常用写法

常用写法
nproc                                     # 当前可用的处理单元数
nproc --all                               # 忽略亲和性,显示全部
taskset -pc $$                            # 查看当前 shell 的亲和性掩码
cat /sys/fs/cgroup/cpu.max 2>/dev/null     # 容器 CPU 配额
lscpu | grep -E '^CPU\(s\)'                # 硬件层面的逻辑核总数
make -j"$(nproc)"                          # 用返回值设定并行度

数值差异对照

情形nproc 输出说明
普通物理机等于逻辑核总数与 lscpu 一致
绑定到部分核只显示被绑定的数量属预期行为,不是环境异常
容器有限额通常反映可见 CPU 数配额限制还会影响算力,需结合配额文件判断
nproc --all显示全部处理单元用于区分亲和性限制与硬件规模
多进程与多线程应用按 nproc 的返回值设定并发度最为稳妥:既不会因为硬编码核数而在小规格实例上过载,也不会在大规格实例上浪费算力。
容器场景要注意两个维度:可见 CPU 数决定进程能看到几个核,CPU 配额决定它能用多少算力。配额收紧时 nproc 的数字可能不变,但实际处理能力已经下降,容量规划需要两者都看。

易错点

  • 把 nproc 输出当硬件核数:它是按亲和性计算的可用数量,两者常常不等
  • 硬编码并行度:换规格后配置不再匹配,容易出现资源争抢或浪费
  • 忽略容器配额:可见核数正常但算力被限制,性能仍不达标
  • 用 taskset 绑定后误判环境异常:绑定导致数值变小属于预期行为
  • 在脚本里不做回退:极小规格实例上并行度设置过高会拖慢整体处理

数据来源与参考

  • man 1 nproc(coreutils)
  • man 2 sched_getaffinity
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌