常驻内存使用的概述/历史

时间:2010-12-25 20:51:20

标签: linux memory-management

我有一个相当复杂的程序(带有SWIG的C ++代码的Python,长时间运行的服务器),它显示了不断增长的驻留内存使用情况。我一直在挖掘泄漏的常用工具(valgrind,Pythons gc模块等)但到目前为止无济于事。我有点担心实际问题是Python和/或libc托管内存中的内存碎片。

无论如何,我的问题现在更具体:是否有可视化常驻内存使用情况的工具,并且理想地显示它是如何随时间发展的?我认为原始数据在/ proc / $ PID / smaps中,但是我希望有一些工具可以向我展示mmap'ed文件与匿名mmap的内存与堆随时间的使用量的漂亮图表,以便更容易看到(字面上)正在发生的变化。我找不到任何东西。

是否有人知道一种工具,以直观的方式在空间和时间上绘制特定过程的内存映射(内存类型和数量)


更新:我找到了“pmap”工具,但我系统上的版本似乎没有处理RSS,也没有提供合并所有映射文件的大小的选项。映射“anon”区域。我最终破解了一个小脚本,它在原始程序运行时每隔两分钟解析/ 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}

没有漂亮的图表,但经过几个小时的运行后,我认为现在我必须仔细查看'anon'内存段,这是一个安全的选择: - )


更新:最新版本的valgrind使用--pages-as-heap=yes使其内存分析器(“massif”)支持页面级别分析。好极了!通过massif运行我的程序几个小时,然后将生成的文件输入Massif Visualizer,得到一个很好的图表,显示每页内存类型的内存消耗,包括堆栈跟踪,以查看所有mmap调用的来源。 \ O /

3 个答案:

答案 0 :(得分:1)

跟踪创建的对象引用计数将帮助您了解应用程序消耗内存的位置。

我发现这段代码可能会帮助你。

http://www.nightmare.com/medusa/memory-leaks.html

答案 1 :(得分:0)

我使用 vmstat 进行测试,但它没有GUI等,它的所有原始数据都是:

[~]> vmstat -S K 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
1  0    172 663244 410016 187756    0    0     6    12   14    4  0  0 99  0
0  0    172 663228 410016 187756    0    0     0    68   20   66  0  0 100  0
0  0    172 663228 410016 187756    0    0     0     0   12   54  0  0 100  0
0  0    172 663228 410016 187756    0    0     0     0   20   54  0  0 100  0
^C

答案 2 :(得分:0)

这种情况很少见,但您可能会检查文件(或套接字)泄漏,我的意思是当程序打开文件但从不关闭它们时。在我的桌面配置中,没有任何套接字泄漏的迹象,直到它超过1000+。当然,他们开了cca。 1 /秒,所以它在几天后出现了。这是邪恶的!