事件驱动模型优化
NGINX 基于事件驱动架构运行。不同操作系统提供不同的事件多路复用机制,选择合适的模型直接影响并发性能。
事件模型选择
use 指令
nginx
events {
use epoll;
worker_connections 1024;
}
通常无需手动指定。NGINX 编译时已配置自动选择最优模型。仅在特殊场景需要手动覆盖。
各平台最优模型
Linux — epoll
nginx
events {
use epoll;
}
- 边缘触发(ET)和水平触发(LT)两种模式
- O(1) 复杂度,不受连接数影响
- Linux 2.6+ 默认使用
FreeBSD — kqueue
nginx
events {
use kqueue;
}
- FreeBSD/macOS 的最优模型
- 支持高效的事件通知
通用 — select/poll
nginx
events {
use poll; # 或 select
}
- 兼容性最好但性能最差
- O(n) 复杂度,连接越多越慢
- 仅在旧系统或特殊编译时使用
epoll 深入
ET vs LT 模式
NGINX 默认使用 LT(水平触发)模式,更稳定:
nginx
# NGINX 内部实现,用户无法直接配置
// 边缘触发(ET):仅当事件状态变化时通知
// 水平触发(LT):只要事件就绪就持续通知
NGINX 的 eventfd 内部使用 ET 模式优化通知,但连接事件处理使用 LT。用户无需也无法修改。
连接处理优化
multi_accept
nginx
events {
multi_accept on;
worker_connections 1024;
}
on— worker 一次接受所有新连接off— worker 一次仅接受一个
高流量场景开启
multi_accept on。突发流量下可减少连接排队。
accept_mutex
nginx
events {
accept_mutex on;
accept_mutex_delay 500ms;
}
on— worker 轮流获取 accept 锁off— 所有 worker 竞争 accept(惊群效应)
NGINX 1.11.3+ 默认
off,使用系统层面的 SO_REUSEPORT 代替。旧版本建议on。
SO_REUSEPORT
内核级负载均衡
nginx
server {
listen 80 reuseport;
server_name example.com;
}
- 每个 worker 拥有独立监听 socket
- 内核负责分配连接到不同 worker
- 减少锁竞争,提升多核性能
NGINX 1.9.1+ 支持
reuseport。Linux 3.9+ 和 FreeBSD 10+ 支持。配合accept_mutex off使用。
查看当前模型
确认编译支持
Bash
# 查看 NGINX 编译参数
nginx -V
# 输出中包含 --with-select_module --with-poll_module
# 确认支持的事件模型
要点总结
- Linux 使用
epoll,FreeBSD 使用kqueue - NGINX 自动选择最优模型,一般无需手动指定
use multi_accept on提高突发流量处理能力reuseport实现内核级连接分配,减少锁竞争- 旧版本 NGINX 使用
accept_mutex on避免惊群效应 - 事件模型选择影响高并发场景下的性能表现
📝 发现内容有误?点击此处直接编辑