作者:宝宝2502932575 | 来源:互联网 | 2022-12-19 17:20
我的Flask API有一个很小的内存泄漏,在许多API调用中导致我的应用程序达到内存限制并崩溃.我一直试图找出为什么一些记忆没有被释放到目前为止没有成功,我相信我确实知道消息来源.我很感激任何帮助!
不幸的是我无法分享代码但是用英语描述它,我的烧瓶应用程序为用户提供了一个API端点,可以执行以下操作(一次性调用):
根据提供的ID从MongoDB中提取一些数据.
根据返回的内容,使用python-docx库构建文档对象并将其保存到磁盘
最后,我将保存到磁盘的内容上传到S3存储桶,然后删除磁盘上的内容
据我所知,使用memory_profiler库,我看到内存使用最多的两个区域是Document对象的初始化和连接/保存到S3(分别为7MB和4.8MB).
我正在做的是监视我的Python进程的内存使用情况,我正在使用psutils打印出在某些关键点使用的rss内存(下面的示例代码).
process = psutil.Process(os.getpid())
mem0 = process.memory_info().rss
print('Memory Usage After Action',mem0/(1024**2),'MB')
## Perform some action
mem1 = process.memory_info().rss
print('Memory Usage After Action',mem1/(1024**2),'MB')
print('Memory Increase After Action',(mem1-mem0)/(1024**2),'MB')
提供的控制台图像是在我在本地托管应用程序三次之后调用该应用程序.令人担忧的是,每个顺序API调用似乎都是在最后一次调用离开内存使用量的位置或之上开始并继续添加到它上面应用程序从93MB开始(参见黄色高亮显示)但在第一次调用之后它以103.79结束MB,第二个起始于103.87MB,结束时为105.39MB,第三个起始于105.46Mb,最终为106MB.使用量减少但在100次调用后我仍然看到增量内存使用量.红色和蓝色线显示API调用期间各个点的内存更改.红线在文档构建之后,蓝线在S3上载之后.
请注意,我的测试程序每次都使用相同的参数调用API.
除其他外,我测试了以下内容:
所以GC.Collect()
使用'del'显式删除变量/对象引用
确保mongo连接关闭(因为我使用IBM_Botos3库进行S3连接,我不知道是否有办法明确关闭此连接)
我没有为每个API调用保存的全局变量(app是唯一的全局变量)
我知道,因为我无法提供代码,所以可能没有什么可以离开这里但是如果没有想法我想知道是否有一种最佳实践方法来处理烧瓶内存使用或在烧瓶功能返回之后清除内存的方法.现在我的烧瓶功能是相对标准的Python函数(因此我希望此函数中的局部变量在之后被垃圾收集).
我正在使用Python 3.6,Flask 0.11.1和pymongo 3.6.1,我的测试现在是在Windows 7机器上,但我的IBM云服务器看到了同样的问题.