利用meliae来监控python进程的内存占用情况
meliae是一个python进程内存占用监控、分析工具,它的安装需要依赖pyrex包
meliae会把某个时刻的内存给dump到一个文件中,然后再对该文件进行分析
当我们的某个python程序占用内存很大,可能有内存泄露发生时,可以使用该工具来进行检测分析
安装和使用用都比较简单,在需要dump内存的地方,写上以下代码即可:
折叠复制代码
- from meliae import scanner
- scanner.dump_all_objects('/opt/log/dump.txt')
这样,我们就可以把当前的内存Objects都导出到了dump.txt,然后再进行分析
折叠复制代码
- from meliae import loader
- #加载dump文件
- om=loader.load('/opt/log/dump.txt')
- #计算各Objects的引用关系
- om.compute_parents()
- #去掉各对象Instance的_dict_属性
- om.collapse_instance_dicts()
- #分析内存占用情况
- om.summarize()
我的某个python程序分析结果如下:
折叠复制代码
- Total 333015 objects, 188 types, Totalsize=52.8MiB (55414199 bytes)
- Index Count % Size % Cum Max Kind
- 0 10620 3 18096480 32 32 1704 POP3ClientProtocol
- 1 133004 39 6290033 11 44 31457 str
- 2 10628 3 5866656 10 54 552 Connector
- 3 10628 3 5866656 10 65 552 POP3ClientFactory
- .......
从上面可以看到,共有333015个对象,占用了52M的内存
其中,共有10620个POP3ClientProtocol对象实例,占用了32%约18M的内存
最大的对象也只占用了1.7K的内存,但由于对象很多,所以最终它占用的内存就很大了
那么,我们就大概知道了内存泄露的地方,就是这个POP3ClientProtocol对象,在使用完成之后,没有释放造成的
我们还可以继续分析某个对象,找出它的引用关系
折叠复制代码
- #得到所有的POP3ClientProtocol对象
- p = om.get_all('POP3ClientProtocol')
- #查看第一个对象
- p[0]
- 说明该对象的地址为2803894924,占用了1.7K内存,引用了51个对象,它被1个对象所引用
- >>>POP3ClientProtocol(2803894924 1704B 51refs
1par) - #可以查看该对象的所有引用
- p[0].c
- >>>[str(3079323384 33B 10647par 'popuserid'), str(2814724096 45B 1par 'fuzimiao2000@sohu.com'), str(3079036128 31B 10624par 'mailnum'), int(165090672 12B 29par '75'),
- #查看谁引用了这个对象
- p[0].p
- >>>[POP3ClientFactory(2803893100 552B 15refs 3par)]
好用的工具,手下了!
对待在后台运行的程序,如何DUMP那?能不能实现,根据进程ID直接DUMP那?
对于后台运行的程序,你可以:
1.让该后台程序监听某个端口,当你往该端口发送某个命令时,执行dump
2.写一个signal事件处理,给该进程发送某个信号后,执行dump
按您的说法是一定要在源程序当中加入代码来操作。如果是已经编译好的python 程序怎样,要怎样dump了? ? 还有,在后台运行的程序,怎样来通过监听端口,往该端口发送某个命令时,执行dump,要怎样操作?可以话给我lhb421@hotmail.com邮件 谢谢。
1.编译好的pyc,只能试试反编译了,反编译后再加入代码
2.在你的后台程序中,可以利用BaseHTTPServer,监听一个http端口,在get方法中去dump,这样可以在你需要的时候,直接发送一个get请求即可执行dump操作