我们是如何解决了一个自定义 Kong 插件中的 Lua 异常所引起的 CPU 瓶颈的(使用 OpenResty XRay)
这篇文章将向您分享我们的一个 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 部分的以下热代码路径:
该代码路径显示,string.lower 标准函数抛出了 Lua 异常,该函数将输入字符串的所有字符转换为小写。异常在大多数编程语言及其实现中都是昂贵的操作,因为它们通常需要进行 stack unwinding 和错误处理。我们想知道这些异常是怎么发生的以及它们来自哪里。
将鼠标悬停在代码路径中的 Lua 或 C 函数上,我们可以看到 Lua 的源位置,包括文件名和行号。
报告还向我们展示了 CPU 火焰图,并用红色高亮了这个热代码路径:
为了确认我们的发现,我们还查看了同一份报告中的“错误与异常”部分,其中显示了以下错误信息:
错误信息显示"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 的错误日志文件中没有发现任何有用的信息。
在这一点上,我们已经有足够的信息来得出结论,客户自己的auth
Kong 插件中存在一个 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、LuaJIT、GDB、SystemTap、LLVM、Perl 等,并编写过 60 多个开源软件库。
关注我们
如果您喜欢本文,欢迎关注我们 OpenResty Inc. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:
翻译
我们提供了英文版原文和中译版(本文)。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!