这篇文章将向您分享我们的一个 OpenResty XRay 的客户使用我们的工具识别和修复了他们 Kong API 网关 CPU 瓶颈的成功案例。Kong 是基于我们开源 OpenResty 软件开发的一个强大而灵活的 API 网关。然而,有时扩展 Kong 功能的自定义插件可能会引入性能问题或者难以发现和调试的 bug。这就是为什么我们的客户决定使用 OpenResty XRay,这是一个非侵入式的高效工具,可以监控和分析包括 Kong 在内的所有 OpenResty 应用程序的性能。

问题:Kong 服务器中的高 CPU 使用率

我们的客户注意到他们的 Kong 服务器消耗的 CPU 资源比预期的多,即使进入的 API 流量不是很高。他们怀疑在他们的自定义插件中可能存在一些低效之处或者错误,但不知道从哪里开始查找。他们需要一个工具,可以帮助他们找出 CPU 瓶颈的根本原因,并就如何解决这一问题提供可行性建议。

分析和报告

客户在他们的 Kong 服务器上安装了 OpenResty XRay,并将其配置为定期或当 CPU 使用率激增时自动对在线的 Kong 进程进行采样。OpenResty XRay 还会每小时自动更新当天的分析报告,这样我们的客户和我们的团队就可以看到最新的性能数据。

我们在报告中首先注意到的是 CPU 部分的以下热代码路径:

<a href="https://openresty.com.cn/cn/xray/">OpenResty XRay</a> 报告中的 CPU 部分

该代码路径显示,string.lower 标准函数抛出了 Lua 异常,该函数将输入字符串的所有字符转换为小写。异常在大多数编程语言及其实现中都是昂贵的操作,因为它们通常需要进行 stack unwinding 和错误处理。我们想知道这些异常是怎么发生的以及它们来自哪里。

将鼠标悬停在代码路径中的 Lua 或 C 函数上,我们可以看到 Lua 的源位置,包括文件名和行号。

Lua 代码路径中的 Lua 源位置

报告还向我们展示了 CPU 火焰图,并用红色高亮了这个热代码路径:

为了确认我们的发现,我们还查看了同一份报告中的“错误与异常”部分,其中显示了以下错误信息:

<a href="https://openresty.com.cn/cn/xray/">OpenResty XRay</a> 报告中的错误部分

错误信息显示"bad argument #1 to 'lower' (string expected, got nil)",这意味着 Lua 代码向lower函数传递了nil值,而该函数期望得到的是一个字符串参数。通过查看其父函数帧[builtin#string.lower],我们知道这是 Lua 内置函数string.lower。从报告中,我们还了解到这个异常是从源文件.../kong/plugins/auth/handler.lua的第 35 行抛出的。

有趣的是,这个 Lua 异常实际上是被 pcall 捕获的,pcall 是一个在保护模式下调用另一个函数的 Lua 函数,这意味着它可以在不中断整个 Lua 处理程序的情况下捕获任何错误。这就是为什么在 Kong 的错误日志文件中没有发现任何有用的信息。

在这一点上,我们已经有足够的信息来得出结论,客户自己的authKong 插件中存在一个 bug,它误用了标准的 Lua API 函数string.lower。修复方法也很简单:只需避免向.../kong/plugins/auth/handler.lua 中第 35 行的 string.lower 传递 nil 值即可。

结果:提高了性能,降低了 CPU 使用率

在对其自定义 auth 插件进行修复后,客户发现其 Kong 服务器的性能得到了显著提升。

从图中我们可以看到,在相同的 API 流量下,CPU 的平均使用率从 80% 下降到了 50%。CPU 资源的消耗降低了 37.5%!我们的客户对这一结果非常满意,并对我们的帮助表示感谢。

结论

这篇文章展示了 OpenResty XRay 如何帮助我们的客户找到并修复了他们自定义的 Kong 插件中意外的 Lua 异常所导致的 CPU 瓶颈问题。通过使用 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. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:

我们的微信公众号

翻译

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