要让nginx在node部署中用满多核cpu,需手动绑定worker至单numa节点的专属物理核、本地内存及对应网卡队列,禁用auto进程数,配置numactl、多队列网卡、rps与轻量算法。

要让 Nginx 在 Node 部署中真正用满多核 CPU,关键不是堆进程数,而是让每个 worker 严格绑定专属物理核、本地内存和对应网卡队列,全程避免跨核调度与跨 NUMA 节点访问。自动配置容易出错,必须结合硬件拓扑手动对齐。
确认 NUMA 拓扑并锁定单节点资源
双路或多路服务器上,CPU 和内存按 node 绑定,跨 node 访问延迟翻倍:
- 运行 lscpu | grep -E "(Socket|NUMA)" 和 numactl --hardware,确认插槽数、每槽物理核数、各 node 的 CPU 编号范围与内存容量
- BIOS 中关闭 Node Interleaving,否则 NUMA 局部性失效
- worker_processes 设为单节点物理核数(例如双路 32 核,每路 16 物理核 → 设 16),禁用 auto(它只读总核数,无视 NUMA 边界)
绑定 CPU 与内存,杜绝软中断错位
仅靠 worker_cpu_affinity 不够,Nginx 无法控制 malloc 分配的内存位置:
- 按 node 分段写掩码:如 node 0 含 CPU 0–15,则 worker_cpu_affinity 0000000000000001 0000000000000010 ...(共 16 位)
- 修改 systemd 服务文件,ExecStart 改为:
/usr/bin/numactl --cpunodebind=0 --membind=0 /usr/sbin/nginx -g 'daemon on; master_process on;' - 验证命令:numastat -p $(pgrep nginx),要求 local_node > 95%,foreign ≈ 0
网卡与软中断必须同步对齐
单队列网卡会把所有中断压到一个 CPU,造成瓶颈:
- 用 ethtool -l eth0 查最大队列数,再执行 ethtool -L eth0 combined N(N = 单节点物理核数)启用多队列
- 开启 RPS:向 /sys/class/net/eth0/queues/rx-0/rps_cpus 写入十六进制掩码(如 16 核写 ffff)
- 运行 watch -n 1 'cat /proc/softirqs | grep NET_RX',确认各 CPU 的增长速率基本一致
- 确保软中断 CPU 列表与 Nginx worker 绑定的 CPU 完全重合,否则数据仍需跨核搬运
精简算法与连接模型,降低 CPU 无效开销
高 QPS 下,负载均衡算法本身吃 CPU,连接管理也影响吞吐:
- 优先选用 round-robin(轮询),仅计数器取模,开销最低;避免 ip_hash 或 hash $request_uri(万级 RPS 下可占 worker CPU 8%~20%)
- 关闭 accept_mutex(≥1.11.3 默认已关),开启 multi_accept on,让单 worker 一次处理多个新连接
- keepalive_timeout 设为 30~60 秒,搭配 keepalive_requests 1000~10000,防空闲连接长期占坑
- 压测时重点关注 top 中 worker 进程的 %CPU 和上下文切换次数,而非单纯看 QPS 数值











