在Nginx的事件模块配置中,multi_accept是一个容易被忽略却直接影响连接处理效率的指令。它的核心作用是告诉每个worker进程,当某个监听端口的socket变为可读(即有新连接到达)时,是否要连续调用accept系统调用,把内核全连接队列里当前所有等待的连接一次性取走,而不是只取一个就返回事件循环。这种行为本质上是在事件驱动模型和系统调用开销之间做权衡。

multi_accept的工作原理与内核交互
要理解multi_accept为什么能影响性能,必须先看Nginx如何使用epoll等多路复用机制。在典型的Linux环境中,Nginx为每个worker创建一个epoll实例,并将监听socket加入兴趣列表。当客户端发起TCP连接,经过三次握手后,内核将该连接放入监听socket的全连接队列(accept queue),同时触发epoll的可读事件。此时worker从epoll_wait返回,进入事件处理函数。
如果multi_accept被设置为off(默认值),Nginx在处理该监听事件时只会调用一次accept,取走队列里的一个连接,然后立即返回事件循环,等待下一次epoll_wait。这意味着如果瞬间有大量连接到达,虽然它们都在内核队列里,但Nginx需要多次被唤醒才能逐个处理。若设置为on,worker会在同一个事件周期内循环调用accept,直到队列为空或者遇到EAGAIN错误才退出循环,从而减少事件触发次数和系统调用切换。
这种机制与epoll的工作模式也有关系。在边缘触发(ET)模式下,事件只在状态变化时通知一次,如果不一次取完就容易遗漏;而Nginx默认多用水平触发(LT),所以即便不开启multi_accept也不会丢连接,只是效率不同。内核参数如net.core.somaxconn和listen指令的backlog参数决定了队列长度,当队列较长且突发流量高时,开启multi_accept能更快清空队列,降低客户端连接延迟。
开启与关闭的性能对比及适用场景
从实测角度看,multi_accept on在短连接、高并发的API或静态资源服务中往往带来明显收益。比如一个每秒数万次请求的HTTP接口,连接建立后迅速返回并关闭,开启后worker能批量收连接,减少epoll_wait的返回次数,CPU用在业务处理的时间比例上升。以下是一个简单的压测对照思路,可用wrk工具模拟:
然而对于长连接或耗时任务,例如WebSocket、大文件下载、反向代理慢后端,开启multi_accept可能让某个worker在瞬间卷入大量连接,导致该进程负载陡增,而其他worker相对空闲,出现负载倾斜。因为Nginx的accept锁(accept_mutex)在早期版本用于平衡,但新版默认关闭,配合multi_accept on更容易出现“一个进程忙死”的情况。因此是否开启应结合业务连接特征判断。
events {
# 开启一次接受多个连接
multi_accept on;
# 使用epoll驱动
use epoll;
# 每个worker的连接数上限
worker_connections 10240;
}
http {
server {
listen 80 default_server;
location / {
proxy_pass http://backend;
}
}
}
上面的配置展示了在events块中如何启用。需要注意multi_accept是全局事件配置,不能针对某个server单独设置。如果你的业务以短请求为主且机器CPU有余量,建议开启;若是混合类型流量,可保持默认关闭并通过增加worker数量来横向扩展。
常见误区与配置调优建议
不少运维人员认为只要写上multi_accept on就一定能提升性能,这是概念厘清上的偏差。multi_accept只解决“accept系统调用频次”问题,并不增加网络带宽,也不减少数据传输耗时。如果瓶颈在后端数据库或磁盘IO,开启它几乎无感。另一个误区是把它和accept_mutex混为一谈:后者控制多个worker争抢监听锁以避免惊群,前者控制拿到事件后取几个连接,两者机制独立。
在调优时,建议先通过ss -lnt观察监听队列溢出情况,若Recv-Q经常接近Send-Q上限,说明accept速度跟不上,可尝试开启multi_accept并调大somaxconn。同时配合worker_processes auto让Nginx充分利用核数。对于容器环境,还需注意单容器CPU配额限制,避免开启后单个worker cpu.throttled增多。
最后给出一个避坑实践:不要在开启multi_accept的同时把worker_connections设得过小,否则瞬间涌入的连接会快速占满连接表,导致新连接被拒绝。理想的办法是用灰度方式,在预发环境用相同流量回放验证,再逐步推到生产,并结合监控指标如nginx.connections.accepted与active差值评估效果。
Nginxmulti_acceptevent_driven修改时间:2026-08-17 06:44:25