更新于:2023-12-07 13:30
一、内存排查背景
python 做为弱语言类型的编程语言,不具备像 java 编程语言的的 JVM 机制,也没有高级 GC 算法。内存溢出、内存泄漏这类问题便成了 python 开发者的痛苦,虽然python服务启动快依靠快速重启解决,但考虑到重启的影响。一般都需要把内存问题定位处理,因此获取运行时态的内存情况便成为重要的排查手段。
python 的内存排查工具很多,但是在使用下来后,发现memray
工具的各种优点深深的吸引了我,下面给大家介绍一下这款工具在日常工作中如何协助我们。
二、memray 功能简介
Memray
是一个用于 Python 的内存分析器,能够追踪 Python 代码、本地扩展模块和 Python 解释器本身的内存分配。通过它可以帮助我们快速分析应用程序的内存分配,发现高内存使用的原因,找到内存泄漏,以及识别导致大量分配的代码热点。
另外它还能够生成多种报告来帮助分析内存使用数据。它的主要特点包括:
1、准确追踪每个函数调用,展现完整的调用栈;
2、处理 C/C++ 库中的本地调用,确保结果中呈现完整的调用栈;
3、高效快速,对应用程序造成的延迟最小。追踪本地代码虽然稍慢,但可以按需启用或禁用;
4、生成各种关于收集的内存使用数据的报告,如火焰图;
5、支持 Python 线程和本地线程(例如本地扩展中的 C++ 线程)。
说了它这么多的优点,可能唯一的缺点就是Memray
目前只能在 Linux(x86) 和 MacOS 平台上安装工作,但是我相信后续这个平台问题会解决的。
三、memray 使用教程
1、快速使用
pip3 install memray
current_datetime=$(date +"%Y-%m-%d-%H:%M:%S")
memray run --native -o "memray-servername_${current_datetime}.bin" server.py
memray summary *.bin
memray flamegraph *.bin
上面命令包含了安装以及如何快速使用,通过memray run
命令执行时,整个程序的内存分配和释放都会被跟踪,并且会将整个内存的相关信息保存到一个 .bin 的文件中。通过memray summary
命令可以在控制台展示当前的内存分配详情,也可以用memray flamegraph
命令生成一个 html 文件的火焰图。上面命令中携带了--native
参数,是因为我的服务中使用到了 C/C++ 实现的第三方库,需要设置该参数对一些native stack
的内存进行追踪监控。另外我们可以携带--trace-python-allocators
参数使其记录每个对象的创建和销毁,相对的就会文件变得很大,分析时也变得复杂一些,适合处理内存泄漏的场景。
memray run --native --live-remote --live-port 10086 server.py
memray live 10086
2、实时追踪
memray
可以动态追踪内存的详情,使用--live-remote
参数将在后台运行并且指定端口,然后在新的控制台通过memray live <port>
命令就能实时查看程序的内存情况。
3、报告分析
这里生成的报告种类较多,官方列举了很多类型,就不再描述了。可以参考 官网网站 , 以及 github-issue 。
四、小结
本篇文章介绍了内存分析工具的重要性,推荐了一款操作简单、并且功能强大的工具Memray
。通过举例介绍它的常见使用教程,方便大家快速上手使用,目前我这边是设置到公司生产环境,可通过开关配置开启内存追踪分析,让内存泄漏问题无处遁逃。