nginx worker_processes 应设为物理核心数,非逻辑核数;通过 lscpu 查 socket(s) 和 core(s) per socket 相乘得物理核数;容器/k8s 中需以 cgroup 限制的 vcpu 数为准;老旧虚拟化环境需手动指定并启用 worker_cpu_affinity。

直接看物理核心数,别被超线程(HT)或逻辑核数带偏。Nginx 的 worker 进程是重量级的,绑在同一个物理核的两个逻辑线程上反而争抢缓存、降低性能。
查物理核心总数(关键!)
运行这条命令:
lscpu | grep -E "Core\(s\) per socket|Socket\(s\)"
输出类似:
Socket(s): 2
Core(s) per socket: 12
相乘得:2 × 12 = 24 个物理核心 → 这就是 worker_processes 的推荐起点。
查逻辑核数(仅作参考)
用下面任一命令看系统暴露了多少逻辑 CPU:
nproc
或
lscpu | grep "CPU(s):"
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
比如显示 CPU(s): 48,说明开启了超线程(24 物理核 × 2),但不建议直接设为 48——除非压测证实小包高并发场景下收益明显。
容器或 K8s 环境必须看实际分配
在 Docker 或 Kubernetes 中,auto 可能误读宿主机核数。要以 Pod 实际获得的 vCPU 为准:
cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us /sys/fs/cgroup/cpu/cpu.cfs_period_us 2>/dev/null | awk '{if(NR==1) q=$1; else p=$1} END {print int(q/p)}'
若结果是 4,就该配 worker_processes 4;,而不是看宿主机有 64 核。
老旧虚拟化或 OpenVZ 要特别注意
有些环境 nproc 固定返回 1,auto 会退化成单进程。此时必须手动覆盖,例如:
worker_processes 2;
并搭配 worker_cpu_affinity auto;(Nginx ≥ 1.9.10)确保绑定生效。










