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中去空格函数的用法
Aug 21 Python
Python3实现生成随机密码的方法
Aug 23 Python
详解MySQL数据类型int(M)中M的含义
Nov 20 Python
Python实现将文本生成二维码的方法示例
Jul 18 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
Jun 01 Python
利用Pandas和Numpy按时间戳将数据以Groupby方式分组
Jul 22 Python
python pandas cumsum求累计次数的用法
Jul 29 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
Aug 27 Python
详解python uiautomator2 watcher的使用方法
Sep 09 Python
Python任务调度模块APScheduler使用
Apr 15 Python
python空元组在all中返回结果详解
Dec 15 Python
Python实现排序方法常见的四种
Jul 15 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中使用数组指针函数操作数组示例
2014/11/19 PHP
php实现检查文章是否被百度收录
2015/01/27 PHP
PHP实现全角字符转为半角方法汇总
2015/07/09 PHP
thinkphp5实现无限级分类
2019/02/18 PHP
PHP实现获取ip地址的5种方法,以及插入用户登录日志操作示例
2019/02/28 PHP
document.createElement()用法
2013/03/13 Javascript
JavaScript实现QueryString获取GET参数的方法
2013/07/02 Javascript
js/jquery去掉空格,回车,换行示例代码
2013/11/05 Javascript
js简单的弹出框有关闭按钮
2014/05/05 Javascript
javascript字母大小写转换的4个函数详解
2014/05/09 Javascript
html+js+highcharts绘制圆饼图表的简单实例
2016/08/04 Javascript
Bootstrap在线电子商务网站实战项目5
2016/10/14 Javascript
ionic 3.0+ 项目搭建运行环境的教程
2017/08/09 Javascript
详解vue mixins和extends的巧妙用法
2017/12/20 Javascript
浅谈在node.js进入文件目录的问题
2018/05/13 Javascript
详解Vue前端生产环境发布配置实战篇
2019/05/07 Javascript
详解JavaScript修改注册表的方法
2020/01/05 Javascript
python+Django+apache的配置方法详解
2016/06/01 Python
Python 异常处理的实例详解
2017/09/11 Python
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
2017/09/26 Python
对Tensorflow中的变量初始化函数详解
2018/07/27 Python
pytorch方法测试——激活函数(ReLU)详解
2020/01/15 Python
Python Scrapy框架第一个入门程序示例
2020/02/05 Python
python解释器pycharm安装及环境变量配置教程图文详解
2020/02/26 Python
Python爬虫爬取博客实现可视化过程解析
2020/06/29 Python
Bugatchi官方网站:男士服装在线
2019/04/10 全球购物
Oasis服装官网:时尚女装在线
2020/07/09 全球购物
航空大学应届生求职信
2013/11/10 职场文书
公司联欢会策划方案
2014/05/19 职场文书
竞赛口号大全
2014/06/16 职场文书
2015年世界卫生日活动总结
2015/02/09 职场文书
消防验收申请报告
2015/05/15 职场文书
2015年学校政教处工作总结
2015/05/26 职场文书
朋友圈早安励志语录!
2019/07/08 职场文书
教您:房贷工资收入证明应该怎么写?
2019/08/19 职场文书
Windows server 2012搭建FTP服务器
2022/04/29 Servers