线上定位 Perl 进程中最大的内存对象
想知道运行中的 Perl 进程把内存花在哪,用 OpenResty XRay 剖析它即可:它挂载到未经修改的进程上,按占用内存对活着的 Perl 对象和值排序,并通过数据引用路径把最大的那个追溯回确切的变量与源码行——无需改代码、无需重启。
本教程用 OpenResty XRay 的引导式分析和我们自研的 Perl 对象内存分布火焰图完整走一遍:在一个真实案例里,一个 180MB 的 Perl 进程,其内存最终被定位到一个名为 order_name_cache 的哈希表上。
症状:top 里某个 Perl 进程内存占用过高
先运行 top 命令查看各进程的内存使用情况。可以看到,有一个 Perl 进程消耗了最多的内存,超过了 180MB。
再运行 ps 命令查看这个进程的更多细节。可以看到这个进程使用的 Perl 二进制可执行文件,是 Linux 发行版自带的。
下面我们用 OpenResty XRay 来检查这个未经修改的进程,对它进行实时分析,找出内存究竟花在了哪里。
用 OpenResty XRay 引导式分析定位最大的 Perl 对象
在浏览器中打开 OpenResty XRay 的 Web 控制台,确认当前分析的机器是正确的(不对可以在列表里重新选择)。进入 “Guided Analysis” 页面,这里可以看到系统能诊断的各类问题。
选择 “High memory usage”,选中之前的 Perl 应用和 top 里标出的那个进程(消耗超过 180MB 的那个),保持 Perl 和 C/C++ 两个语言级别都选中,最长分析时间保留默认的 300 秒。开始分析,跑一到两轮后,OpenResty XRay 会自动生成一份内存分析报告。可以看到大部分内存是由 Libc 分配器分配的,这里超过了 160MB。
这是占用最多内存的 Perl 内存对象引用路径。显然,这个 Perl 虚拟机使用了绝大多数由 Libc 分配的内存。
最大的占用位于 Services::Preprocessor 模块里。
在模块的符号表中,有一个名为 order_name_cache 的变量。
这个变量是一个 Perl 哈希表。
点击查看更多细节。
这个对象引用路径,是从 Perl 语言级别 GC 对象内存分布火焰图,自动推导出来的。
下面是对问题更详细的解释和建议。它对数据引用路径中的对象,逐个进行了解释。
把最大的对象追溯回源码文件
模块名 Services::PreProcessor 与 Perl 源文件路径相对应。因此,我们可以通过它找到源文件。
在终端上,切换当前工作目录到 Perl 应用的源码树。
用 find 命令查找源文件。
复制完整的文件路径,使用 vim 编辑器打开源文件。您可以使用任何您喜欢的编辑器。
回到数据引用路径,单击图标以复制这个 Perl 哈希表的变量名。
粘贴。我们可以看到哈希表是在这里定义的,
以及这个哈希表变量是如何使用的。
用 Insights 报告自动监控 Perl 进程内存
OpenResty XRay 也可以自动监控在线进程,并显示分析报告。在 “Insights” 页面中可以找到以日和周为周期的报告,所以您不是非得手动运行 “Guided Analysis” 功能——当然,“Guided Analysis” 对于应用的开发和演示仍然很有用。
本文针对的是内存占用大但基本稳定的情况。如果一个 Perl 进程的内存是随时间持续增长,请参见我们的案例文章排查 Perl 内存泄漏。若是 CPU 侧的问题,请参见排查 Perl 进程 CPU 占用过高。
常见问题(FAQ)
如何找出是哪个 Perl 进程占用内存最多?
运行 top 命令——占用内存最多的就是那个 Perl 进程,本例中超过 180MB。再运行 ps 查看更多细节,这里它是 Linux 发行版自带的标准 Perl 二进制。然后用 OpenResty XRay 分析这个具体进程,找出内存花在了哪里。
能不能在不改代码、不重启的情况下剖析 Perl 内存占用?
可以。OpenResty XRay 实时分析未经修改的运行中 Perl 进程——本例即为发行版自带的标准 Perl 二进制。因为它就地分析进程本身,你无需修改或重启应用就能看到内存去了哪里。
什么是 Perl 内存对象引用路径?
它是指向占用最多内存那个对象的引用路径——这里是 Services::Preprocessor 模块里的 order_name_cache 哈希表。OpenResty XRay 会从 Perl 语言级别的 GC 对象内存分布火焰图中自动推导出这条路径。
如何把一个大的 Perl 对象追溯回源代码?
模块名与 Perl 源文件路径相对应,据此即可定位源文件。从引用路径中复制变量名——这里是 order_name_cache——用 find 定位文件并打开,就能看到该哈希表在哪里定义、在哪里使用。
关于 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. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:
翻译
我们提供了英文版 原文和中译版(本文)。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!






































