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简单日志处理类分享
Feb 14 Python
在Python中处理XML的教程
Apr 29 Python
Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例
Aug 31 Python
python感知机实现代码
Jan 18 Python
python  文件的基本操作 菜中菜功能的实例代码
Jul 17 Python
python Tcp协议发送和接收信息的例子
Jul 22 Python
django-rest-swagger的优化使用方法
Aug 29 Python
python区分不同数据类型的方法
Oct 14 Python
学Python 3的理由和必要性
Nov 19 Python
python zip()函数的使用示例
Sep 23 Python
详解anaconda安装步骤
Nov 23 Python
python获取淘宝服务器时间的代码示例
Apr 22 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
DOTA2 探索永无止境 玩家自创强悍插眼攻略
2020/04/20 DOTA
东芝TOSHIBA RP-F11电路分析
2021/03/02 无线电
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
2016/12/05 PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
2019/12/03 PHP
Javascript生成json的函数代码(可以用php的json_decode解码)
2012/06/11 Javascript
jQuery使用元素属性attr赋值详解
2015/02/27 Javascript
AspNet中使用JQuery上传插件Uploadify详解
2015/05/20 Javascript
javascript中加var和不加var的区别 你真的懂吗
2016/01/06 Javascript
全面解析标签页的切换方式
2016/08/21 Javascript
浅谈JavaScript 覆盖原型以及更改原型
2016/08/31 Javascript
微信小程序 教程之wxapp视图容器 swiper
2016/10/19 Javascript
网页瀑布流布局jQuery实现代码
2016/10/21 Javascript
JavaScript组成、引入、输出、运算符基础知识讲解
2016/12/08 Javascript
jQuery实现淡入淡出的模态框
2017/02/09 Javascript
详解Node项目部署到云服务器上
2017/07/12 Javascript
layer实现弹出层自动调节位置
2019/09/05 Javascript
基于vue 动态菜单 刷新空白问题的解决
2020/08/06 Javascript
js节流防抖应用场景,以及在vue中节流防抖的具体实现操作
2020/09/21 Javascript
解决Antd 里面的select 选择框联动触发的问题
2020/10/24 Javascript
基于Cesium绘制抛物弧线
2020/11/18 Javascript
[02:59]DOTA2完美大师赛主赛事第三日精彩集锦
2017/11/25 DOTA
查看Python安装路径以及安装包路径小技巧
2015/04/28 Python
Python用Pillow(PIL)进行简单的图像操作方法
2017/07/07 Python
基于树莓派的语音对话机器人
2019/06/17 Python
Python一键查找iOS项目中未使用的图片、音频、视频资源
2019/08/12 Python
python中单下划线(_)和双下划线(__)的特殊用法
2019/08/29 Python
浅析PEP570新语法: 只接受位置参数
2019/10/15 Python
opencv 图像轮廓的实现示例
2020/07/08 Python
css3中仿放大镜效果的几种方式原理解析
2020/12/03 HTML / CSS
TripAdvisor日本:全球领先的旅游网站
2019/02/14 全球购物
澳大利亚婴儿、幼儿和儿童在线设计师商店:Smooch Baby
2019/02/16 全球购物
财务副总经理工作职责
2013/11/25 职场文书
物业招聘计划书
2014/01/10 职场文书
国家税务局领导班子对照检查材料思想汇报
2014/10/04 职场文书
2016年教师节特级教师获奖感言
2015/12/09 职场文书
2019感恩宣传标语!
2019/07/05 职场文书