Nginx高效调度源于“不等、不闲、不搬”:单worker以事件驱动统一处理成千连接,epoll/kqueue内核通知就绪事件,非阻塞I/O全链路贯穿,红黑树管理超时,内存池与slab优化分配,多worker无共享、CPU绑定负载均衡。
任务调度高效,关键在于“不等、不闲、不搬”——Nginx 不靠线程堆叠抢资源,而是用单 worker 进程把成千上万个连接当作可响应的事件来统一调度,所有动作只在真正就绪时触发。
每个 worker 启动后进入一个紧凑的 while 循环:调用 epoll_wait()(Linux)或 kqueue(BSD/macOS),把监听权交给内核。内核只在 socket 真正可读、可写或出错时才返回就绪列表,不遍历全部连接,也不拷贝 fd 集合。一次系统调用就能批量获取多个事件,CPU 利用率高,空闲时不消耗算力。
从 accept 开始,所有 socket 操作都设为 non-blocking。recv() 遇到 EAGAIN 立即返回,send() 发不完也立刻退出,剩余数据留在连接自己的 output buffer 中,等待下一次 write event 触发再续发。整个流程没有一处会卡住 worker,它始终处于可调度状态。
连接的 read timeout、write timeout、keepalive timeout 不靠独立线程轮询,而是统一插入红黑树。事件循环每次进入 epoll_wait 前,先检查树顶是否到期,并把最小超时值传给系统调用的 timeout 参数——精度高,无额外开销。
master 进程负责加载配置与拉起 worker,所有请求处理由独立 worker 完成。每个 worker 拥有专属事件循环、内存池、连接池,彼此无共享状态。新连接通过内核 SO_REUSEPORT 或 accept_mutex 分配,确保负载均衡且无惊群。