Nginx 高性能核心在于单线程事件循环+非阻塞I/O+epoll多路复用:non-blocking避免空等,epoll O(1)就绪通知,单worker零上下文切换,CPU亲和与NUMA协同提升吞吐。

关键在于用单线程事件循环 + 非阻塞 I/O + 内核级多路复用,把“等待”从进程里拿出去,交给操作系统通知。
非阻塞 I/O 避免线程空等
每个 socket 都设为 non-blocking 模式。读写操作立即返回,不卡住当前 worker;没数据就继续处理别的连接,有数据或错误再回调处理。这就像点完菜后服务员不干站着等厨房,而是去服务其他桌——资源不闲置。
- 所有网络收发、文件读取(如 sendfile)都走非阻塞路径
- 配合状态机管理请求生命周期(如 reading → parsing → writing)
- 避免因磁盘慢、后端延迟、SSL 握手耗时导致整个 worker 停摆
epoll 多路复用减少轮询开销
Linux 下默认启用 epoll,它用红黑树管理监听 fd,就绪事件通过链表直接返回,时间复杂度 O(1) —— 不管监听 100 个还是 10 万个连接,唤醒和遍历成本几乎不变。
- 相比 select/poll 的线性扫描,epoll 在高并发下无性能衰减
- 内核维护就绪队列,Nginx 只需调用一次 epoll_wait 就拿到全部活跃事件
- 源码中 ngx_epoll_process_events 函数就是这个事件分发中枢
单 worker 单线程 + 事件循环消除上下文切换
每个 worker 进程只用一个线程跑事件循环,没有线程创建/销毁、锁竞争、栈切换开销。1 个 worker 轻松维持数万连接,CPU 时间全花在实际处理上。
- Master 进程只管配置和生命周期,Worker 全权负责请求处理
- 事件循环伪代码本质是:等待事件 → 分发 → 执行回调 → 回到等待
- 配合 timer 红黑树管理超时,避免遍历所有连接查 deadline
CPU 亲和与硬件协同放大吞吐
异步模型要真正跑满多核,得让每个 worker 绑定专属物理核心,并让网卡中断、软中断落在同一 NUMA 节点上。
- worker_cpu_affinity auto 自动绑定逻辑核,避免跨核调度
- 启用多队列网卡 + RPS,使数据包接收和 worker 处理在同组核心完成
- 关闭 accept_mutex、开启 multi_accept,减少内核事件队列争抢



















