Nginx高并发下应关闭accept_mutex并启用multi_accept on,配合epoll与worker_cpu_affinity实现进程隔离,避免锁争用和CPU缓存失效;同时合理限制文件描述符、精简模块以减少隐式竞争。

处理 Nginx 在高并发场景下的资源竞争,核心不是“消除竞争”,而是“规避竞争”——通过架构设计和配置隔离,让各工作进程尽量独立运行,不共享状态、不争抢锁、不频繁切换 CPU。真正的瓶颈往往不在 Nginx 代码层,而在系统级资源调度与内核行为上。
避免 accept 锁争用
Nginx 默认开启 accept_mutex,即多个 Worker 进程需排队获取新连接的接受权。在万级并发下,这个轻量锁会成为热点,造成 Worker 频繁等待和唤醒开销。
建议关闭它:
- 在
events块中设置accept_mutex off; - 同时启用
multi_accept on;,让每个 Worker 尽可能一次接收多个就绪连接 - 该组合仅在使用
epoll且内核支持边缘触发(ET)时安全高效
绑定 Worker 到专属 CPU 核心
Worker 进程在不同 CPU 核心间迁移,会导致 L1/L2 缓存失效,显著增加指令延迟。尤其在 NUMA 架构服务器上,跨节点访问内存还会引入额外延迟。
做法明确:
- 用
worker_cpu_affinity auto;(推荐,Nginx 1.12+ 支持自动适配) - 或手动指定,如 8 核机器:
worker_cpu_affinity 00000001 00000010 ... 10000000; - 配合
worker_processes auto;,确保进程数与物理核心数一致,避免超线程带来的伪并行干扰
隔离文件描述符与内存资源
资源竞争常源于“全局共享假象”:比如所有 Worker 共享同一套打开文件缓存、日志句柄或临时缓冲区,引发锁或内存争抢。
关键控制点:
-
worker_rlimit_nofile设为与系统nofile限制一致(如 65535),防止单个 Worker 因 fd 不足退化为阻塞式处理 - 启用
open_file_cache并合理设参:max=65535 inactive=30s min_uses=2,减少重复 open/close 系统调用 - 禁用
log_subrequest off;(默认关闭),避免子请求日志写入引发 I/O 竞争 - 若使用 proxy,为 upstream 单独配置
keepalive连接池,避免后端连接反复创建销毁
精简模块与关闭非必要功能
每个加载的模块都可能引入隐式锁或全局变量访问。例如 ngx_http_realip_module 在修改 client_addr 时会加锁;ngx_http_gzip_static_module 的文件存在性检查也可能触发 stat 竞争。
生产环境应:
- 编译时只启用必需模块(如去掉
--with-http_perl_module、--with-mail) - 关闭调试类指令:
debug_points abort;、error_log ... debug; - 静态资源服务场景下,关闭
ssi、perl、flv等低频功能 - 用
server_tokens off;减少响应头字段拼接开销(虽小,但高频下可测出差异)


















