Nginx通过单worker事件循环+epoll/kqueue+非阻塞I/O+红黑树超时管理+内存池复用,实现高并发低开销连接调度。
nginx 异步事件驱动架构实现高性能连接任务调度,核心不是靠增加线程或进程数量,而是让单个 worker 进程以极轻量的方式,把成千上万个连接的每个操作都转化为可响应、可中断、可复用的事件,全程不等待、不阻塞、不切换上下文。
每个 worker 启动后进入一个紧凑的 while 循环,调用 epoll_wait()(Linux)或 kqueue()(BSD/macOS)交由内核管理就绪状态。内核只在 socket 真正可读、可写或出错时才通知,省去遍历所有 fd 的开销,时间复杂度接近 O(1)。没有事件就绪时,worker 不空转也不 sleep,CPU 时间立即释放给系统或其他就绪任务。
从 accept 新连接开始,每个 socket 都设为 non-blocking 模式。recv() 和 send() 操作不会卡住进程:没数据就读到 EAGAIN,发不完就暂存 output buffer 并注册 write 事件,等下次可写再续。整个连接的读头、收体、转发、写回全部拆解为独立事件,在用户态内存中流水执行。
连接级超时(如 keepalive_timeout、client_header_timeout)不靠独立线程轮询,而是插入全局红黑树。事件循环每次进入 epoll_wait 前,先检查树顶是否到期,并将最小超时值传入 timeout 参数——既保证精度,又消除定时器线程开销。连接对象、buffer 内存也通过预分配池(slab)复用,避免频繁 malloc/free 导致抖动。
master 进程仅负责配置加载与 worker 生命周期管理,所有连接调度由独立 worker 完成。每个 worker 拥有专属事件循环、内存池和连接池,彼此无锁共享关键资源。配合 worker_cpu_affinity 绑定物理核心,配合 SO_REUSEPORT 或 accept_mutex 控制新连接分发,确保负载均衡且缓存友好。