背景
上一个工作项目使用Python Web框架开发完成后,机器的内存报警了,8G内存使用了7G,我怀疑可能有内存泄漏,这个项目提供的功能就是一堆机器学习模型,对历史数据进行训练,挑选出最优的5个模型,用作未来数据的预测,所以整个项目有着数据量大,运行时间长的特点,就是把策略的离线工作搬到了线上。
这一次的内容其实也就是简单聊一下如何定位python内存泄漏问题。
定位内存泄漏
第一步:确定是否有内存泄漏
上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