Lua 高 CPU 占用排查:快速定位 Nginx/OpenResty 中最热的 Lua 代码路径
当 Lua 代码导致 Nginx 或 OpenResty 服务器 CPU 占用飙高时,最快的解决办法是对线上工作进程进行实时剖析,找出最热的 Lua 代码路径。在本教程中,OpenResty XRay 将一个 CPU 占用 97% 的工作进程的问题,定位到 processor.lua 第 29 行 gen_order_md5 函数中循环执行的 MD5 计算——全程无需修改或重启该进程。
症状:一个 Nginx 工作进程占用近 100% CPU
首先运行 top 命令,检查目标服务器上的 CPU 使用情况。如您所见,一个 Nginx 工作进程占用了将近 100% 的 CPU 核心资源。
使用引导式分析定位最热的 Lua 代码路径
现在让我们来使用 OpenResty XRay 检查这个未经修改的进程。我们可以对它进行实时分析,找出问题所在。
打开 OpenResty XRay web 控制台并登录,确保您正在分析正确的服务器,然后进入引导式分析页面。这里可以看到您能够分析的不同类型的问题。选择 High CPU 问题类型。
选择应用程序,然后选择消耗 97% CPU 资源的进程。
确保应用程序的类型是正确的。通常默认值就是正确的。OpenResty XRay 可以同时分析多种语言级别。这里我们保持 Lua 和 C 都选中的状态。
还可以设置最大分析时间,这里保留默认值 300 秒,然后开始分析。系统会持续进行多轮分析。对于本例,第一轮分析已经足够,我们停止分析。可以看到自动创建了一个报告。
报告显示了占用最多 CPU 时间的最热 Lua 代码路径。
点击这里查看更多细节。
解读 Lua CPU 火焰图
报告中还有一张 Lua CPU 火焰图,最热的代码路径用红色标识出来。
最热的 Lua 代码路径涉及 MD5 计算函数的调用。
之后的调用函数都来自目标应用程序的业务代码。
跳转到精确的 Lua 源代码行
从 gen_order_md5 Lua 函数开始,在应用程序业务代码中找到精确的源代码行。
当我们将鼠标悬停在函数的绿色框上时,可以在出现的提示中看到 Lua 源文件 processor.lua 的完整路径。
源代码行号是 29。
点击图标复制这个函数的完整 Lua 源文件路径。
使用 VI 编辑器,将我们刚刚复制的代码路径粘贴到这里,查看相应的业务 Lua 代码。您可以使用任何您喜欢的编辑器。
从之前的报告中,我们知道代码在第 29 行。
可以看到这行 Lua 源代码确实包含了一个循环内的 md5 计算。
它也在报告中显示的 gen_order_md5 函数中。
本例中我们能拿到业务源码;如果热点落在没有源码的第三方“黑盒”模块里,OpenResty XRay 同样能定位到具体行——见当“黑盒”插件吃掉 45% CPU,我们如何在无源码情况下定位到 Lua 第 93 行。
通过 Insights 报告自动监控 Lua CPU 占用
OpenResty XRay 也可以自动地监控在线进程,并显示分析报告。您可以在 Insights 页面中找到以日和周为周期生成的报告。关于这些自动报告涵盖哪些分析维度、如何解读,见OpenResty XRay 的自动分析报告。
因此,您不是必须使用引导式分析功能。当然,引导式分析对于应用程序开发和演示是很有用的。
OpenResty XRay 是一个基于我们自己的动态追踪技术开发的非侵入式诊断系统。它可以实时监控和扫描性能问题、行为问题和安全漏洞。
如果你喜欢这个教程,请订阅这个博客网站和我们的 YouTube 频道 或 B 站频道。谢谢!
常见问题
为什么我的 Nginx 工作进程 CPU 占用接近 100%?
在本例中,Nginx 工作进程几乎吃满一整个 CPU 核心,原因是一条很热的 Lua 代码路径:应用业务代码中在循环里执行的 MD5 计算。要找出您自己服务器上是哪条 Lua 代码路径在消耗 CPU,就需要对线上进程进行实时剖析。
如何找出是哪段 Lua 代码在消耗 CPU?
使用 OpenResty XRay 的引导式分析功能:选择 High CPU 问题类型,选中占用 CPU 的工作进程,并保持 Lua 和 C 两个语言级别同时选中。生成的报告会展示最热的 Lua 代码路径、用红色标出热路径的 Lua CPU 火焰图,以及精确的源文件和行号——在本教程中是 processor.lua 第 29 行。
分析 Lua CPU 占用需要重启 Nginx 吗?
不需要。OpenResty XRay 对这个未经修改的 Nginx 进程进行了实时分析,全程没有重启进程,也没有改动任何代码。它是基于动态追踪技术的非侵入式诊断系统,还可以自动监控在线进程,在 Insights 页面生成日报和周报。
关于 OpenResty XRay
OpenResty XRay 是一个动态追踪产品,它可以自动分析运行中的应用程序,以解决性能问题、行为问题和安全漏洞,并提供可行的建议。在底层实现上,OpenResty XRay 由我们的 Y 语言驱动,可以在不同环境下支持多种不同的运行时,如 Stap+、eBPF+、GDB 和 ODB。
关于本文和关联视频
本文和相关联的视频都是完全由我们的 OpenResty Showman 产品从一个简单的剧本文件自动生成的。
关于作者
章亦春是开源 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. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:
翻译
我们提供了英文版原文和中译版(本文)。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!





































