定位python内存泄漏问题 | 您所在的位置:网站首页 › 内存泄漏如何定位 › 定位python内存泄漏问题 |
记一次 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()然后我们访问接口,多触发几次,不用看前两次,等输出稳定后,如果有内存泄漏是如下输出:
如果没有内存泄漏,没有数据输出 我们确定程序有内存泄漏后,就想办法定位到代码块,就是我们自己写的代码,通过一步一步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 实验室设备网 版权所有 |