Nginx高效资源调度的关键在于非阻塞I/O、事件循环+多路复用、状态机驱动和内存池协同:每个worker进程不空等、不切换、不浪费,通过O_NONBLOCK使系统调用快进快出,epoll_wait实现O(1)就绪事件分发,状态机管理连接进度,内存池避免频繁分配释放。

nginx 实现高效资源调度的关键,不是靠堆线程或提速 CPU,而是让每个 worker 进程“不空等、不切换、不浪费”。它用非阻塞 I/O 作为底层支撑,把等待时间从内核调度中剥离出来,交由用户态事件循环统一判断和分发。
非阻塞 I/O:让系统调用不再卡住
所有 socket 都被设为 O_NONBLOCK 模式。read()、write()、accept() 等调用不再挂起进程,而是立即返回 —— 有数据就读,没数据就返回 EAGAIN 或 EWOULDBLOCK。这相当于告诉内核:“我不等,你有事再叫我。”
- 避免因单个连接无数据而阻塞整个 worker 进程
- 配合 epoll_wait() 批量监听,只在 fd 就绪时才真正处理
- 系统调用始终处于“快进快出”状态,不触发睡眠与唤醒开销
事件循环 + 多路复用:单线程的智能调度中枢
每个 worker 进程运行一个轻量级无限循环:epoll_wait() → 遍历就绪事件 → 分发回调 → 继续等待。这个循环本身不耗 CPU,也不做无效轮询,只响应内核通知。
- epoll 在内核维护就绪列表,查询复杂度 O(1),无遍历成本
- 10 万个连接里只有几十个就绪,Nginx 就只处理这几十个,其余静默待命
- 没有线程创建/销毁、无栈空间分配、无上下文切换压力
状态机驱动:每个连接自带进度条
Nginx 不为连接分配独立执行流,而是用 ngx_connection_t 结构体记录其当前阶段,比如 NGX_HTTP_READING_REQUEST 或 NGX_HTTP_SENDING_RESPONSE。一次 HTTP 请求被拆成若干明确状态,事件到来时只推进就绪连接的状态。
- 状态迁移由模块注册的回调函数驱动(如 ngx_http_process_request_line)
- 逻辑清晰可测,支持中断、恢复、超时控制
- 连接空闲时不占 CPU、不占栈、不触发调度器干预
内存池协同:让每次分配都不拖慢调度节奏
非阻塞 I/O 解决了“时间等待”问题,内存池则解决“空间开销”问题。每个请求启动时,从预分配池中划出一块连续内存;请求结束时整块重置,不逐个 free。
- 连接结构体(ngx_connection_t)长期存在,仅存 socket 和事件等轻量字段
- HTTP 解析、变量、重写等临时数据全部挂载在请求级内存池下,生命周期精准可控
- 启用 keepalive 时,一个连接承载多个请求,每个请求拥有独立池,互不影响


















