我正在使用带有 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
Run Code Online (Sandbox Code Playgroud)
使用两个同步工作者和预分叉,我希望我的大部分应用程序代码在分叉之前加载到父进程中。但是我注意到在我执行前几个请求后,两个工作进程的内存使用量大幅增加。
我试图找到任何可以在“运行时”加载的东西,而不是在烧瓶应用程序设置时加载,但我找不到任何东西。我已经尝试广泛使用 memory_profiler,但还没有提出任何有用的数据。我什至尝试确保我的应用程序、模型和视图在分叉之前确实已加载:
def pre_fork(server, worker):
print(f"PRE-FORK {server} {worker}")
import myapp.views
Run Code Online (Sandbox Code Playgroud)
虽然我可以看到它被调用并加载了我的所有视图(就应用程序而言,它应该加载基本上所有的东西),但它没有区别。我该怎么做才能找出导致工作进程中第一个请求消耗大量内存的原因?在第一次请求之后内存使用非常稳定和平坦,所以我认为没有持续的泄漏。我只想找出在 fork 之前没有加载和没有共享的内容。
我的主要问题是:当第一个请求进入可能将额外位加载到内存中的工作人员时,Flask 正在做什么额外的工作?