nginx高效处理高并发的核心在于非阻塞i/o与事件驱动的深度协同:socket强制非阻塞、单事件循环统一调度、读写分段推进、连接级缓冲复用。

Nginx 能高效处理高密度网络事件,核心在于它把 Non-blocking I/O 和事件驱动模型真正拧成一股绳——不是简单开启非阻塞模式,而是让每个环节都围绕“不等待、不空转、不浪费”来设计。
socket 层强制非阻塞是起点
所有监听和客户端 socket 都通过 fcntl(fd, F_SETFL, O_NONBLOCK) 设置为非阻塞。这意味着:
- read() 在无数据时立刻返回 EAGAIN/EWOULDBLOCK,绝不挂起 worker 进程;
- write() 在内核发送缓冲区满时也立即报错,不等空间释放;
- 后续是否可读/可写,全交给 epoll/kqueue 去监控,Nginx 自己不做轮询或休眠。
事件循环统一调度,拒绝线程切换开销
Nginx 的 worker 进程里只有一个主事件循环(比如基于 epoll_wait),它干三件事:
- 批量获取就绪的 fd 列表(比如 1000 个连接中只有 3 个有数据);
- 对每个就绪 fd,调用对应模块注册的回调函数(如 http_read_request、ngx_http_write_filter);
- 回调执行完后立刻返回事件循环,继续处理下一个就绪事件,全程不创建新线程、不切换上下文。
缓冲区策略配合非阻塞节奏,不卡不囤
读写操作不是“一口气做完”,而是按事件节拍分段推进:
- 读请求头时,只用小缓冲区试探;没收全就扩容,超限则切到临时文件,避免内存暴涨;
- 写响应时,若 send() 返回 EAGAIN,就把连接标记为“待写”,加入 write event 队列,等下次 epoll 触发可写再续发;
- 启用 sendfile 时,静态文件直接由内核在磁盘和 socket 间搬运,跳过用户态拷贝,进一步压缩非阻塞路径上的延迟。
连接状态与缓冲生命周期强绑定
Nginx 不为每次请求单独分配长期缓冲,而是复用 ngx_connection_t 结构里的 buffer 字段:
- 连接建立时分配 recv/send buffer,连接关闭时自动清理;
- 缓冲区大小可配(如 client_header_buffer_size),但实际使用是动态伸缩的;
- 这种“按连接生命周期管理”的方式,让数万并发连接的内存占用可控且 predictable。











