uWSGI 是否在启动时启动所有进程?

Does uWSGI start all processes at boot time?

我在 uWSGI 上有几个应用程序 运行。随着时间的推移,它们中的大多数都会增加内存使用量。我一直将此归因于我没有追踪到的内存泄漏。但最近我注意到增长非常缓慢。我想知道每个块是否与正在启动的进程相关。

uWSGI 是在启动时启动所有进程,还是只在有足够的请求进入时才启动一个新进程?

这是一个示例配置:

[uwsgi]
strict = true

wsgi-file = foo.py
callable = app

die-on-term = true

http-socket = :2345

master = true
enable-threads = true
thunder-lock = true
processes = 6
threads = 1

memory-report = true

更新: 这看起来很相关:http://uwsgi-docs.readthedocs.org/en/latest/Cheaper.html

"worker"和"process"是一个意思吗(答案好像是yes)?如果是这样,那么如果我希望数字始终保持不变,我应该这样做:

cheaper = 6
cheaper-initial = 6
processes = 6

是的,uWSGI 将在启动时启动所有进程(或 worker - worker 是 uWSGI 配置中进程的别名),但这将取决于您的应用程序从那时起会发生什么。如果应用程序在启动时导入所有模块,它应该在第一次请求之前完全加载,但如果一些模块在请求时加载,每个工作人员将仅在第一次请求后完全加载(假设任何请求都会加载所有模块。如果不是,只有在执行将加载所有请求的组合后才会完全加载)。

但即使在加载所有模块之后,应用程序内存使用量也不会保持不变。每个请求上可能会累积一些日志记录、全局变量、调试信息等。如果您使用任何框架,它可能会保存一些数据用于调试、统计等。

默认情况下,cheaper 未启用——这意味着 uWSGI 将在启动时生成所有 worker。如果你想使用更便宜的模式,你需要至少定义 cheaper 参数。您可以在 documentation

中找到有关使用更便宜系统的更多信息

uWSGI 中内置了许多其他系统来根据请求量控制负载。例如

如果担心uWSGI占用资源过多,也有解决办法: