写点什么

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:336089

评论

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

Go 语言异常处理

FunTester

中移动集团SRE人员能力提升培训圆满结课

雅菲奥朗

DevOps 运维 SRE SRE培训 SRE认证

Ubuntu安装Docker Engine

百度搜索:蓝易云

公司最大的内卷,偷偷做单元测试

禅道项目管理

项目管理 程序员 软件测试 单元测试 测试人员

MES系统如何支持多品种小批量生产

万界星空科技

工业互联网 制造业 生产管理系统 mes 万界星空科技

统一多层网关好处多,阿里云云原生 API 网关打造全能型网关

阿里巴巴云原生

阿里云 云原生 云原生API

关于 API 你应该知道的一切

幂简集成

API

Docker中jdk8容器里无法使用JDK的jmap等命令的问题

百度搜索:蓝易云

行业智能化的“火车头效应”,由星河AI金融网络启动

脑极体

AI 网络 通信

关于智能编码助手【通义灵码】,开发者们这么说...

阿里巴巴云原生

阿里云 云原生 通义灵码

关于智能编码助手【通义灵码】,开发者们这么说...

阿里云云效

阿里云 云原生 通义灵码

RPA的九大主要特征:全面优化业务流程的利器

八爪鱼采集器︱RPA机器人

RPA 自动化 RPAxAI

新时代下,作为IT 管理员的我们如何快速构建一个安全高效的IT 体系

coxi_vv

1Panel 运维效率

无人驾驶,并非无人之地

自象限

人工智能 自动驾驶 AI

SQLAlchemy 在 Python 中的同步与异步操作及CRUD实现指南

代码忍者

元宇宙虚拟展厅是如何制作、配置和维护的?

3DCAT实时渲染

云展厅 元宇宙开发 元宇宙解决方案 元宇宙线上虚拟展厅

软件测试岗位的经典面试题

老张

软件测试 面试题 职场成长 面试求职

Percona Toolkit 神器全攻略(开发类)

GreatSQL

PPT时间轴怎么画?用这款AI工具自动生成,告别手绘!

职场工具箱

职场 PPT 绘图工具 时间轴制作软件 AI生成PPT

聊聊 PHP 多进程模式下的孤儿进程和僵尸进程

不在线第一只蜗牛

热仿真 散热仿真分析公司-CAE软件服务代做外包

Geek_2d6073

员工绩效管理工具软件哪个好?2024年九大软件综合对比

爱吃小舅的鱼

研发团队 绩效管理 绩效管理软件

聚伙伴,创价值,享未来——2024年锐科信息赋能伙伴加速智能化沙龙活动圆满举行

叶落便知秋

哈银消费金融:深耕消保与风控 稳健展现发展潜力

Geek_2d6073

好玩的js特效

百度搜索:蓝易云

php解决time()时间戳超过2038年出错问题的解决方案

百度搜索:蓝易云

稳健前行,合规筑基:哈银消费金融在变革中引领稳健增长新篇章

Geek_2d6073

解锁未来财富密码:AI自动化副业创收班——终身财富加速器

霍格沃兹测试开发学社

GitHub星标破万!Python学习教程(超详细),真的太强了!

我再BUG界嘎嘎乱杀

Python 编程 后端 开发语言 学习教程

Docker镜像解析获取Dockerfile文件

百度搜索:蓝易云

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