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 的数字可能不变,但实际处理能力已经下降,容量规划需要两者都看。