nginx高吞吐能力源于异步非阻塞i/o+多进程事件驱动架构,每个worker进程内运行独立单线程event loop,借助epoll/kqueue监听成千上万连接,非阻塞处理就绪事件,配合零拷贝、内存池与红黑树定时器实现低开销、高并发。

Nginx 的高吞吐能力并非来自传统多线程 Event Loop(如 Node.js 那种单线程 JS 事件循环),而是基于 **异步非阻塞 I/O + 多进程模型** 构建的高效事件驱动架构。它的“Event Loop”本质是每个 worker 进程内一个独立、轻量、轮询驱动的事件处理循环,配合操作系统底层机制(epoll/kqueue/select)实现极低延迟和极高并发连接处理。
核心:每个 Worker 进程一个独立事件循环
Nginx 默认启用多 worker 进程(通常与 CPU 核心数一致),每个 worker 是单线程、无锁、事件驱动的。它不使用线程池或协程调度器,而是在一个循环中持续监听并处理就绪事件:
- 调用 epoll_wait(Linux)或 kqueue(BSD/macOS)等待一批就绪 socket 事件(读/写/错误/超时)
- 遍历就绪事件列表,按事件类型分发给对应 handler(如 accept_handler、read_event_handler)
- 所有网络 I/O 操作(accept、recv、send、writev)都设为非阻塞模式,避免卡住整个循环
- 不执行耗时任务(如文件读写、复杂计算)在事件循环中——静态文件可能用 sendfile() 零拷贝;长耗时操作会退避或交由独立进程/模块处理
关键优化:事件驱动 + 零拷贝 + 内存复用
高吞吐不是靠“快跑”,而是靠减少开销、提升单位时间完成的有效工作量:
- epoll 边缘触发(ET)+ 一次性读写:配合非阻塞 socket,用一次系统调用批量处理多个连接的活跃事件,避免惊群和重复唤醒
- 内存池(ngx_pool_t)管理:每个请求分配固定大小内存块,避免频繁 malloc/free,降低 GC 压力和碎片
- 链表缓冲区(ngx_buf_t + ngx_chain_t):数据在内核与用户态间流转时复用 buffer,支持零拷贝发送(如 sendfile、splice)
- 定时器用红黑树组织:O(log n) 插入/删除超时事件,比轮询所有连接高效得多
为什么不用多线程 Event Loop?
Nginx 主动规避了单线程 JavaScript 式 Event Loop 的瓶颈:
- JS 引擎本身非线程安全,无法利用多核;Nginx 多 worker 进程天然并行,无共享状态竞争
- 避免 V8 或 libuv 的抽象层开销,直接对接系统调用,控制更细粒度(如 TCP cork、SO_KEEPALIVE、TCP_FASTOPEN)
- worker 进程崩溃不影响其他进程,稳定性更高;热升级时可平滑替换旧 worker
实际效果:连接数与吞吐的解耦
传统服务器(如 Apache prefork)连接数 ≈ 进程数 ≈ 内存占用;而 Nginx 可轻松维持数十万空闲连接(keepalive),因为:
- 每个空闲连接只占约 2KB 内存(socket fd + 少量结构体)
- 事件循环不为闲置连接做任何事,仅在有数据到达或超时时才介入
- 通过配置 worker_connections 和 keepalive_timeout 可精细调控资源利用率











