我有一个相当复杂的程序(带有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 /
答案 0 :(得分:1)
答案 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 /秒,所以它在几天后出现了。这是邪恶的!