Python中使用MELIAE分析程序内存占用实例


Posted in Python onFebruary 18, 2015

写的dht协议搜索的程序,这几天优化了一下发现速度确实快了好多。但是出现了一个新的问题,内存直接飙升,我开了十个爬虫占用内存800m。开始我以为是节点太多了,找了几个小问题修改一下,发现没用。后来就到网上查找python内存分析的工具,查了一点资料发现python有个meliae库操作非常方便,就使用分析了一下,发现不是节点太多的原因0 0,是保存发送的t_id,用来标示返回的消息是那个发出的一个字典过大了。

从分析的结果非常容易的定位了某个对象的数量和大小,非常容易分析。我开始以为是因为好多发送查询信息以后,对面没返回造成这个字典里的元素没有释放造成的,我就用过期时间判断了一下,进行过期删除。发现是小了,但是不是非常显著,好像少了几十不到100M。后来又减少了查找一个随机hash的时间,以前是1分钟查一次,我改成了就第一次查!,发现没减少0 0.不知道是啥的原因。应该就是查找hash,询问节点,然后返回然后询问里边的节点,最后数量越来越多,但是我不明白的是,怎么会这么多运行一分钟就有60万条。也就是说当时内存没释放的对象就有这么多。达到这个内存占用后,基本就不再变化,有很小很慢的提升,因为还开的其他程序,不确定是不是这些程序其他对象的增加造成的。等分阶段dump测试一下。

安装直接pip install meliae 就ok了,我看好久没更新的项目了,不知道还有没有好的替代品不过用着还不错。

将内存dump到文件

 from meliae import scanner

 scanner.dump_all_objects('/tmp/dump%s.txt' % time.time())

分析文件:
 from meliae import loader

 #加载dump文件

 om = loader.load('/opt/log/dump.txt')

 #计算各Objects的引用关系

 om.compute_parents()

 #去掉各对象Instance的_dict_属性

 om.collapse_instance_dicts()

 #分析内存占用情况

 om.summarize()

字段意义如下:
Index : 行索引号
Count : 该类型的对象总数
%(Count) : 该类型的对象总数 占 所有类型的对象总数 的百分比
Size : 该类型的对象总字节数
%(Size) : 该类型的对象总字节数 占 所有类型的对象总字节数 的百分比
Cum : 累积行索引后的%(Size)
Max : 该类型的对象中,最大者的字节数
Kind : 类型

分析某个对象,找出它的引用关系

 #得到所有的POP3ClientProtocol对象

 p = om.get_all('POP3ClientProtocol')

 #查看第一个对象

 p[0]

 #可以查看该对象的所有引用

 p[0].c

 #查看谁引用了这个对象

 p[0].p
Python 相关文章推荐
python定时执行指定函数的方法
May 27 Python
Python实现比较两个文件夹中代码变化的方法
Jul 10 Python
Python list操作用法总结
Nov 10 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
Jul 24 Python
Python基于列表模拟堆栈和队列功能示例
Jan 05 Python
Python实现E-Mail收集插件实例教程
Feb 06 Python
python中的线程threading.Thread()使用详解
Dec 17 Python
Python发送邮件封装实现过程详解
May 09 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
May 10 Python
python中yield的用法详解
Jan 13 Python
Python入门学习之类的相关知识总结
May 25 Python
Python利用FlashText算法实现替换字符串
Mar 31 Python
Python中的__SLOTS__属性使用示例
Feb 18 #Python
Python contextlib模块使用示例
Feb 18 #Python
Python中使用Inotify监控文件实例
Feb 14 #Python
Python中实现的RC4算法
Feb 14 #Python
Python脚本实现网卡流量监控
Feb 14 #Python
Centos5.x下升级python到python2.7版本教程
Feb 14 #Python
Python脚本实现DNSPod DNS动态解析域名
Feb 14 #Python
You might like
PHP删除非空目录的函数代码小结
2013/02/28 PHP
php支持断点续传、分块下载的类
2016/05/02 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
laravel中的一些简单实用功能
2018/11/03 PHP
JS获取select的value和text值的简单实例
2014/02/26 Javascript
Javascript实现可旋转的圆圈实例代码
2015/08/04 Javascript
jQuery中$.ajax()和$.getJson()同步处理详解
2015/08/12 Javascript
cocos2dx骨骼动画Armature源码剖析(一)
2015/09/08 Javascript
Javascript中的数据类型之旅
2015/10/18 Javascript
由浅入深讲解Javascript继承机制与simple-inheritance源码分析
2015/12/13 Javascript
JS锚点的设置与使用方法
2016/09/05 Javascript
浅谈React 属性和状态的一些总结
2016/11/21 Javascript
JavaScript订单操作小程序完整版
2017/06/23 Javascript
在vue项目中引用Iview的方法
2018/09/14 Javascript
写gulp遇到的ES6问题详解
2018/12/03 Javascript
Bootstrap 按钮样式与使用代码详解
2018/12/09 Javascript
Webpack 4如何动态切割JS注入文件名详解
2019/07/09 Javascript
layui 中select下拉change事件失效的解决方法
2019/09/20 Javascript
js实现贪吃蛇小游戏
2019/10/29 Javascript
jQuery实现容器间的元素拖拽功能
2020/12/01 jQuery
[05:28]刀塔密之一:团结则存
2014/07/03 DOTA
Django中实现一个高性能计数器(Counter)实例
2014/07/09 Python
通过python爬虫赚钱的方法
2019/01/29 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
2019/12/26 Python
Python JSON编解码方式原理详解
2020/01/20 Python
python GUI库图形界面开发之PyQt5打开保存对话框QFileDialog详细使用方法与实例
2020/02/27 Python
澳大利亚在线消费电子产品商店:TobyDeals
2020/01/05 全球购物
人力资源专员自我评价怎么写
2013/09/19 职场文书
活动志愿者自荐信
2014/01/27 职场文书
关于读书的演讲稿300字
2014/08/27 职场文书
2015年办公室工作总结范文
2015/03/31 职场文书
立项申请报告范本
2015/05/15 职场文书
婚礼上证婚人致辞
2015/07/28 职场文书
班主任寄语2016
2015/12/04 职场文书
2019年工作总结范文
2019/05/21 职场文书
Go语言操作数据库及其常规操作的示例代码
2021/04/21 Golang