Nginx的Non-blocking I/O是其高并发的核心机制:通过设置O_NONBLOCK标志,结合epoll/kqueue事件驱动,使单worker进程可高效处理数万连接,避免线程切换与阻塞等待。
Nginx 的 Non-blocking I/O(非阻塞 I/O)不是锦上添花的选项,而是它扛住高并发的核心机制。它让单个 worker 进程不因等待数据而停摆,从而把 CPU 时间真正用在处理请求上,而不是空转或切换。
Nginx 不会为每个连接分配线程或进程,而是把所有连接注册到操作系统提供的事件通知机制中(如 Linux 的 epoll)。
recv() 立即返回 EWOULDBLOCK,不卡住; 这种机制直接规避了传统同步模型中“一个请求卡住整个线程”的问题,使单 worker 能轻松维持数万连接。
非阻塞能力需要正确启用和协同配置,否则无法发挥效果:
use epoll;(Linux 必配):启用高性能事件驱动接口,避免 select/poll 的轮询低效; worker_connections 65536;:设为单 worker 最大并发连接数,需与系统 ulimit -n 匹配; multi_accept on;:允许一个事件触发时,一次性接受多个新连接,减少事件唤醒次数; accept_mutex on;(默认):防止多 worker 同时争抢新连接,降低锁竞争; worker_cpu_affinity auto;:把每个 worker 绑定到独立 CPU 核心,减少缓存抖动,提升响应一致性。在真实压测中(如 4 核服务器),开启并调优 Non-blocking I/O 后:
它不改变代码逻辑,但彻底改变了资源调度方式——把“等数据”变成“等通知”,把“被动阻塞”变成“主动响应”。