![如何使用 uWSGI Emperor 将所有应用程序的资源限制在给定量(而不是每个应用程序的资源)](https://linux22.com/image/797521/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20uWSGI%20Emperor%20%E5%B0%86%E6%89%80%E6%9C%89%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%9A%84%E8%B5%84%E6%BA%90%E9%99%90%E5%88%B6%E5%9C%A8%E7%BB%99%E5%AE%9A%E9%87%8F%EF%BC%88%E8%80%8C%E4%B8%8D%E6%98%AF%E6%AF%8F%E4%B8%AA%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%9A%84%E8%B5%84%E6%BA%90%EF%BC%89.png)
我有一个 Django 应用程序,我想将其 uWSGI 使用的资源限制为 12288MB,并将进程(工作进程)限制为 6。
对于 3 个独立的应用程序,我可以将每个应用程序限制为 2 个工作程序,每个工作程序限制为 2048MB 内存(limit-as
),但我宁愿让所有 3 个应用程序共享相同数量的资源(它们都是相关的,并且 1 个并不比另一个更重要 - 它们只是独立的应用程序,因为它们都使用 Python 配置)。我不希望一个应用程序受到重击,而其他 2 个应用程序在海滩上啜饮 Mai Tais,占用 1.5GB 的 RAM 和处理器。
我的 uWSGI 配置如下:
--emperor /etc/uwsgi/apps-enabled
--disable-logging
--die-on-term
--master
--uid www-data
--gid www-data
--logto /var/log/uwsgi/emperor.log
每个应用程序类似于:
[uwsgi]
socket = /tmp/app-1.uwsgi.sock
workers = 2
threads = 40
limit-as = 2048
harakiri = 20
max-requests = 1600
plugins = python
module = myapp.wsgi
callable = application
venv = /var/www/myapp/deps/current/venv
chdir = /var/www/myapp/deps/current/repo/src
touch-reload = /var/www/myapp/uwsgi/reload
auto-procname = true
procname-prefix-spaced = myapp
vacuum = true
reload-mercy = 8
顺便问一下(附带问题),所有这些设置都可以互换吗?例如,我可以将某个应用程序的设置添加到主 uWSGI 配置中(对于所有 3 个应用程序都相同),也可以将某些内容添加log-to
到特定应用程序 - 我不确定每个设置是否都可以这样互换。
答案1
我强烈建议您使用 cgroups(仅限 Linux)来管理这种隔离。
删除限制
并添加
cgroup = /cgroup/app1
cgroup-opt = 内存.limit_in_bytes=1067459584
更多信息请参见此处:
http://projects.unbit.it/uwsgi/wiki/UseCgroups
唯一的“缺点”是你需要以 root 身份运行 Emperor,并在每个 vassal 中设置 uid 和 gid