OpenResty XRay 是一个基于经过我们改进的动态追踪技术开发的性能分析和问题诊断平台。它可以分析和诊断各种技术栈和软件,包括 Linux 内核、Go、OpenResty/Nginx、PHP、Python、Perl 等。在开发和测试 OpenResty XRay 的过程中,我们经常发现开源软件和工具链中的许多 bug。毕竟,OpenResty XRay动态追踪技术提高到了前所未有的水平。我们针对各种技术栈和软件的分析工具比那些针对 SystemTap, DTrace, 和 eBPF 的开源工具要复杂得多。因此,我们的测试集经常对 Linux 内核、eBPF, LLVM, SystemTap, GDB 等造成前所未有的压力。高压力自然能捕捉到更深的 bug。

在本文中,我们打算介绍 Linux 内核追踪子系统中的两个 bug。这两个 bug 会影响 Linux 中与动态追踪相关的所有工具和框架。幸运的是,OpenResty XRay 可以绕过其中一个 bug,也可以保护我们的客户不踩另一个 bug 的坑。

读取用户空间内存时的内核死锁

Linux 的官方主线内核从 5.19 到 6.2 的系列上有一个相对较严重的衰退。mm 子系统的一个内核开发者改变了用户空间内存读取的实现方式,导致在 NMI 上下文(如 perf 事件)中追踪子系统读取用户空间内存时出现死锁,这个 bug 在 6.3 系列中被修复。开源的 eBPF 工具链(包括 perf 和 bcc)都受此影响。我们向开源的 SystemTap 提交了一个绕过这个 bug 的补丁,并在我们的 OpenResty XRay 平台的 eBPF+ 运行时中解决了这个问题。这个 bug 可以通过运行我们的 OpenResty XRay 测试集来复现。

由此可见,我们必须更积极地测试最新的主线内核;否则,这样一个严重的衰退就会影响很多的内核版本系列。

根据我们的经验,Ubuntu 和 Debian 通常不会向后移植补丁。相反,Red Hat 会非常勤快地向后移植这些补丁(当然,有时 Red Hat 也向后移植有问题的补丁,引入新的 bug,下面我们将会看到这样一个案例。

内核中 x86 断点插入的数据竞争

从 5.2 到 5.4 系列,Linux 的官方主线内核有一个严重的衰退。一个开发者在重构 x86(包括 x86_64)上的动态断点插入代码时,脑子抽了一下。他根本没有考虑并发和并行访问的情况,而是直接将多线程场景当作单线程场景来编程,并在内核上下文中不加保护地读写全局变量,这就相当于裸奔。

有趣的是,原本不受影响的 CentOS/RHEL 7 的 3.10 内核也受到了影响,因为 Red Hat 勤快地向后移植了这个有问题的补丁。幸运的是,过了一段时间,Red Hat 也勤快地向后移植了这个衰退的修复。Ubuntu 和 Debian 的 5.2 ~ 5.4 内核不会像往常一样向后移植修复。幸运的是,这个 bug 通常发生在有很多 CPU 核心的情况下。我们在我们的 OpenResty XRay 产品中将所有有这个 bug 的内核列入黑名单,但用户依然可以通过强制选项绕过我们的保护。

这个 bug 会影响所有涉及动态追踪、eBPF、SytemTap、Dtrace 等的 x86 工具。没有(已知的)方法可以绕过它,因为它太底层了,直接出现在特定架构的机器汇编指令级别上。

结论

在本文中,我们介绍了两个我们使用 OpenResty XRay 发现的 Linux 内核中的追踪 bug。这些 bug 有着深远的影响,影响了许多依赖动态追踪技术实现的工具和框架。我们解释了这些 bug 产生的原因和影响,以及它们在主线内核中被修复的时间。希望这篇文章能够帮助其他遇到类似问题的开发者和用户,并提高对定期测试和更新内核重要性的认识。

关于 OpenResty XRay

OpenResty XRay 是一个动态追踪产品,它可以自动分析运行中的应用程序,以解决性能问题、行为问题和安全漏洞,并提供可行的建议。在底层实现上,OpenResty XRay 由我们的 Y 语言驱动,可以在不同环境下支持多种不同的运行时,如 Stap+、eBPF+、GDB 和 ODB。

关于作者

章亦春是开源 OpenResty® 项目创始人兼 OpenResty Inc. 公司 CEO 和创始人。

章亦春(Github ID: agentzh),生于中国江苏,现定居美国湾区。他是中国早期开源技术和文化的倡导者和领军人物,曾供职于多家国际知名的高科技企业,如 Cloudflare、雅虎、阿里巴巴, 是 “边缘计算“、”动态追踪 “和 “机器编程 “的先驱,拥有超过 22 年的编程及 16 年的开源经验。作为拥有超过 4000 万全球域名用户的开源项目的领导者。他基于其 OpenResty® 开源项目打造的高科技企业 OpenResty Inc. 位于美国硅谷中心。其主打的两个产品 OpenResty XRay(利用动态追踪技术的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最适合微服务和分布式流量的全能型网关软件),广受全球众多上市及大型企业青睐。在 OpenResty 以外,章亦春为多个开源项目贡献了累计超过百万行代码,其中包括,Linux 内核、Nginx、LuaJITGDBSystemTapLLVM、Perl 等,并编写过 60 多个开源软件库。

关注我们

如果您喜欢本文,欢迎关注我们 OpenResty Inc. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:

我们的微信公众号

翻译

我们提供了英文版原文和中译版(本文)。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!