全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-20 6 分钟 ✍️ juanwangdev

事件驱动模型优化

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 避免惊群效应
  • 事件模型选择影响高并发场景下的性能表现

📝 发现内容有误?点击此处直接编辑

← 上一篇 worker进程与CPU绑定
下一篇 → 日志优化与缓冲
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库