У меня есть приложение Django, для которого я хочу ограничить ресурсы, используемые uWSGI, до 12288 МБ, а процессы (рабочие) до 6.
С тремя отдельными приложениями я могу ограничить каждое до 2-х рабочих, а для каждого рабочего - 2048 МБ памяти (limit-as
), но я бы предпочел позволить всем трем приложениям совместно использовать одинаковое количество ресурсов (все они связаны, и одно не важнее другого - это только отдельные приложения, потому что каждое из них использует конфигурации Python). Я не хочу, чтобы одно приложение перегружалось, в то время как два других потягивают Mai Tais на пляже с 1,5 ГБ оперативной памяти и процессором.
Моя конфигурация 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
для конкретных приложений - я не был уверен, что все настройки так взаимозаменяемы.
Я настоятельно рекомендую вам использовать контрольные группы (только для Linux) для управления такой изоляцией.
удалить limit-as
и добавить
cgroup = / cgroup / app1
cgroup-opt = memory.limit_in_bytes = 1067459584
Больше информации здесь:
http://projects.unbit.it/uwsgi/wiki/UseCgroups
единственный "недостаток" в том, что вам нужно запустить императора как root и установить uid и gid для каждого вассала