核心是让每个worker进程绑定本地cpu核心与内存:先用lscpu和numactl确认numa拓扑,worker_processes设为单节点物理核数,worker_cpu_affinity按节点分段配置,numactl启动确保--cpunodebind与--membind一致,numastat验证local_node占比>95%。

优化 Nginx 高可用代理在多核环境下的处理能力,核心是让每个 worker 进程稳定运行在专属 CPU 核心上,并确保它只访问本地内存(尤其在 NUMA 架构下),同时避免系统级资源瓶颈。不能只调 Nginx 配置,必须软硬协同。
匹配 NUMA 拓扑,避免跨节点访问
双路或多路服务器常见但容易被忽略:CPU 插槽和内存是按节点(node)绑定的。若 worker 进程在 node 0 的 CPU 上运行,却从 node 1 的内存分配缓冲区,延迟会翻倍。
- 先执行 lscpu | grep -E "(Socket|NUMA)" 和 numactl --hardware,确认物理插槽数、每槽核心数、各 node 的 CPU 编号范围与内存容量
- BIOS 中必须关闭 Node Interleaving,否则 numactl 显示单节点,实际 NUMA 局部性已失效
- worker_processes 应设为单节点物理核心数(例如双路 32 核,每路 16 核 → 设 worker_processes 16),而非 auto 或总数
CPU 与内存同步绑定,不止靠 nginx 配置
仅用 worker_cpu_affinity 绑定 CPU 是不够的——Nginx 无法控制 malloc 分配的内存落在哪个 node。必须借助 numactl 启动。
- worker_cpu_affinity 按节点分段写:如 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
释放系统资源上限,支撑高并发连接
Nginx 的并发能力受限于操作系统层面的限制,配置再优也跑不满。
- 设置 worker_rlimit_nofile 65535,并在 /etc/security/limits.conf 中同步配 nginx soft nofile 65535、nginx hard nofile 65535
- 调大内核连接队列:sysctl -w net.core.somaxconn=65535、net.ipv4.tcp_max_syn_backlog=65535
- 启用 epoll(Linux 必选):use epoll; 放在 events 块内;multi_accept on; 允许单次事件循环接收多个连接
配合 Keepalived 实现真正高可用
Keepalived 负责 VIP 切换,但若 Nginx 本身未就绪,切换后仍不可用。
- Keepalived 的 health_check 脚本应检查 Nginx 进程 + 端口 + 关键 upstream 健康状态(如 curl -f http://127.0.0.1/health),不能只看进程是否存在
- Nginx 配置中开启 keepalive_requests 1000; 和 keepalive_timeout 60s;,减少 TCP 握手开销,提升长连接吞吐
- 避免在双节点上部署对称 Nginx 实例并共享同一 upstream:推荐单节点全量部署 + 外部 L4 负载(如 LVS 或云 LB)分发流量,规避跨 NUMA 内存争抢











