flask 内存回收的问题,请教下各位大佬

2022-03-04 20:03:25 +08:00
 MonTubasa
flask 在并发请求下,内存会逐渐上涨。

在启动的时候会声明一些全局变量,然后由定时任务发起请求更新这些全局变量,猜测是更新全局变量后造成内存泄漏。
就想问下,如何动态地去追踪这类内存泄漏
还有就是,如何在请求结束归还本次请求所占用的所有内存。

谢谢大佬们!
4055 次点击
所在节点    Python
9 条回复
sagaxu
2022-03-04 20:09:58 +08:00
设置 max_requests ,每处理 xx 个请求重启进程,能缓解内存泄露。每个请求结束后自动回收,只有 PHP 支持这个特性。
gstqc
2022-03-04 20:12:37 +08:00
uwsgi 也可以设置 max requests 的
追踪内存使用 memory_profiler 之类的
MonTubasa
2022-03-04 21:44:53 +08:00
@sagaxu 因为是想调用 sklearn 的扩展,每次启动的时候会加载 20G 左右的 model 文件,重启不知道会不会时间很慢。我先试试
sudoy
2022-03-04 22:23:40 +08:00
gunicorn 设置 max_requests 就可以减少内存泄漏
https://docs.gunicorn.org/en/stable/settings.html#max-requests
westoy
2022-03-04 22:36:58 +08:00
@MonTubasa

你这个该分离成后端服务, 就不该整合到 web 层里
zcf0508
2022-03-04 23:50:43 +08:00
我也遇到这个问题了

感谢 @sudoy 的回答,不过我还想问下 max_requests 的值设多少比较合适呢?
Brian1900
2022-03-05 07:18:12 +08:00
pu 只能重启进程?没更优雅的做法了吗?比如如何找出内存泄漏
sudoy
2022-03-05 09:40:13 +08:00
@zcf0508 一些大的网站设置 max_requests = 500 ,max_requests_jitter = 200 ,这个具体要根据你的服务器配置来,因为 worker 重启的时候也是吃内存的。gunicorn 19.2 以后就引入 max_requests_jitter ,最好设置 max_requests_jitter ,不然所有 worker 同时重启会导致引发空档期,以下是一些相关文档:

https://docs.gunicorn.org/en/stable/settings.html#max-requests
https://linuxtut.com/en/2668a2243a5191bcdc78/
https://stackoverflow.com/questions/24655713/gunicorn-max-requests-for-production
MonTubasa
2022-03-05 13:43:13 +08:00
@westoy 是以 web 的形式给其他服务调用,只是说调用的频次比较高

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/838050

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX