定位python内存泄漏问题 您所在的位置:网站首页 内存泄漏如何定位 定位python内存泄漏问题

定位python内存泄漏问题

2023-08-07 03:59| 来源: 网络整理| 查看: 265

记一次 Python 内存泄漏的排查

背景

上周使用我的python web框架开发的第二个项目上线了,但是没运行几天机器内存就报警了,8G内存使用了7G,怀疑有内存泄漏,这个项目提供的功能就是一堆机器学习模型,对历史数据进行训练,挑选出最优的5个模型,用作未来数据的预测,所以整个项目有着数据量大,运行时间长的特点,就是把策略的离线工作搬到了线上。

定位内存泄漏 第一步:确定是否有内存泄漏

上pympler检查是否有内存泄漏,程序入口处初始化该工具

from pympler import tracker,summary,muppy memory_tracker = tracker.SummaryTracker()

接口返回处打印内存差异,观察内存是否有泄漏

memory_tracker.print_diff() # 本次内存和上次内存块的差异

我们用的sanic,所以直接在main.py文件添加如下代码:

from pympler import tracker,summary,muppy memory_tracker = tracker.SummaryTracker() @app.middleware('request') async def set_request_id(request): log_id = request.headers.get('log-id') threading.currentThread().logid = log_id gc.collect() memory_tracker.print_diff()

然后我们访问接口,多触发几次,不用看前两次,等输出稳定后,如果有内存泄漏是如下输出:

在这里插入图片描述 上图显示每次都有4类泄漏对象,一共泄漏约60K的内存

如果没有内存泄漏,没有数据输出

在这里插入图片描述

第二步:确定内心泄漏的代码块

我们确定程序有内存泄漏后,就想办法定位到代码块,就是我们自己写的代码,通过一步一步debug,注释,return,continue等方式定位到造成泄漏的代码块,下面的代码块就是遍历所有模型,然后挨个执行训练方法,因为有20多个模型,我不能挨个注释每次对象来定位,卡在这里了。 在这里插入图片描述

第三步:确定泄漏点

上tracemalloc定位泄漏点,python3.7.3自带,在main.py中添加如下代码:

tracemalloc.start(25) snapshot = tracemalloc.take_snapshot() @app.middleware('response') async def print_on_response(request, response): global snapshot gc.collect() snapshot1 = tracemalloc.take_snapshot() top_stats = snapshot1.compare_to(snapshot, 'lineno') print("[ Top 10 differences ]") for stat in top_stats[:10]: if stat.size_diff


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

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