首页 > 解决方案 > 在 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

有了两个同步工作者和预分叉,我希望我的大部分应用程序代码在分叉之前加载到父进程中。但是,我注意到在执行前几个请求后,两个工作进程的内存使用量急剧增加。

在第一个请求进来后,两名工作人员使用一堆 ram

我试图找到可以在“运行时”而不是在烧瓶应用程序设置时加载的任何东西,但我找不到任何东西。我已经尝试过广泛使用 memory_profiler,但还没有提供任何有用的数据。我什至尝试确保我的应用程序、模型和视图在分叉之前已经加载:

def pre_fork(server, worker):
    print(f"PRE-FORK {server} {worker}")
    import myapp.views

虽然我可以看到它被调用并加载了我的所有视图(就应用程序而言,它应该基本上加载所有内容),但这并没有什么区别。我该怎么做才能找出导致工作进程中第一个请求的大量内存消耗的原因?第一次请求后内存使用非常稳定且平坦,因此我认为不会出现持续泄漏。我只想找出在分叉之前没有加载并且没有共享的内容。

我的主要问题是:当第一个请求进入可能会将额外位加载到内存中的工作人员时,Flask 做了哪些额外的工作?

标签: pythonpython-3.xflaskgunicorn

解决方案


推荐阅读