写的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

上一篇:
下一篇:

相关文章:

Categories: 博客记录

0 Responses so far.

Leave a Reply