non-blocking io 是 nginx 高并发的底层基石:它使 worker 进程在 socket 无数据时立即返回 eagain/ewouldblock 而不阻塞,配合 epoll 等事件机制实现“内核通知、非阻塞执行”,避免轮询与上下文切换,单线程高效支撑数万连接。

Non-blocking IO 是 Nginx 实现高并发能力的底层基石,它让单个 worker 进程摆脱了“等数据”的束缚,真正转向“有事干活、没事轮转”的高效状态。
避免进程挂起,释放 CPU 时间片
传统阻塞 I/O 在调用 read() 或 write() 时,若内核缓冲区无数据或已满,进程会立刻被挂起,交出 CPU 控制权。而 Nginx 将 socket 设置为 O_NONBLOCK 标志后,这类调用总是立即返回:有数据就读走,没数据就返回 EAGAIN 或 EWOULDBLOCK 错误。进程不会停在那里干等,可以马上去处理其他就绪事件。
- 同一 worker 进程无需切换上下文,就能服务成千上万个连接
- CPU 不再浪费在空等上,而是持续调度活跃连接
- 避免了线程/进程创建开销与上下文切换损耗
与事件驱动模型协同工作
Non-blocking IO 本身不解决“怎么知道该读还是该写”的问题,必须配合 epoll(Linux)或 kqueue(BSD/macOS)这类事件通知机制。Nginx 的事件循环持续监听所有 socket 的状态变化,只在 fd 被标记为“可读”或“可写”时才发起非阻塞读写操作。
- 没有轮询式 busy-wait,事件就绪才触发处理,节省 CPU
- 一个事件循环管理数万连接,资源占用极低
- 连接生命周期中各阶段(accept、recv、send、close)均由事件驱动流转
支撑异步、单线程、高密度连接模型
Nginx 不依赖多线程或多进程来应对并发,而是靠每个 worker 进程内部的异步非阻塞逻辑。这意味着:
- 内存占用稳定:每个连接仅需 KB 级内存(而非 MB 级线程栈)
- 连接数扩容不依赖硬件线程数,轻松支撑 10 万+ 并发连接
- 静态资源响应、反向代理转发等场景下,I/O 等待时间被完全“摊平”
区别于简单轮询,实际是“事件触发 + 非阻塞执行”
有人误以为 Non-blocking IO 就是不断重试 read/write,但 Nginx 并不这么做。它依赖内核事件机制通知就绪状态,再执行一次非阻塞操作;失败即返回,绝不阻塞,也不盲目轮询。这种组合既规避了阻塞代价,又避免了忙等开销。
- 不是“自己查”,而是“内核喊你”
- 每次系统调用都有效率保障,不空跑
- 整个请求生命周期在单线程内完成状态机跳转











