上个星期,把之前弄的tensorflow项目部署到线上,真正开始进行评测的时候,发现了还是会有一些问题,而且这些问题还是相对比较严重的,在这里我就先给大家分享一下model_from_json造成的内存泄露问题,以及怎么解决的。
一、背景
在我的一篇博客中,写了关于tensorflow训练完后model的保存以及借助redis加载到内存形成分并发调用,并且在对模型进行更新的时候只需要更新一台机器即可,有加快模型调用以及方便的作用。
感兴趣的可以先去看看我的这篇博客。
https://editor.csdn.net/md/?articleId=106159583
但是在真正部署到线上运行的时候,发现其中一个问题。
服务器内存监控如下:
是的,可以看到从12点那里部署上线后,内存就在不断升高,到达峰值后又会清除掉部分内存,但是也不能使得内存完全降下来。
这在服务中是比较严重的情况了,内存爆了很容易服务器就宕机了。影响这台机器上面的所有业务。
所以遇到这个问题必须想办法解决,不解决就没办法上线。
在这里顺便跟大家分享一下怎么查找消耗内存的方式。(这个也是我老大教了我一下)
二、寻找原因
1、借助内存分析库 memory_profiler
from memory_profiler import profile
@profile(precision=4, stream=open('memory_profiler.log', 'w+'))
def process():
pass
参数含义:precision:精确到小数点后几位
stream:此模块分析结果保存到 ‘memory_profiler.log’ 日志文件。如果没有此参数,分析结果会在控制台输出。
2、看逻辑代码,因为是对量比较大的数据进行模型预测,所以第一步想的就是 可能是中间数据来不及释放导致的内存泄露。
于是就在代码末尾加入了python回收机制gc,手动回收。
del data,c_data
gc.collect()
看看代码执行后生成的memory_profiler.log 文件