Установка пределов потребления памяти с помощью Upstart
Недавно я очень увлекаюсь Upstart. Раньше я использовал Бога, Монита и Блюпилла, но мне не нравятся эти решения, поэтому я предлагаю попробовать Upstart.
Я использую самоцвет Foreman для создания некоторых базовых конфигурационных файлов Upstart для своих процессов в /etc/init
. Однако эти сгенерированные файлы обрабатывают регенерацию разбитого процесса. Мне было интересно, можно ли рассказать Upstart о перезапуске процесса, который потребляет, например, > 150mb
памяти, как и с Монитом, Богом или Блюмиллом.
Я прочитал Upstart docs и этот выглядит как то, что я ищу. Хотя я не знаю, как настроить что-то вроде этого.
То, что я в основном хочу, довольно просто. Я хочу перезагрузить мой web
процесс, если использование памяти > 150mb
ram. Это файлы, которые у меня есть:
|-- myapp-web-1.conf
|-- myapp-web-2.conf
|-- myapp-web-3.conf
|-- myapp-web.conf
|-- myapp.conf
И их содержимое:
myapp.conf
pre-start script
bash << "EOF"
mkdir -p /var/log/myapp
chown -R deployer /var/log/myapp
EOF
end script
MyApp-web.conf
start on starting myapp
stop on stopping myapp
myapp-web-1.conf/ myapp-web-2.conf/ myapp-web-3.conf
start on starting myapp-web
stop on stopping myapp-web
respawn
exec su - deployer -c 'cd /var/applications/releases/20110607140607; cd myapp && bundle exec unicorn -p $PORT >> /var/log/myapp/web-1.log 2>&1'
Любая помощь очень ценится!
Ответы
Ответ 1
Добавление этого значения в конец myapp-web-*.conf
вызовет вызовы выделения, пытающиеся выделить больше 150mb
памяти, чтобы вернуть ENOMEM
:
limit rss 157286400 157286400
В этот момент может произойти сбой процесса, иначе он может не произойти. Это до процесса!
Здесь тест для этого в Upstart Source.
Ответ 2
В документах Upstart лимиты взяты из опций системного вызова rlimit
. (http://upstart.ubuntu.com/cookbook/#limit)
Так как установка Linux 2.4+ rss (Resident Set Size) не влияет.
Альтернативой, уже предложенной в других ответах, является как, которая устанавливает пределы размера адресного пространства виртуальной памяти. Это будет иметь совсем другой эффект от установки "реальных" пределов памяти.
limit as <soft limit> <hard limit>
Выдержка из man-страниц для setrlimit:
RLIMIT_AS Максимальный размер виртуальной памяти процесса (адресного пространства) в байтах. Этот предел влияет на вызовы на brk (2), mmap (2) и mremap (2), которые терпят неудачу с ошибкой ENOMEM при превышении этого предела. Кроме того, автоматическое расширение стека не сработает (и сгенерирует SIGSEGV, что убивает процесс, если альтернативный стек не был доступен через sigaltstack (2)). Поскольку значение длинное, на машинах с 32-битный длинный либо этот предел не превышает 2 GiB, либо этот ресурс неограничен.