nginx event loop 的高效依赖于与内核协同优化:需均衡网卡软中断(rps/多队列)、绑定 worker 到 cpu、调优内核参数(somaxconn/netdev_max_backlog/epoll watches)、避免隐式阻塞(禁同步读/aio/调优 ssl 内存)。

Nginx 的 Event Loop 本身不直接处理硬件中断,它响应的是内核通过 epoll(Linux)等机制通知的就绪事件。所谓“减少中断响应时间”,实质是缩短从网卡收到数据包 → 内核协议栈处理 → 软中断执行 → epoll 通知 Nginx worker → Event Loop 执行回调这一整条路径的延迟。关键不在 Event Loop 内部,而在它与操作系统底层的协同效率。
网卡软中断(NET_RX)负载需均衡
网卡收包后触发的软中断若集中在单个 CPU 上,会成为瓶颈,导致事件通知延迟抬升:
- 使用
sar -I ALL 1观察各 CPU 的NET_RX占比,持续高于 70% 就说明过载 - 启用 RPS(Receive Packet Steering)将软中断分发到多个 CPU:
echo "f" > /sys/class/net/eth0/queues/rx-0/rps_cpus # 示例:启用前4核
- 若网卡支持多队列(如
ethtool -l eth0显示Combined> 1),应开启并绑定 IRQ 到不同 CPU,避免所有中断挤在同一个核上
减少事件通知链路中的等待与切换
Event Loop 的响应速度受调度和上下文切换影响:
- 设置
worker_cpu_affinity auto或显式绑定(如worker_cpu_affinity 0001 0010),让每个 worker 固定运行在专属核心,避免跨核迁移带来的 L1/L2 缓存失效 - 避免同机部署高 CPU 占用服务(如 FFmpeg、Node.js 计算任务),否则内核频繁抢占 worker 进程的时间片,
pidstat -p $(pgrep nginx) 1中%wait升高即为信号 -
multi_accept on;可让单次epoll_wait()返回后尽可能多地accept()新连接,减少轮询空转,提升吞吐密度
优化内核事件交付效率
Event Loop 依赖 epoll 快速获知 socket 就绪状态,这需要内核参数配合:
- 增大
net.core.somaxconn(如设为65535),防止listen()队列溢出丢 SYN 包 - 调高
net.core.netdev_max_backlog(如5000),缓解突发流量下网卡队列满导致的丢包 - 确保
fs.epoll.max_user_watches足够(建议 ≥ 总并发连接数 × 1.2),避免epoll_ctl()失败日志
避免 Event Loop 被隐式阻塞
即使通知及时,若 worker 正在执行耗时操作,也会推迟回调执行:
- 禁用同步文件读(如
ngx_http_static_module默认行为),对大静态资源启用aio threads;+thread_pool - 反向代理场景关闭
proxy_buffering on(改用off),防止上游响应未完就阻塞整个连接生命周期 - SSL 握手阶段内存分配若遇页回收压力,可能卡住数百毫秒;监控
/proc/meminfo中DirectMap和PageTables,必要时调低vm.swappiness并保留 swap
不复杂但容易忽略











