nginx event loop 通过 epoll 高效调度实现高并发,需显式配置 use epoll、调大内核参数、启用 multi_accept、合理设置超时及系统级网络参数。

Nginx 的 Event Loop 是单机连接上限能突破数万甚至百万的关键,但它本身不“提升上限”,而是让有限资源被更高效地调度和复用。真正提高上限,靠的是 Event Loop 与系统底层资源的精准协同——它像一个高精度调度员,把每一份文件描述符、内存、CPU 时间都用在刀刃上。
Event Loop 依赖 epoll 实现非阻塞高效轮询
Linux 下 Nginx 默认使用 epoll 作为事件通知机制,相比 select/poll,epoll 没有 1024 文件描述符硬限制,且时间复杂度为 O(1),可支撑数十万连接监听。但前提是:
- 必须在
events块中显式写use epoll;,否则可能回退到低效模型 - 内核参数
fs.epoll.max_user_watches要足够大(建议 ≥ 总连接数 × 1.2),否则新增连接会失败并报 “epoll_ctl() failed” -
multi_accept on;让单次事件触发时尽可能多地 accept 新连接,减少 listen 队列堆积
每个连接只占约 2KB 内存,靠异步读写释放线程资源
Event Loop 不为每个连接分配独立线程或进程,而是用状态机管理其生命周期:
- 连接建立后立即注册进 epoll 监听队列,等待可读/可写事件
- 请求头未收全前不分配缓冲区,不阻塞其他请求处理
- 空闲 keep-alive 连接仅维持 socket 结构体,不消耗 CPU
这意味着:4 核机器配worker_processes 4和worker_connections 20000,理论可持 8 万并发,实际内存开销仅约 160MB(不含业务数据)
超时机制主动回收“僵尸连接”,腾出 fd 和内存
Event Loop 内置定时器系统持续扫描连接状态,及时切断无效占用:
-
client_header_timeout 15s防 Slowloris 类攻击,在首包阶段就断开慢速客户端 -
keepalive_timeout 65s控制长连接存活时长,避免大量空闲连接长期占位 -
send_timeout 10s防止响应发送被故意中断后挂起
这些不是可选配置,而是保障 fd 不被浪费的核心防线
配合内核参数,让连接“进得来、不丢包、不卡队列”
Event Loop 再高效,也依赖内核提供通畅通道:
-
net.core.somaxconn = 65535:增大 listen backlog,防止新连接在内核队列就被丢弃 -
net.core.netdev_max_backlog = 25000:提升网卡中断后暂存包能力,避免高流量下丢包 -
fs.file-max = 2097152与ulimit -n 65536对齐:确保系统级和进程级文件描述符充足 -
net.ipv4.tcp_tw_reuse = 1(需tcp_timestamps = 1):加速 TIME_WAIT 端口复用,缓解短连接端口耗尽
不复杂但容易忽略











