线上快速定位 CPU 最热的 PHP 代码路径(使用 OpenResty XRay)
今天我将一步一步向您展示一个使用 OpenResty XRay 分析 PHP 应用的例子。我们将快速定位一个已经在运行的 PHP 进程中最热的代码路径。这些代码路径消耗最多的 CPU 时间,会影响您应用的性能。OpenResty XRay 是真正的非侵入式动态分析,无需在目标应用中安装任何特殊模块或插件,无需重新编译目标应用,甚至无需重启已经在运行的进程。
问题:高 CPU 使用率
先运行 top
命令来检查目标进程的 CPU 使用情况。
可以看到,这个 php
进程消耗了 100% 的 CPU 资源。
运行 ps
命令来查看这个进程的详情。这个 php
二进制可执行文件是 Linux 发行版自带的。
使用 OpenResty XRay 的引导式分析功能定位 CPU 最热的 PHP 代码路径
让我们使用 OpenResty XRay 来检查这个未经修改的进程。您可以对它进行实时分析,并找出原因。
在浏览器中打开 OpenResty XRay 的 Web 控制台。
确保我们当前分析的是正确的机器。
如果当前显示的机器不对,您可以从下面的列表中选择一个正确的。
进入 “Guided Analysis” 页面。
这里可以看到系统能分析的不同类型的问题。
让我们选择 “High CPU Usage”。
点击 “Next”。
选择之前的 PHP 应用实例。
选择消耗 100% CPU 资源的进程。也就是我们之前在 top
中看到的。
确保应用的类型是正确的。通常默认值就是对的。
OpenResty XRay 可以在多种不同语言的级别上进行分析。这里保持 PHP 和 C/C++ 都选中。
我们还可以设置最长的分析时间。这里保持默认的 300 秒不变。
开始分析。
系统将持续执行多轮分析。现在它正在运行第一轮分析。
第一轮已经完成,现在进入第二轮分析。对这个例子来说,运行一轮就够了。
停止分析。
可以看到自动生成了一份分析报告。
这是现在我们要分析的问题类型,CPU。
这是占用 CPU 时间最多的 PHP 代码路径。
最热的函数调用是 preg_match
。它是正则匹配的 PHP 层面的封装。
processOrders
函数属于业务代码。
callAction
是 Laravel 框架中的一个方法,用于调用控制器中的指定动作。
将鼠标悬停在 processOrders
函数的绿框上。在提示框中可以看到这个 PHP 源文件路径。
这行源码的行号是 437。
复制它的源文件路径。
使用 Vim 编辑器打开它的源文件。然后查看该文件中的 PHP 代码。您可以使用任何您喜欢的编辑器。
按照 OpenResty XRay 的建议,跳转到第 437行。
可以看到,preg_match
的调用和报告相符。由于正则匹配是在循环中多次进行的,我们可以预编译正则表达式来优化性能。
这行源代码位于函数 processOrders
内部。
点击 “More”。
这条热代码路径是由这个 PHP 语言级别的 CPU 火焰图自动推导出来的。
下面是对问题更详细的解释和建议。它提到了我们之前看到的 preg_match
函数。
看一下这条占用 CPU 时间最多的 C 代码路径。
pcre2_match_8
函数是 PCRE2 库的一部分。
php_pcre_match_impl
函数内部调用 PCRE2 实现正则匹配功能。
php_do_pcre_match
用于实现 preg_match
函数。它使用正则表达式对字符串进行匹配。
zend_execute_scripts
函数用于执行 PHP 脚本。显然,这和我们刚刚看的 PHP 热代码路径相似。
全自动分析与报告
OpenResty XRay 也可以自动监控在线进程,并生成分析报告。切换到 “Insights” 页面。
您可以在 “Insights” 页面中找到以日和周为周期的自动报告。其实您不是非得用 “Guided Analysis” 功能。
当然,“Guided Analysis” 对于应用的开发和演示是很有用的。
如果您喜欢这个教程,请订阅这个博客网站和我们的 YouTube 频道 或 B 站频道。谢谢!
关于 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. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:
翻译
我们提供了英文版原文和中译版(本文)。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!