nodejs获取可用cpu数
os.availableParallelism()
是 Node.js 20.3.0 及以上版本提供的 API,用于获取系统当前可用的并行计算单元数量。以下是详细说明:
功能特性
-
动态检测
返回系统当前可用的逻辑 CPU 核心数,可能受以下因素影响:- 进程的 CPU 亲和性设置(如通过
taskset
绑定核心) - 容器化环境的资源限制(如 Docker 的
--cpus
参数) - 云环境的资源配额
- 进程的 CPU 亲和性设置(如通过
-
与
os.cpus().length
的区别os.cpus().length
:返回物理机的全部逻辑核心数os.availableParallelism()
:返回当前环境实际可用的核心数
使用场景
const os = require('os');// 动态配置线程池大小
const workerPoolSize = os.availableParallelism();
console.log(`建议使用 ${workerPoolSize} 个工作线程`);// 容器化部署时验证资源限制
if (workerPoolSize < 4) {console.warn('警告:可用 CPU 核心不足,可能影响性能');
}// 负载均衡策略
const tasksPerWorker = Math.ceil(totalTasks / workerPoolSize);
示例输出
环境场景 | os.cpus().length | os.availableParallelism() |
---|---|---|
物理机(16 核) | 16 | 16 |
Docker 限制 4 核 | 16 | 4 |
AWS Lambda(2 vCPU) | 2 | 2 |
taskset -c 0-3 绑定 | 16 | 4 |
兼容性处理
// 安全访问建议
const availableCores = typeof os.availableParallelism === 'function' ? os.availableParallelism() : os.cpus().length;// 最低保障策略
const MAX_WORKERS = Math.max(availableCores, 2); // 至少 2 个线程
底层原理
-
Linux/macOS
通过sched_getaffinity
系统调用获取进程绑定的 CPU 掩码 -
Windows
使用GetProcessAffinityMask
API 检测可用处理器 -
容器环境
自动识别 cgroups v1/v2 的 CPU 配额限制
性能建议
-
I/O 密集型任务
建议使用2 * availableParallelism()
个线程 -
CPU 密集型任务
直接使用availableParallelism()
作为线程池大小 -
混合型任务
动态调整:Math.max(availableParallelism(), 4)
通过合理使用此 API,可以实现以下优化:
- 避免在资源受限环境中创建过多线程
- 提升容器化部署的资源利用率
- 增强跨平台部署的一致性
建议配合 process.resourceUsage()
监控实际资源消耗。