multi_accept核心作用是让worker进程在一次事件循环中批量accept内核listen队列中所有就绪连接,减少系统调用与上下文切换;需配合epoll、足够大的somaxconn及worker_connections才生效。

multi_accept 的核心作用是让每个 worker 进程在一次事件循环中尽可能多地调用 accept(),把内核 listen 队列里所有已完成三次握手的连接一次性“捞完”,而不是默认的一次只取一个。这对压测中突发大量连接请求(比如 wrk 并发 10k+、秒杀流量涌入)特别有效——能明显缩短连接建立延迟,减少 accept 系统调用次数和上下文切换开销。
启用 multi_accept 的前提条件
它不是开就有效的开关,必须满足几个硬性基础:
- 事件模型必须是
epoll(Linux)或kqueue(FreeBSD),select/poll下完全无效; - 系统内核的
net.core.somaxconn值要足够大(建议 ≥65535),否则内核队列一满就丢连接,multi_accept 再快也无连接可取; - Nginx 的
listen指令最好显式加backlog=65535,与内核参数对齐; - 确保
worker_connections设置合理(如 65535),且系统级文件描述符限制(ulimit -n或systemd LimitNOFILE)不低于该值。
配置写法与位置
必须放在 events 块内,且紧邻 use epoll:
events {
use epoll;
multi_accept on;
worker_connections 65535;
}
注意:不要写成 multi_accept on; 单独一行却漏掉 use epoll,否则配置虽生效但实际不触发优化逻辑。
压测中验证是否真正起效
光改配置不够,得看实际行为:
- 用
strace -p $(pgrep nginx -f | head -1) -e trace=accept,accept4 -f在压测发起瞬间抓系统调用,如果看到连续多个accept4(…)=3(返回 fd)、=4、=5等密集输出,说明 multi_accept 已工作; - 对比开启前后,在相同 QPS 下观察
ab -n 10000 -c 2000 http://host/的 Connect time (ms) 平均值,通常可下降 10%–30%; - 检查
netstat -s | grep -i "listen overflows",数值不再增长,代表内核队列没再溢出丢连接。
搭配使用的增益组合
单独开 multi_accept 效果有限,需同步调整:
- 开启
reuseport(Nginx 1.9.1+,Linux 3.9+):让内核在多个 worker 间更公平分发新连接,避免单个 worker 队列积压; - 调高
net.ipv4.tcp_max_syn_backlog(尤其防 SYN Flood 场景); - 关闭
accept_mutex off(仅当已启用reuseport时才安全,否则可能引发惊群); - 配合
keepalive_timeout和keepalive_requests复用连接,减少新建压力。











