要找出哪个 Kong 插件最耗内存或 CPU,OpenResty XRay 会对运行中的 Kong 网关进程采样,把资源用量按插件逐个拆开——免重启、免改代码、也无需特殊构建的 Kong。在下面这个案例中,bot-detection 插件占用了最多内存,而 prometheus 插件消耗了最多 CPU。

Kong 是基于我们的开源 OpenResty 框架构建的一款流行的 API 网关软件,它有灵活的插件机制,既包括社区插件,也包括您自己编写的插件。但这些插件可能会导致 CPU 瓶颈、高内存使用或内存泄漏,而且往往很难判断到底是哪一个在制造麻烦。OpenResty XRay 是一款动态追踪产品,它能在在线进程上直接回答这个问题——高效且安全,就像对您的软件进行 X 光检查一样。您只需将它指向 Kong 进程即可,不必安装任何特殊插件,也不必重新构建 Kong。

在这篇文章中,我们将向您展示如何使用 OpenResty XRay 来分析服务器进程中 Kong 插件的 CPU 和内存使用情况,并给出真实的结果示例,解释它们的含义。

服务器进程中所有 Kong 插件的 CPU 使用情况

OpenResty XRay 可以对 Kong 进程进行一段时间的采样,从几秒到几分钟,这取决于该进程的繁忙程度。然后,它会向您展示 CPU 时间是如何在所有当前加载的插件之间分配的。

例如,这是由 OpenResty XRay 为一个 Kong 进程生成的饼图:

CPU 时间在所有加载的插件中的使用分布情况

如您所见,在这种情况下,prometheus插件占用了大部分 CPU 时间,其次是ip-restriction插件。其他插件的 CPU 使用量可以忽略不计。这意味着,如果您想优化 Kong 服务器的 CPU 性能,您应该关注这两个插件,看看是否可以改进或替换它们。

当然,这只是一个例子。在更复杂的 Kong 服务器中,您可能会看到更多的插件出现在这里,并且分布情况可能会根据流量和配置而有所不同。

Kong 插件中的 CPU 使用情况

OpenResty XRay 也可以帮助您深入了解所有 Kong 插件的详细信息,并查看哪些 Lua 或 C 代码路径消耗了更多的 CPU 时间。其中一个简单的方法是查看 Lua-land CPU 火焰图,如下所示:

这张图显示了采样期间在 CPU 上运行的 Lua 代码的调用栈。条形越宽,占用的 CPU 时间就越多。您可以将鼠标悬停在条形上以查看更多信息,例如函数名,文件名,行号,和 CPU 时间的百分比。

通过查看这张图,您可以快速发现您 Lua 代码中的热点或性能问题,并相应地进行优化。您还可以比较不同的插件或同一插件的不同版本,看看它们在 CPU 使用方面有何不同。

当某个插件不只是"重"、而是异常"烫手"时,同样的火焰图能揭示原因。举一个实际案例:看我们如何把一次 Kong 的 CPU 瓶颈定位到自定义插件里隐藏的 Lua 异常,一路追到那个出问题的 string.lower 调用。

服务器进程中所有 Kong 插件的内存使用情况

同样,OpenResty XRay 可以轻松地对 Kong 服务器进程内的内存使用情况进行采样。

下面是由 OpenResty XRay 为同一 Kong 进程生成的另一个饼状图:

所有加载的 Kong 插件的内存使用分布

可以看到,在这种情况下,bot-detection插件占用了大部分内存,prometheus插件紧随其后。其他插件的内存使用量要低得多。这意味着如果您想减少 Kong 服务器的内存占用,您应该研究这两个插件,看看是否可以对它们进行优化或替换它们。

同样,这只是一个例子。在不同的 Kong 服务器中,您可能会看到不同的结果,这取决于配置的插件和其他设置。

Kong 插件中的内存使用情况

OpenResty XRay 也可以帮助您分析 Kong 插件内 Lua GC 对象的内存使用情况。一种简单的方法是查看 GC 对象引用火焰图,它显示了内存在所有 GC 对象引用路径上的使用分布情况。

这张图展示了在采样期间占用内存的 Lua GC 对象的引用路径。条形越宽,所占内存就越多。您可以将鼠标悬停在某个条形上,查看更多信息,如对象类型、大小和内存百分比。

通过查看这张图,您可以快速发现您 Lua 代码中存在的内存泄漏或效率低下的问题,并相应地进行优化。您还可以比较不同的插件或同一插件的不同版本,看看它们在内存使用方面有何不同。

如果某个 Kong 插件的内存随时间持续攀升,同样的 GC 对象引用火焰图能把泄漏的引用路径追到持有内存的对象——免重启、免改代码。想进一步追到源码行,完整方法见我们的生产环境内存泄漏排查流程;也可以看一个真实案例:我们如何把一次 Lua GC 内存泄漏定位到被缓存的 SSL 证书

服务器的额外负担

您可能想知道使用 OpenResty XRay 是否会影响 Kong 服务器的性能。答案是不会。当采样时,添加到 Kong 服务器进程的额外负担通常非常小,可以忽略不计。而在不采样的时候,进程运行速度则完全不受任何影响。

OpenResty XRay 的设计理念是非侵入性和轻量级。它不会干扰您的正常操作,也不需要对您的代码或配置进行任何更改。

常见问题

哪个 Kong 插件最耗内存?

这取决于您的插件和流量,因此唯一可靠的答案是实测您自己的网关。在本文采样的这个进程中,bot-detection 插件占用了最多内存,prometheus 紧随其后。OpenResty XRay 会在运行中的 Kong 进程上把内存按加载的插件逐个拆开,让您在自己的环境里看到真正的"耗内存大户"——无需特殊构建。

如何查出某个 Kong 插件的内存泄漏?

OpenResty XRay 的 GC 对象引用火焰图会显示占用内存的引用路径,以及对象类型和大小。当某个插件的内存持续攀升时,这张图能定位到泄漏的引用路径,免重启、免改代码。完整方法(从 RSS 曲线一路追到源码行)见我们的生产环境内存泄漏排查流程

哪个 Kong 插件最耗 CPU?

同样,实测胜过猜测。在采样的这个进程中,prometheus 插件占用了最多 CPU 时间,其次是 ip-restriction。OpenResty XRay 会把采样到的 CPU 时间分摊到所有加载的插件上,其 Lua-land CPU 火焰图还能深入到某个插件内部的具体热代码路径。

用 OpenResty XRay 分析 Kong 插件会带来额外开销吗?

采样时添加到 Kong 服务器进程的额外开销通常小到可以忽略;不采样时,进程完全全速运行。OpenResty XRay 是非侵入式的:不需要改动您的 Kong 代码或配置,也不需要任何特殊插件或构建选项。

下一步的计划

我们并未止步于此。未来还有更多让 OpenResty XRay 对您来说更加强大和有用的计划。我们正在开发的一些功能包括:

  • 显示 Kong 不同插件间的磁盘 I/O,网络 I/O 和其他资源指标的实时分布情况。这将帮助您识别系统中的瓶颈或热点,并相应地进行优化。
  • 支持其他技术栈和开源软件。我们希望使 OpenResty XRay 成为一种通用工具,可以分析任何在线应用程序,无论底层技术是什么。我们考虑的一些目标包括 Nginx 模块,Envoy 扩展,PostgreSQL 扩展,Perl/Python/Ruby 模块和库,以及更多。

如果您有任何建议或对更多指标或功能的需求,请告诉我们。我们一直在倾听您的反馈,并持续改进我们的产品以满足您的需求。

结论

在本文中,我们向您展示了如何使用 OpenResty XRay 来分析服务器进程中 Kong 插件的 CPU 和内存使用情况。我们还向您展示了一些结果的示例,并解释了它们的含义。

通过使用 OpenResty XRay,您可以轻松找出哪些插件比其他插件消耗更多资源,以及它们对整体性能有多大的影响。然后,您可以使用这些信息来优化您的 Kong 服务器,使其运行得更快更顺畅。

如果您想更多地了解 OpenResty XRay 产品以及它能够如何帮助您处理在线应用的其他方面的信息,请访问我们的网站联系我们以了解更多细节。

关于作者

章亦春是开源 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. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:

我们的微信公众号

翻译

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