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实现的防DDoS脚本
Feb 08 Python
python中日期和时间格式化输出的方法小结
Mar 19 Python
Python的Scrapy爬虫框架简单学习笔记
Jan 20 Python
python实现简单socket通信的方法
Apr 19 Python
python获取文件路径、文件名、后缀名的实例
Apr 23 Python
详解python读取和输出到txt
Mar 29 Python
用Python实现最速下降法求极值的方法
Jul 10 Python
python字典的常用方法总结
Jul 31 Python
python实现生成Word、docx文件的方法分析
Aug 30 Python
在python shell中运行python文件的实现
Dec 21 Python
django日志默认打印request请求信息的方法示例
May 17 Python
python tqdm库的使用
Nov 30 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 shell超强免杀、减少体积工具实现代码
2012/10/16 PHP
php实现统计网站在线人数的方法
2015/05/12 PHP
php使用Jpgraph绘制柱形图的方法
2015/06/10 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
Jquery插件之多图片异步上传
2010/10/20 Javascript
基于jquery实现的可以编辑选择的下拉框的代码
2010/11/19 Javascript
动态加载js和css(外部文件)
2013/04/17 Javascript
JS、CSS加载中的小问题探讨
2013/11/26 Javascript
JS实现侧悬浮浮动实例代码
2013/11/29 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/07/18 Javascript
Jquery Mobile 自定义按钮图标
2015/11/18 Javascript
浅谈Jquery中Ajax异步请求中的async参数的作用
2016/06/06 Javascript
jquery获取table指定行和列的数据方法(当前选中行、列)
2016/11/07 Javascript
BootStrap组件之进度条的基本用法
2017/01/19 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
2017/08/31 Javascript
微信小程序自定义底部导航带跳转功能
2018/11/27 Javascript
Ant-design-vue Table组件customRow属性的使用说明
2020/10/28 Javascript
Python中你应该知道的一些内置函数
2017/03/31 Python
Python之Scrapy爬虫框架安装及简单使用详解
2017/12/22 Python
python实现淘宝秒杀聚划算抢购自动提醒源码
2020/06/23 Python
python禁用键鼠与提权代码实例
2019/08/16 Python
Pytest参数化parametrize使用代码实例
2020/02/22 Python
Python简单实现词云图代码及步骤解析
2020/06/04 Python
详细分析Python垃圾回收机制
2020/07/01 Python
python多线程semaphore实现线程数控制的示例
2020/08/10 Python
DRF框架API版本管理实现方法解析
2020/08/21 Python
浅析两列自适应布局的3种思路
2016/05/03 HTML / CSS
html5启动原生APP总结
2020/07/03 HTML / CSS
霸王洗发水广告词
2014/03/14 职场文书
驾驶员安全责任书范本
2014/07/24 职场文书
2014党员四风对照检查材料思想汇报
2014/09/17 职场文书
2014年政府采购工作总结
2014/12/09 职场文书
商务英语求职信范文
2015/03/19 职场文书
社区法制宣传日活动总结
2015/05/05 职场文书
学生会副主席竞选稿
2015/11/19 职场文书
MySQL中正则表达式(REGEXP)使用详解
2022/07/07 MySQL