【ArchSummit】如何通过AIOps推动可量化的业务价值增长和效率提升?>>> 了解详情
写点什么

OpenResty XRay 如何分析和解决 B 站重大线上事故

  • 2022-07-20
  • 本文字数:1691 字

    阅读完需:约 6 分钟

OpenResty XRay如何分析和解决 B 站重大线上事故

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 等产品。

2022-07-20 17:335528

评论

发布
用户头像
该评论已删除
2022-07-27 10:24
回复
同意,既然是商业软件,鲁棒性必须保证,不可能全靠客户遵守规范
2022-07-27 17:34
回复
看清楚,openresty不是商业软件
2023-01-05 17:26 · 福建
回复
"B 站是我们的 OpenResty XRay 产品的商业客户。"
2023-01-12 23:37 · 北京
回复
查看更多回复
没有更多了
发现更多内容

Eureka 源码之客户端注册

悟空聊架构

Eureka 源码剖析 注册中心 悟空聊架构

架构训练营毕业总结

小卷儿

算法—算法的时间空间复杂度

思想者杰克

HashMap 中的一个“坑”!

王磊

Java hashmap LinkedHashMap

电商秒杀系统

伏波

架构

央行数字货币即将破茧,一场大变局,震撼全球!

CECBC

布局人工智能,银行有的不只是智能客服

CECBC

20道阿里面试必问JVM面试专题(文末附送答案及JVM学习文档)

编程 程序员 JVM

区块链+农业开启智能化生产时代 解决世界性食品及粮食安全问题

CECBC

如何在实际场景中使用异常检测?阿里云Prometheus智能检测算子来了

阿里巴巴云原生

阿里云 云原生 Prometheus 异常检测

【死磕Java并发】-----深入分析synchronized的实现原理

chenssy

死磕 Java 死磕 Java 并发

开源项目——swift开发记事本APP

思想者杰克

区块链的抽象与演进

CECBC

架构课毕业总结

伏波

架构

干货!Spring Cloud微服务架构进阶,你还不了解的都在这里

Java 程序员 架构 微服务 SpringCloud

SAP CRM和C4C的内容管理(Content Management)

Jerry Wang

内容 CRM C4C 11月日更

软件架构治理 之 架构混沌之谜

码猿外

架构 软件架构治理

杂谈——什么是Google Fuchsia ?

思想者杰克

模块7作业

4anonymous

赋能优秀传统文化,区块链助力讲好中国故事

CECBC

面试必备!阿里内部Java面试八股文出炉,教科书式完美回答

Sakura

Java 程序员 架构 面试

开源项目——FLutter开发录音APP

思想者杰克

北鲲云超算平台如何成为就生命科学云计算领域先行者?

北鲲云

新消费:如何度过从0到1的破局期?

石云升

学习笔记 11月日更 新消费

十年数据库专家,呕心力作MySQL技术精粹,薪资直涨3K其实很轻松

数据库 程序员 MySQL 数据库

模块七作业

Geek_fc100d

「架构实战营」

阿里大牛教你如何用Dubbox+SpringBoot+Docker架构,实现双11项目

编程 程序员 springboot

pygame 小游戏前的准备工作要做足

梦想橡皮擦

11月日更

大牛呕心力作——Kafka开发实战,助你徜徉大数据时代

redis 程序员 java编程

云知声 Atlas 超算平台: 基于 Fluid + Alluxio 的计算加速实践

阿里巴巴云原生

阿里云 云原生 实践 Fluid Alluxio

王者荣耀商城异地多活架构设计

guangbao

OpenResty XRay如何分析和解决 B 站重大线上事故_开源_章亦春_InfoQ精选文章