【发布时间】:2011-05-30 17:16:22
【问题描述】:
我有一个相当复杂的程序(带有 SWIG'ed C++ 代码的 Python,长时间运行的服务器),它显示了不断增长的常驻内存使用量。我一直在使用常用的泄漏工具(valgrind、Pythons gc 模块等)进行挖掘,但到目前为止无济于事。我有点担心实际的问题是 Python 和/或 libc 托管内存中的内存碎片。
无论如何,我现在的问题更具体:是否有一种工具可以可视化常驻内存使用情况并理想地显示它随着时间的推移如何发展?我认为原始数据在 /proc/$PID/smaps 中,但我希望有一些工具可以很好地显示 mmap'ed 文件与匿名 mmap'ed 内存与堆随时间使用的数量,以便更容易看到(字面上)发生了什么变化。但是我什么也找不到。
有没有人知道一种工具,它可以以直观的方式在空间和时间上绘制特定进程的内存映射(内存类型和数量)?
更新:我找到了“pmap”工具,但我系统上的版本似乎无法处理 RSS,并且没有提供合并所有映射文件大小的选项。映射“匿名”区域。我最终破解了一个小脚本,它每两分钟解析一次 /proc/$PID/smaps,而原始程序运行并打印如下行:
12:00:28 {'_TOTAL': 729.20703125, 'file': 53.609375, 'heap': 22.08984375,
'anon': 653.5, 'stack': 0.0078125}
...
15:42:47 {'_TOTAL': 940.16015625, 'file': 53.484375, 'heap': 22.2109375,
'anon': 864.45703125, 'stack': 0.0078125}
没有漂亮的图表,但经过几个小时的运行后,我认为这是一个安全的选择,因为我必须仔细查看“匿名”内存段 :-)
更新: valgrind 的最新版本通过使用--pages-as-heap=yes 使其内存分析器(“massif”)支持页面级分析。耶!通过 massif 运行我的程序几个小时,然后将生成的文件输入到Massif Visualizer 中,得到了一个很好的随时间推移每个页面类型的内存消耗图表,包括查看所有 mmap 调用来自何处的堆栈跟踪。 \o/
【问题讨论】: