B 站近日揭橥了一篇关于去年那场大事件的回顾文章《2021.07.13 我们是这样崩的》,本文将从 OpenResty 的角度还原此事宜的办理过程。
去年,OpenResty Inc. 团队利用商业产品 OpenResty XRay 的动态追踪技能参与 B 站文章中所描述的重大线上事件后,在很短的韶光内定位了导致 B 站线上做事不可用的问题根源,并帮助办理重大线上事件。
B 站基于开源 OpenResty 开拓了他们的内部网关系统。

B 站当时所有线上做事器的 OpenResty 进程总是占用 CPU 100%,但不能处理任何要求。重启无法规复,回滚他们最近的业务代码变更也无法规复。所有做事器都有这个问题。
B 站是我们的 OpenResty XRay 产品的商业客户。OpenResty XRay 是一款基于动态追踪技能的系统故障排查和性能优化软件。事件发生一段韶光后,B 站的运维团队联系到我们,希望我们能帮助剖析线上的一个严重问题。
事件剖析过程我们首先通过线上由 OpenResty XRay 产品自动采样的 C 措辞级别 CPU 火焰图,确定了他们的 OpenResty 的 nginx 进程的险些所有 CPU 韶光都花费在实行 Lua 代码上面。
出于对客户的隐私保护和数据安全,这张图里只显示了 OpenResty 开源软件里的函数帧,隐去了 B 站自己的 Lua 代码干系的信息。
然后我们再通过 OpenResty XRay 自动采样的 Lua 措辞级别的 CPU 火焰图确认了险些所有的 CPU 韶光都花费在了单条 Lua 代码路径上。看起来是那条 Lua 代码路径发生了去世循环。我们的 Lua CPU 火焰图定位的 Lua 代码路径可以精确到代码行级别。
同样地,我们只保留了不敏感的开源代码的函数帧。
B 站原文中提到的 Lua 火焰图便是 OpenResty XRay 在 B 站生产做事器上采样有问题的 OpenResty 做事进程得到的。
OpenResty XRay 在 B 站线上天生火焰图也就花费了几十秒到几分钟的韶光,由于利用 100% 非侵入的动态追踪技能,全体过程不须要对 B 站的进程和运用进行任何修正。
根据 Lua 火焰图终极确认根源问题是 B 站的业务往配置元数据写入了个字符串类型的权重 0 值的坏数据(即 “0”),而 OpenResty 的 lua-resty-balancer 库的 Lua API 期望的是数值类型的权重值,从而导致了无限递归和无限循环。
LuaJIT 的即时( JIT)编译器在这里并没有 bug。之以是最初疑惑是 JIT 编译器的问题是由于对应的 Lua 代码路径乍一看并没有任何问题,同时 B 站另一个业务团队未奉告的操作也对线上做事产生了影响。字符串 0 和数值 0 的差异是非常奇妙的。终极我们打消了 JIT 编译器的 bug 可能性,确定了字符串 0 这个问题根源。
事件后续修复和加固
B 站在业务层面确保不会再有字符串类型的上游做事器的权重值被写入配置数据。
OpenResty XRay 新版也供应了打印 Lua 调用栈上所有局部变量的值的新功能,可以让类似问题被更快更直接地定位。
我们事后也对开源 OpenResty 的 lua-resty-balancer 库针对这种 API 误用进行特殊加固,确保任何误传的字符串类型的权重值总是会被逼迫转成数值类型。
结语事件终极得到完美办理。除了 B 站,OpenResty XRay 也曾经成功地帮助 Zoom、微软、去哪儿网等很多公司在线上定位和优化了很多线上问题,包括从高 CPU 波峰到高内存利用,再到内存泄露、非常的要求延时、高硬盘 IO 等各种问题。
OpenResty XRay 目前可以自动针对 OpenResty、Nginx、LuaJIT、PHP、Python、Perl、Go、PostgreSQL、Redis 等各种不同的开源软件以及运行在这些开源软件之上的客户业务代码进行深入的剖析和监控。未来我们还会陆续加入对更多技能栈的支持,包括 Java、Ruby 等。用户利用 OpenResty XRay,可以快速创造和精准定位各种性能问题、功能问题和安全问题, 从而担保运用的稳定性。
OpenResty XRay 中利用的 Lua 措辞级别的 CPU 火焰图工具在这里有中文教程先容。OpenResty XRay 利用的是增强过的私有动态追踪技能,感兴趣的同学可以参考我年初时写的系列文章:《Ylang: Universal Language for eBPF, Stap+, GDB, and More》。
关于作者
章亦春是开源项目 OpenResty® 的创始人,同时也是 OpenResty Inc. 公司的创始人和 CEO。他贡献了许多 Nginx 的第三方模块,大量 Nginx 和 LuaJIT 核心补丁,并且设计了 OpenResty XRay、OpenResty Edge 和 OpenResty Showman 等产品。