Nginx高性能关键在于避免进程间同步:一、关闭accept_mutex并启用multi_accept;二、绑定CPU核心隔离资源争抢;三、同步调优系统级资源(文件描述符、连接队列、TIME_WAIT复用)及使用epoll。

Nginx 本身不依赖进程间同步来处理高并发请求——这恰恰是它高性能的关键设计。它的 Worker 进程彼此完全独立,无共享内存、无锁竞争、不通信协作,因此不存在传统意义上的“进程间同步瓶颈”。所谓“优化同步”,其实是误读;真正要做的,是避免同步、消除争抢、让各 Worker 独立高效运转。
下面从三个关键方向说明怎么做:
一、关掉 accept_mutex(取消连接接收互斥锁)
默认情况下,Nginx 启用 accept_mutex on,即多个 Worker 进程需排队争抢新连接的 Accept 权限。这在低并发时可减少惊群(thundering herd),但高并发下反而造成等待和延迟。
✅ 正确做法:
events {
accept_mutex off; # 关闭互斥锁
multi_accept on; # 允许单次事件循环接收多个新连接
}-
accept_mutex off让所有 Worker 同时监听并尝试接受新连接(Linux 内核已支持 SO_REUSEPORT 或 epoll 边缘触发 + EPOLLEXCLUSIVE,能安全分发) -
multi_accept on配合使用,使每个 Worker 在一次事件循环中尽可能多地建立连接,提升吞吐
⚠️ 注意:需确保内核 ≥ 3.9(支持 SO_REUSEPORT)或 Nginx ≥ 1.9.1(对 epoll 的优化更完善)
二、绑定 CPU 核心,隔离资源争抢
Worker 进程若在不同 CPU 核心间频繁迁移,会导致 L1/L2 缓存失效、TLB 刷新、上下文切换开销剧增,间接引发“伪同步等待”。
✅ 正确做法:
worker_processes auto; worker_cpu_affinity auto; # 推荐(Nginx 1.12.2+ 自动适配 NUMA) # 或手动指定(如 4 核): # worker_cpu_affinity 0001 0010 0100 1000;
-
auto模式会为每个 Worker 分配独占核心,并避开跨 NUMA 节点访问内存 - 避免多个 Worker 挤在同一个核上,也避免一个 Worker 被调度到不同核来回跳
三、确保系统级资源不成为隐性“同步点”
即使 Nginx 内部无同步,外部系统限制(如文件句柄、连接队列、TIME_WAIT 复用)一旦不足,就会让所有 Worker 卡在相同系统调用上,形成事实上的串行阻塞。
✅ 必须同步调整以下三项(缺一不可):
-
文件描述符上限
# 系统级(/etc/security/limits.conf) * soft nofile 100000 * hard nofile 100000
# Nginx 配置中声明 worker_rlimit_nofile 100000;
-
内核连接队列
# 提升全连接队列(避免 SYN 放弃) echo 65535 > /proc/sys/net/core/somaxconn # 启用 TIME_WAIT 套接字快速复用(仅客户端地址唯一时安全) echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse echo 1 > /proc/sys/net/ipv4/tcp_timestamps # tcp_tw_reuse 依赖此
-
事件模型必须用 epoll
events { use epoll; # Linux 下唯一推荐,O(1) 复杂度,无轮询开销 }
不复杂但容易忽略


















