线上定位 Python 进程中的大内存对象(使用 OpenResty XRay)
在本教程中,你将学习如何快速定位应用中最大的 Python 内存对象或值。这得益于 OpenResty XRay 的强大功能。我们可以通过数据引用路径精确定位这些可被垃圾回收的对象。我们还将演示自己开发的 Python GC 对象内存分布火焰图。您的 Python 代码中的内存泄漏或大内存占用问题,从此都可以轻松搞定!
问题: 内存占用率过高
首先运行 top
命令检查每个进程的内存使用情况。可以看到,名为 gunicorn
的 Python 进程消耗了超过 600MB 的内存。
让我们运行 ps
命令来查看这个进程的更多细节。
我们可以看到,这个进程使用的 Python3 二进制可执行文件,是 Linux 发行版自带的。
使用 OpenResty XRay 的引导式分析功能定位 Python 进程中的大内存对象或值
我们可以使用 OpenResty XRay 来检查这个未经修改的进程。系统可以对它进行实时分析,并找出原因。在浏览器中打开 OpenResty XRay 的 Web 控制台。
确保当前分析的机器是正确的。
如果不对,我们可以在下面的列表重新选择。
进入 “Guided Analysis” 页面。
这里可以看到系统能分析的不同类型的问题。
让我们选择 “High memory usage”。
点击 “Next”。
选择之前的 Python 应用。
选择消耗近 600 MB 内存的进程。这就是我们之前在 top
中看到的进程。
确保应用的类型是正确的。通常默认值就是对的。
OpenResty XRay 可以在多种不同语言的级别上进行分析。这里保持 Python 和 C/C++ 都选中。
我们还可以设置最长的分析时间。这里保持默认的 300 秒不变。
开始分析。
系统将持续执行多轮分析。现在它正在运行第一轮分析。
第一轮分析已经完成,现在进入第二轮。对这个例子来说,运行一轮分析就够了。
现在停止分析。
可以看到自动生成了一份分析报告。
这是现在我们要分析的问题类型,内存。
我们可以看到大部分内存是由 Libc 分配器分配的,这里超过了 580 MB。
这是占用内存最多的 Python GC 对象的引用路径。很明显,这个 Python 虚拟机使用了 Libc 分配器来请求内存。
这个 Pytion 字典用于保存所有已加载的 Python 模块。
这是一个名为 order_service.service.order.prev_processor
的 Python 模块。
在这个模块中,有一个名为 order_name_cache
的字段。
这个字段的值是一个 Python 字典。
点击查看更多细节。
这个数据引用路径,是从这个 Python GC 对象内存分布火焰图中自动推导出来的。
下面是对问题更详细的解释和建议。它提到了我们之前看到的 prev_processor
模块。
它也提到了 order_name_cache
字典。
让我们回到数据引用路径。点击这个图标,来复制这个模块名称。
在终端上,使用 find
命令来查找 Python 源文件。
粘贴我们刚刚复制的模块名称。这里,我们借用模块名称中的点,作为 grep
命令的通配符。
复制完整的文件路径。使用 vim 编辑器打开这个源文件。您可以使用任何您喜欢的编辑器。
我们可以找到之前报告里提到的 order_name_cache
变量。
我们也可以检查这个变量是如何使用的,以确定是否存在内存泄漏问题。
全自动分析与报告
OpenResty XRay 也可以自动监控在线进程,并显示分析报告。
切换到 “Insights” 页面。
您可以在 “Insights” 页面中找到以日和周为周期的报告。所以您不是非得用 “Guided Analysis” 功能。
当然, “Guided Analysis” 对于应用的开发和演示是很有用的。
关于 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. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:
翻译
我们提供了英文版原文和中译版(本文)。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!