Nginx 源码深度解析:ngx_event_timer_rbtree 如何管理百万级长连接超时

冬磊君_6070

冬磊君_6070

2026-04-24

434人浏览

原创

Nginx的ngx_event_timer_rbtree仅支持每连接一个定时器,不适用于百万级长连接多定时器场景;其节点绑定ngx_event_t且强耦合网络事件生命周期,超时回调同步执行、无缓冲队列,timer_resolution启用会导致精度下降与信号开销。

nginx 源码深度解析:ngx_event_timer_rbtree 如何管理百万级长连接超时

Nginx 的 ngx_event_timer_rbtree 无法支撑“百万级长连接 + 每连接多定时器”的超时管理场景;它只保证每个连接挂一个超时节点时,百万级连接的超时检查仍在线性对数时间复杂度内完成。

红黑树结构绑定的是 ngx_event_t,不是业务任务

你不能把任意定时逻辑塞进 ngx_event_timer_rbtree——它的每个节点必须是 ngx_event_t 结构体内的 timer 字段,而该结构体又必须依附于某个真实网络事件(如 client connection、upstream connection 或 listen socket)。这意味着:

  • 没有独立的“定时任务对象”,所有定时器都强耦合在连接/事件生命周期上
  • ngx_add_timer() 必须传入一个已初始化的 ngx_event_t*,且该 event 的 data 字段通常指向 ngx_connection_t 或 ngx_http_request_t
  • 一旦连接关闭(ngx_close_connection()),其关联的 timer 若未手动 ngx_del_timer(),会引发 use-after-free 或红黑树损坏
  • 红黑树中节点数 ≈ 当前活跃连接数(前提是每连接最多注册一个超时)

ngx_event_expire_timers() 是单线程同步遍历,不支持耗时回调

这个函数在 event loop 主线程中被调用,它从红黑树最小节点开始逐个检查、触发、删除。关键限制在于:

  • 遍历过程不 yield,若某个 ev->handler() 执行超过几毫秒(比如做了阻塞 I/O、复杂计算或调用了 sleep()),整个 worker 就卡住,后续所有网络事件(包括新连接、读写)全部延迟
  • 没有任务队列缓冲,也没有异步分发机制;超时回调就是直接函数调用
  • 即使你用 ngx_post_event() 把逻辑推到 posted queue,也需确保 event 对象生命周期可控——而连接可能已在 handler 中被 close
  • 典型安全做法:只在 handler 中做标记(如置 c->timedout = 1)、清理资源、调用 ngx_close_connection(),其他逻辑移交 downstream request 或 upstream state 机制处理

timer_resolution 配置会彻底改变超时检测模型

是否设置 timer_resolution 指令,决定了 Nginx 如何与底层事件引擎(epoll/kqueue)协同等待超时:

Nginx Hosting
Nginx Hosting

通过服务器本地nginx实例实现零认证静态游戏托管。作为所有浏览器游戏的主要部署方式,无需登录、无需令牌、无需用户操作。

下载
  • 未设 timer_resolution:epoll_wait 使用动态 timeout,值来自 ngx_event_find_timer() 计算出的“最近超时时间差”,精度高、无信号开销,但要求每次 epoll_wait 返回后都调用 ngx_event_expire_timers()
  • 设了 timer_resolution 100ms:Nginx 启动 SIGALRM 定时器,每 100ms 触发一次 ngx_timer_signal_handler,强制唤醒 event loop 并检查红黑树——此时 epoll_wait 的 timeout 设为 NGX_TIMER_INFINITE,完全依赖信号中断
  • 后者在高并发下会产生大量信号上下文切换,且超时精度被钉死在 100ms 级别,可能导致本该 5ms 到期的连接被拖到 100ms 后才清理
  • 生产环境几乎从不启用 timer_resolution,除非你在调试或需要粗粒度周期扫描(如自定义健康检查)

百万连接 ≠ 百万定时器节点,但误用会导致红黑树退化

红黑树操作本身是 O(log n),但前提是你没破坏它的使用契约:

  • 每连接反复 ngx_add_timer() / ngx_del_timer()(比如心跳续期)没问题,只要确保旧 timer 已删、新 timer 正确插入
  • 若忘记 ngx_del_timer() 就重用同一 ngx_event_t 插入新超时,会导致红黑树节点重复插入,触发断言失败或崩溃(ngx_rbtree_insert_timer_value 不检查重复 key)
  • 若在 handler 中未清空 ev->timer_set = 0,下次误调 ngx_del_timer() 会尝试从树中删一个不在树里的节点,造成内存越界
  • 真正压垮性能的不是树大小,而是错误导致的节点泄漏——树节点长期堆积,ngx_event_expire_timers() 遍历耗时从微秒级升至毫秒级,最终拖慢整个 worker

实际线上跑百万连接时,最常被忽略的是 timer 生命周期与 connection/request 生命周期的严格对齐——这不是配置问题,是 C 层内存契约问题。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

nginx

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
服务器是什么
服务器是什么

服务器是一种计算机硬件设备或软件程序,它具有强大的计算和存储能力,用请求、存储数据和提供服务。它在互联网中着关重要的作用,为用户提供各种服务和资源。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.15

457

5

连接apple id服务器时出错
连接apple id服务器时出错

连接apple id服务器时出错的原因包括网络连接问题、服务器问题、Apple ID账户问题、设备问题、防火墙或安全软件问题、时间和日期设置问题、Apple服务器维护等。本专题为大家提供apple id相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.08

960

5

搭建互联网服务器
搭建互联网服务器

搭建互联网服务器需要:1、选择合适的硬件和操作系统,第一步是选择合适的硬件和操作系统;2、安装和配置操作系统,是搭建互联网服务器的关键步骤;3、安装和配置服务器软件,是搭建互联网服务器的下一步,常见的服务器软件包括Apache、Nginx、Tomcat等;4、配置防火墙和安全性,是搭建互联网服务器的重要步骤;5、域名解析和配置,是搭建互联网服务器的最后一步。

2023.09.19

3232

5

如何查看服务器状态
如何查看服务器状态

查看服务器状态的方法有使用命令行工具、图形界面工具、监控工具、日志文件和远程管理工具等。本专题为大家提供服务器状态相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.09

1056

5

服务器域名转接慢怎么解决
服务器域名转接慢怎么解决

服务器域名转接慢的解决办法有DNS优化、服务器优化、CDN加速、前端优化和网络优化等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.17

949

5

服务器评测软件
服务器评测软件

服务器评测软件有PassMark Software、CPU-Z、GPU-Z、CrystalDiskMark、IOmeter、JMeter、LoadRunner、Apache Bench等等。详细介绍:1、PassMark Software是一款综合性的服务器性能测试软件,可以评估服务器在各种负载条件下的性能;2、CPU-Z是一款可以提供服务器CPU详细信息的软件等等。

2023.10.17

494

3

如何开启TFTP服务器
如何开启TFTP服务器

开启TFTP服务器的步骤包括选择TFTP服务器软件、下载和安装软件、配置TFTP服务器以及启动和测试服务器等。本专题为大家提供服务器相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

2956

4

服务器负载不兼容怎么解决
服务器负载不兼容怎么解决

解决方法:1、增加服务器资源;2、负载均衡;3、优化应用程序;4、增加缓存机制;5、分布式架构;6、限流和熔断;7、自动化扩容。想知道更详细服务器负载不兼容的解决方法,可以访问本专题下面的文章。

2023.10.20

5552

4

宽带如何接入服务器
宽带如何接入服务器

宽带接入服务器的方法有ADSL宽带接入服务器、光纤接入服务器、无线接入服务器和以太网接入服务器等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.20

867

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

nginx手册
nginx手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习