guppy报告的内存使用量与ps命令不同

Fan*_*Lin 7 python memory-management twisted guppy

我正在分析我的扭曲服务器.它使用的内存比我预期的多得多.它的内存使用量会随着时间的推

 ps -o pid,rss,vsz,sz,size,command
  PID   RSS    VSZ    SZ    SZ COMMAND
 7697 70856 102176 25544 88320 twistd -y broadcast.tac
Run Code Online (Sandbox Code Playgroud)

如您所见,它的成本为102176 KB,即99.78125 MB.我使用扭曲的沙井中的孔雀鱼来观察内存使用情况.

>>> hp.heap()
Partition of a set of 120537 objects. Total size = 10096636 bytes.
 Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
     0  61145  51  5309736  53   5309736  53 str
     1  27139  23  1031596  10   6341332  63 tuple
     2   2138   2   541328   5   6882660  68 dict (no owner)
     3   7190   6   488920   5   7371580  73 types.CodeType
     4    325   0   436264   4   7807844  77 dict of module
     5   7272   6   407232   4   8215076  81 function
     6    574   0   305776   3   8520852  84 dict of class
     7    605   1   263432   3   8784284  87 type
     8    602   0   237200   2   9021484  89 dict of type
     9    303   0   157560   2   9179044  91 dict of zope.interface.interface.Method
<384 more rows. Type e.g. '_.more' to view.>
Run Code Online (Sandbox Code Playgroud)

嗯......似乎有些不对劲.Guppy显示内存的总使用量为10096636字节,即9859.996 KB9.628 MB.

这是一个巨大的差异.这个奇怪的结果出了什么问题?我究竟做错了什么?

更新: 我昨晚写了一个监控脚本.它记录内存使用情况和在线用户数.它是一个无线电服务器,所以你可以看到有无线电和全部听众.这是我通过matplotlib生成的图. alt text http://static.ez2learn.com/temp/mem_figure.svg

有点奇怪.有时ps打印的内存使用率非常低,就像这样

2010-01-15 00:46:05,139 INFO 4 4 17904 36732 9183 25944
2010-01-15 00:47:03,967 INFO 4 4 17916 36732 9183 25944
2010-01-15 00:48:04,373 INFO 4 4 17916 36732 9183 25944
2010-01-15 00:49:04,379 INFO 4 4 17916 36732 9183 25944
2010-01-15 00:50:02,989 INFO 4 4 3700 5256 1314 2260
Run Code Online (Sandbox Code Playgroud)

超低内存使用价值的原因是什么?而且,即使没有在线无线电,也没有听众,内存使用量仍然很高.

jsp*_*cal 6

可能是由于交换/内存预留,基于ps的定义:

RSS: resident set size, the non-swapped physical memory
     that a task has used (in kiloBytes).

VSZ: virtual memory usage of entire process.
     vm_lib + vm_exe + vm_data + vm_stack
Run Code Online (Sandbox Code Playgroud)

它可能有点令人困惑,可以看到4个不同大小的指标:

# ps -eo pid,vsz,rss,sz,size,cmd|egrep python

PID    VSZ   RSS   SZ    SZ    CMD
23801  4920  2896  1230  1100  python
Run Code Online (Sandbox Code Playgroud)

虚拟大小包括由进程保留但未使用的内存,已加载的所有共享库的大小,已换出的页面以及已由您的进程释放的块,因此它可能比大小大得多python中的所有活动对象.

一些其他工具来调查内存性能:

使用pdb和objgraph跟踪python中的内存泄漏的良好指南:

http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks