python - 在 Flask/Gunicorn 应用程序中减少分叉后的内存使用
问题描述
我正在使用带有 gunicorn 的 Flask,我的配置文件如下所示:
timeout = 30
limit_request_line = 6000
max_requests = 500 # restart worker after this many requests
max_requests_jitter = 100
preload_app = True
workers = 2
有了两个同步工作者和预分叉,我希望我的大部分应用程序代码在分叉之前加载到父进程中。但是,我注意到在执行前几个请求后,两个工作进程的内存使用量急剧增加。
我试图找到可以在“运行时”而不是在烧瓶应用程序设置时加载的任何东西,但我找不到任何东西。我已经尝试过广泛使用 memory_profiler,但还没有提供任何有用的数据。我什至尝试确保我的应用程序、模型和视图在分叉之前已经加载:
def pre_fork(server, worker):
print(f"PRE-FORK {server} {worker}")
import myapp.views
虽然我可以看到它被调用并加载了我的所有视图(就应用程序而言,它应该基本上加载所有内容),但这并没有什么区别。我该怎么做才能找出导致工作进程中第一个请求的大量内存消耗的原因?第一次请求后内存使用非常稳定且平坦,因此我认为不会出现持续泄漏。我只想找出在分叉之前没有加载并且没有共享的内容。
我的主要问题是:当第一个请求进入可能会将额外位加载到内存中的工作人员时,Flask 做了哪些额外的工作?
解决方案
推荐阅读
- javascript - 如何使用javascript从某些位置删除字符串并在该位置添加另一个字符串?
- django - DJANGO > 2.2 - 外键 A、B 或外键 A、B、C 上的唯一性
- python - 我无法使用 load.models() 加载经过训练的 h5 模型,如何解决此错误?
- bash - 查找文件中是否存在行并使用awk添加具有文件名的列?
- r - 如何根据其他栅格的比例覆盖范围去除栅格像素,R
- c++ - 我是否必须安装“libbitcoin-server”才能包含“bitcoin.hpp”?
- python - 从字典创建一组新的数据框
- docker - Docker swarm 容器副本正在运行,但无法在浏览器或 curl 中访问相同的副本
- php - Mysql UPDATE查询,保持现有值为NULL
- c# - 部分 LINQ 查询到单独的方法(EF Core)