非阻塞IO使Nginx worker不空等,单worker可管理超万连接,8核服务器理论并发超8万;配合epoll、multi_accept、缓冲与零拷贝,延迟显著降低;但需调高ulimit、合理设超时、避免同步操作。

非阻塞 IO 模式本身不缩短单次网络读写或后端处理的时间,它的直接效果是让 Nginx worker 进程“不空等”——请求来了能立刻响应,数据没到也不停摆,CPU 始终有事可做。
让每个 worker 同时盯住上万连接
传统阻塞模型下,一个连接卡在 recv() 等数据,就等于一个线程/进程被锁死;Nginx 把 socket 设为 O_NONBLOCK 后,read() 或 write() 调用立即返回:有数据就读走,没数据就收到 EAGAIN,马上转向下一个就绪连接。配合 epoll/kqueue 事件通知,单个 worker 可稳定管理 10240+ 连接,连接数翻倍,worker 负担几乎不变。
- 8 核服务器设 worker_processes auto + worker_connections 10240,理论并发支撑超 8 万
- 无需新增线程或进程,避免上下文切换开销和内存栈膨胀
- 连接空闲时不消耗 CPU,只在内核通知“可读/可写”时才介入
减少无效等待,压缩请求排队时间
高并发场景下,大量短连接(如 API 请求)或慢客户端上传会频繁触发 I/O 等待。非阻塞模式下,Nginx 不会因某个连接收包慢而阻塞整个 worker,新请求到达时仍能被毫秒级捕获并调度。
- 实测:4 核服务器启用 epoll + worker_connections 10240 后,平均延迟从 45ms 降至 12ms
- 10k 并发时,延迟增幅控制在 10% 以内,而阻塞型服务常出现 2–3 倍跃升
- multi_accept on 可批量接受新连接,进一步降低瞬时高峰下的排队延迟
配合缓冲与零拷贝,放大响应效率
非阻塞不是孤立起作用的,它和 Nginx 的缓冲策略、sendfile 零拷贝深度协同:
- HTTP 头未收全时动态扩容缓冲,超限自动落盘,防内存暴涨
- 静态文件启用 sendfile on,由内核直接从磁盘送入 socket,跳过用户态拷贝
- send() 遇阻(如网卡忙)时,连接挂入写事件队列,下次可写再续发,不占着 CPU 空转
配置不当反而拖慢响应
非阻塞能力需要关键参数对齐才能释放,否则优势会被掩盖:
- 系统级限制必须调高:ulimit -n 至少设为 65536,否则连接数刚到上限就拒绝新请求
- 超时设置不合理会积压连接:client_header_timeout 过长(如 60s),会让恶意慢速客户端长期占用事件槽位
- 同步操作会堵死整个 worker:Lua 中写 sleep()、阻塞 DNS 查询,或 rewrite 规则过于复杂,都会中断事件循环


















