Nginx在Linux 2.6+默认启用epoll,无需手动配置use epoll;应通过nginx -V、错误日志及strace验证其运行时生效,并调优worker_connections、内核参数及upstream keepalive等协同释放性能。

直接看瓶颈在哪,再针对性调 epoll 相关配置,比盲目改参数更有效。关键不是“用了 epoll 就万事大吉”,而是确认它真在高效工作、没被其他配置拖后腿。
用工具确认 epoll 是否真实生效
别只信“Linux 默认用 epoll”——得验证:
-
编译时支持:运行
nginx -V 2>&1 | grep epoll,有输出说明编译阶段已启用 epoll 支持 -
运行时调用:用
strace -e trace=epoll_wait -p $(pgrep nginx | head -1)抓取 worker 进程的系统调用,能看到持续出现epoll_wait才算真正跑在 epoll 上 -
日志佐证:加
error_log /var/log/nginx/error.log debug_event;后 reload,搜索epoll或ngx_epoll_process_events,能定位到事件循环实际执行痕迹
识别 epoll 性能被拖慢的典型信号
即使 epoll 在跑,也可能因配置或系统限制变慢。注意这些现象:
- 连接数上不去,但
ss -s显示大量syn_recv—— 可能accept_mutex on导致 worker 排队抢连接,抵消 epoll 并发优势 - worker CPU 利用率低,但请求延迟高、超时多 —— 可能
worker_connections设太高,触发系统级文件描述符限制(ulimit -n或/proc/sys/fs/file-max不足) - 监控显示
epoll_wait返回频繁但处理慢 —— 检查是否启用了阻塞行为,比如proxy_buffering off+ 大响应体,让单个请求卡住整个 event loop
围绕 epoll 的关键配置调整点
目标是让每个 worker 进程能稳定、异步地撑住几千连接:
-
worker_processes auto;:匹配物理 CPU 核心数,避免多个 worker 争抢同一个 epoll 实例 -
worker_connections 16384;:建议设在 8K–64K 区间,同时必须同步调大系统限制:ulimit -n 65535并写入/etc/security/limits.conf -
use epoll;:写在events{}块里,虽非必需,但显式声明可排除误用 select/poll 的可能 -
multi_accept on;:允许单次epoll_wait返回后,一次性 accept 所有就绪连接,减少系统调用次数 -
accept_mutex off;:高并发下建议关闭,交由 epoll 自行分发新连接,避免锁竞争
配合系统层做基础保障
epoll 效能依赖底层环境:
- 确保内核 ≥ 2.6(现代发行版都满足),并检查
/proc/sys/net/core/somaxconn是否足够(建议 ≥ 65535) - 禁用
timer_resolution,除非有精准定时需求;默认无该指令,反而更利于 epoll 的休眠-唤醒效率 - 观察
netstat -s | grep -i "listen overflows",若数值持续增长,说明连接积压,需调大somaxconn和应用层 backlog



















