multi_accept作用是让worker在一次事件循环中循环accept直至eagain,批量取空内核全连接队列;需配合epoll、reuseport、增大somaxconn及关闭accept_mutex才有效。

multi_accept 是 Nginx 的一个事件处理优化指令,用于控制 Worker 进程在收到内核 epoll(或 kqueue/select)通知有新连接到达时,是否尽可能多地一次性调用 accept(),把当前已排队的全部就绪连接都取出来,而不是每次只 accept 一个。
开启它有助于减少「惊群」效应(虽 Nginx 已用 accept_mutex 缓解),并提升高并发短连接场景下的吞吐效率。
确认 multi\_accept 所在配置位置
multi_accept 必须放在 events 块中,不能写在 http、server 或 location 里:
events {
use epoll; # 推荐显式指定(Linux)
worker_connections 10240;
multi_accept on; # ✅ 正确位置
}
开启 multi\_accept 的前提条件
要让 multi_accept on 实际生效,还需满足以下几点:
- Nginx 版本 ≥ 1.9.1(旧版本该指令存在但行为受限)
- 使用的事件模型支持批量 accept(如
epoll、kqueue;select和poll不支持) -
accept_mutex 默认为
on,无需关闭 ——multi_accept与之协同工作:mutex 保证只有一个 worker 竞争 accept,而 multi_accept 让它一次收完队列
验证是否生效(间接方式)
Nginx 没有直接暴露「本次 accept 了多少连接」的日志字段,但可通过以下方式侧面确认:
- 启用 debug 日志级别(需编译时含
--with-debug),搜索accept() not ready或accept() failed出现频率明显下降,说明 accept 更“积极”了 - 压测对比:使用
ab或wrk发起大量短连接(如-c 1000 -n 50000),观察Active connections波动更平滑、Accepts/Handled比值更接近 1(nginx -s status或 stub_status 模块) - 系统层面:检查
/proc/net/sockstat中timewait峰值更低,说明连接处理更及时
常见误区提醒
注意以下情况不会因 multi_accept on 改变行为:
- 它不增加连接队列长度 ——
net.core.somaxconn和listen ... backlog=才决定 TCP 全连接队列上限 - 它不绕过
accept_mutex,也不会导致多个 worker 同时 accept(那是旧版 Nginx 的问题,现已修复) - 如果后端是长连接(如 WebSocket、gRPC 流),效果不明显 —— 因为连接复用率高,新 accept 频次本身就不高











