Nginx Event Loop 本身不直接减少系统调用,而是通过单次 epoll_wait 批量获取事件、边缘触发模式、红黑树定时器集成、keepalive 复用连接、sendfile 零拷贝、TCP_NOPUSH 优化及原子操作更新共享资源等方式,精准控制调用时机与粒度,实现“一次干多件事”“该调才调”“调完立刻干活”。

Nginx 的 Event Loop 本身不直接“减少系统调用”,而是通过精准控制系统调用的时机、频次与粒度,把开销压到最低。关键不在少调,而在“一次干多件事”“该调才调”“调完立刻干活”。
Event Loop 如何让 epoll_wait 更高效
- 每个 worker 进程只调用一次
epoll_wait(),就能批量获取多个就绪事件(比如几十个 socket 可读/可写),避免为每个连接单独轮询或阻塞等待 - 使用边缘触发(ET)模式:内核只在状态真正变化时通知一次,防止重复唤醒;配合非阻塞 I/O,
read()或write()失败立即返回,不卡住整个循环 - 定时器也集成在同一个 loop 中——红黑树管理超时,检查和事件处理共用一次调度,无需额外线程或定时系统调用(如
timerfd_settime)
配合零拷贝与连接复用,间接降低系统调用次数
- 启用
keepalive复用 TCP 连接,省去大量connect()/close()系统调用 - 对静态文件启用
sendfile(),数据由内核直接从磁盘 DMA 到 socket 缓冲区,绕过用户态内存拷贝,省掉read()+write()两次系统调用 -
TCP_NOPUSH(Linux)或TCP_NODELAY按需启停 Nagle 算法,减少小包发送引发的频繁write()调用
内存与资源管理进一步压缩调用依赖
- 多级内存池(连接级、请求级)避免频繁
malloc/free,减少系统级内存管理调用 - 共享内存区(如限流 zone)用原子操作更新计数,不依赖
futex或pthread_mutex等需内核介入的同步原语 -
worker_rlimit_nofile预设足够文件描述符上限,避免运行中反复调用setrlimit()
不复杂但容易忽略


















