accept_mutex_delay 是 nginx 在 accept_mutex 启用时控制 worker 抢锁失败后休眠时长的参数,默认500ms;设太小致cpu空转,太大增连接延迟;建议初值50–200ms,短连接可降至10–30ms,禁设0;需配合 reuseport、multi_accept 等协同优化。

accept_mutex_delay 是 Nginx 中用于控制 accept_mutex 启用状态下,Worker 进程在抢不到连接锁时的等待时长。调优它,核心目标是减少无意义的空转(busy-loop),同时避免因等待过久导致连接处理延迟升高。
理解 accept_mutex_delay 的作用时机
当 accept_mutex on(默认开启)时,Nginx 采用“互斥抢锁”机制:只有一个 Worker 能调用 accept() 接收新连接,其他 Worker 抢锁失败后不会立即放弃,而是休眠 accept_mutex_delay 指定的时间(毫秒),再尝试抢锁。这个“休眠+重试”循环会持续到成功获取锁或被事件唤醒(如已有连接就绪)。
若该值设得太小(如 1ms),Worker 频繁重试、CPU 空转高;若设得太大(如 500ms),低流量下可能明显拖慢连接响应——尤其突发请求到来时,本可立刻处理的连接被迫多等一轮延迟。
合理设置 accept_mutex_delay 的参考值
- 默认值为 500ms,适用于大多数中低并发、网络延迟较稳定的场景,但对现代 SSD 服务器和高吞吐服务偏保守;
- 建议初值从 50ms~200ms 开始压测:在真实负载下观察
nginx -s reload后的worker_connections利用率、Active connections波动及 CPU idle 率; - 若业务为短连接密集型(如 API 网关、HTTP/1.1 大量小请求),可进一步降至 10ms~30ms,此时需配合
multi_accept off(避免单次抢锁后过度 accept); - 不建议设为 0:这会让失败 Worker 立即重试,退化为自旋等待,CPU 使用率飙升且无实际收益。
配合其他参数协同调优
单独调 accept_mutex_delay 效果有限,需与以下配置联动:
-
关闭 accept_mutex(高并发下更优):Linux 3.9+ 内核支持
SO_REUSEPORT,启用后每个 Worker 绑定独立 socket,天然免锁。只需在listen指令后加reuseport,并确保accept_mutex off; -
启用 multi_accept:设为
on可让抢到锁的 Worker 一次性accept多个就绪连接(依赖epoll ET模式),降低锁争抢频率; -
检查系统层面限制:确认
/proc/sys/net/core/somaxconn和net.core.netdev_max_backlog足够大,避免连接堆积掩盖锁竞争问题。
验证调优效果的方法
不能只看 CPU 或 QPS 数字,要抓关键指标:
- 用
pidstat -u -p $(pgrep nginx) 1观察各 worker 的 %usr 和 %wait,空转高通常表现为 %usr 持续 >80% 且无对应请求处理增长; - 通过
nginx stub_status查看Accepts / Handled / Requests三者比值:若Accepts >> Handled,说明大量连接被 accept 但未及时处理,可能是锁延迟或后端阻塞; - 用
perf record -e sched:sched_switch -p $(pgrep nginx)抓取调度事件,分析 worker 是否频繁在running → sleeping → running循环中切换。










