Подтвердить что ты не робот

Установка пределов потребления памяти с помощью 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'

Любая помощь очень ценится!

4b9b3361

Ответ 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, либо этот ресурс неограничен.