非阻塞io是nginx高性能的底层支撑,通过epoll/kqueue实现精准事件驱动,将“等数据”变为“等通知”,单worker可管理上万连接,并配合超时策略、零拷贝与内核协同优化io效率。

非阻塞 IO 是 Nginx 高性能的底层支撑,它不靠“读得更快”,而是让系统 IO 模型真正被用满、用准、用稳——核心是把“等数据”变成“等通知”,把 CPU 从空转中彻底解放出来。
依托 epoll/kqueue 实现精准事件驱动
Linux 下默认启用 epoll(1.15.10+ 已默认使用边缘触发 ET 模式),FreeBSD/macOS 使用 kqueue。这些机制不是轮询,而是内核主动通知:
- socket 设为 O_NONBLOCK 后,recv()/send() 调用立即返回:有数据就读,没数据就返回 EAGAIN,绝不挂起进程
- 内核只在 fd 状态变化(如可读、可写、断连)时推送事件,Nginx 事件循环随即调度对应 handler
- 一次 TCP 包可能分片到达,Nginx 持续监听同一连接的 EPOLLIN 事件,分多次收完,全程无阻塞
减少无效系统调用与上下文切换
传统阻塞模型每连接一线程,数据未就绪就挂起,导致大量线程争抢调度器、频繁切换上下文;而非阻塞 + 事件驱动彻底规避这点:
- 单 worker 进程可管理上万连接,仅维护轻量 ngx_connection_t 结构体,无栈空间开销
- 避免 read()/write() 反复调用检查返回值,epoll_wait() 一次等待多个就绪事件,系统调用密度大幅下降
- 配合 sendfile() 零拷贝,小文件响应跳过用户态内存,一次系统调用完成磁盘到 socket 的传输
协同缓冲与超时策略防止资源滞留
非阻塞本身不能兜底慢连接或恶意请求,必须靠配置闭环管理连接生命周期:
- client_header_timeout 和 client_body_timeout 限制请求头/体上传最大等待时间(如 10–15s),超时即断连,释放事件槽位
- keepalive_timeout 设为 15–60s,既复用连接又防长闲占用;send_timeout 控制响应发送中断间隔,防接收方极慢拖垮 worker
- open_file_cache 缓存 stat()/open() 结果,将高频元数据查询从每次请求降为分钟级,降低内核态压力
硬件与内核层协同释放 IO 潜力
高效 IO 不止在用户态,还需与系统资源对齐:
- worker_processes auto; + worker_cpu_affinity auto; 让每个 worker 绑定独立 CPU 核,减少缓存抖动和跨核调度
- worker_connections 必须 ≤ 系统 ulimit -n(如设为 10240,则 ulimit -n 至少 10240×worker 数),否则新连接直接失败
- tcp_nopush on; 合并 sendfile 数据填满 TCP 报文段;tcp_nodelay on; 禁用 Nagle 算法,避免小响应包延迟











