Nginx高并发能力源于非阻塞I/O与epoll深度协同:socket设为非阻塞后,recv/send遇阻立即返回EAGAIN,worker不等待;epoll则精准通知就绪事件,避免轮询,单worker即可高效调度数万连接。
非阻塞 I/O 和 epoll 不是各自独立运行的两套机制,而是深度咬合、互相成就的一体化设计。Nginx 的高并发能力,正来自这两者在每个连接处理环节上的紧密配合——非阻塞让 worker 不停步,epoll 让 worker 只做该做的事。
每当新连接建立,Nginx 立即调用 fcntl() 将其 socket 设为非阻塞模式。这意味着:
recv() 时若无数据可读,立刻返回 EAGAIN,而不是挂起进程send() 时若发送缓冲区满,同样返回 EAGAIN,不阻塞后续逻辑非阻塞操作返回 EAGAIN 后,连接并未被丢弃,而是被挂起并注册到 epoll 监听列表中:
EPOLLIN 事件;等待写就绪时,注册 EPOLLOUT 事件epoll_wait() 只返回真正就绪的那些,避免轮询开销worker 进程的主循环不是忙等,而是一个精准调度器:
epoll_wait() 阻塞等待(但超时极短,通常毫秒级),拿到一批就绪事件EAGAIN,就重新注册事件,交还给 epoll 等待下一次通知这种组合直接改变了资源使用方式:
client_header_timeout 等机制及时清理