python进程内存占用持续增高排查经验分享 您所在的位置:网站首页 ram占比越来越高 python进程内存占用持续增高排查经验分享

python进程内存占用持续增高排查经验分享

2024-02-19 05:05| 来源: 网络整理| 查看: 265

一般导致此问题的几种code方式

1、创建全局变量,如list或者dicti类型,一直向里面塞数据,未释放;创建类变量,类只创建一次实例,向类变量中无限塞数据

2、循环引用,自己实现了__del__方法,未将创建的资源释放掉,python不会自动识别释放掉这部分资源

 

排查此类问题无好的方式,需要借助工具pyrasite进行分析,此工具可以结合其余的辅助插件

mem_top插件介绍:

refs回显信息: 占用内存最大的topN变量中的元素个数

bytes回显信息: 占用内存最大的topN变量每个变量所占用的bytes

types回显信息: 占用内存最大的topN类型变量个数

from mem_top import mem_top print mem_top(limit=15,width=80)  # limit控制显示数据条数,width控制显示数据长度,建议调测时不要把width显示太长,不然不容易观测问题数据

 

objgraph调用GC,可以获取此进程中每个变量的真实值,只介绍两个函数,其余的可以自己研究

objgraph.by_type()函数,可以获取不同类型的所有变量,感觉比较有用

objgraph.show_backrefs()  可以绘制对象调用关系栈

使用文档参考:https://buildmedia.readthedocs.org/media/pdf/objgraph/latest/objgraph.pdf

import objgraph objgraph.by_type(type)

 

排查经历:

ceilometer-agent-central进程存在内存泄漏:测试人员对ceilometer-agent-central进程进行了为期15天占用内存的数据的捕获,绘制出来图表占用内存情况呈K线趋势直线上升

排查方式:利用mem_top插件,观察TOPN中的信息显示(注意时间点间隔尽量长一些),重点关注几次refs中排序变化情况,如果有变量的值随着时间的推移,不断排序靠前且变量中的元素个数不断增大,需要重点关注;我排查时发现refs中有个变量的排序逐渐冲高,里面元素随着时间推移逐渐变多,控制把width的显示长度放大,发现这个变量存储的是环境中的host_id,此host_id的数量已经达到10万多个(心想一般测试环境的host根本达不到此规模,是不是有可能当时使用该变量时未去重呢,有突破了);如果想按照此变量使用时,未将host_id去重思路来排查,那就需要知道此变量中存储了那些内容;借用objgraph插件,objgraph.by_type("list")可以将此进程中所有list变量获取,此时只需要将获取到的这些变量存储到本地文件,利用refs中此变量的部分回显信息搜索,便可以找到此变量的全部值;果不其然,当我把此变量的全部值获取之后,去重,发现其实只有19个独一无二的host_id,其余的都是重复的,然后根据业务代码去人工排查,此变量可能在那一块创建,也可以根据自己猜测的关键字进行代码搜索,最终排查出来有问题代码。

 

具体工具使用流程:

1、环境搭建

内网环境:需要先下载上传到服务器,安装pyrasite rpm工具包,下载objgraph与mem_top的whl文件,使用pip进行安装,如果没有pip需要先现在pip rpm安装包;

外网环境:直接使用yum与pip安装环境

2、查看进程的启动用户名,使用su切换到进程用户,获取进程id

3、进入进程id shell

      # pyrasite-shell id

4、使用插件获取数据

5、利用获取的数据,进行分析,排查code

 

经验总结:内存泄漏问题比较难排查,一般排查周期比较长,建议测试周期也适当放长,一般建议模拟测试正常进程7天以上运行情况,最终观测数据较为准确些,不然如果造成内存泄漏的变量冲高不大,很难观测出来



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有