Установка пределов потребления памяти с помощью Upstart - PullRequest
19 голосов
/ 07 июня 2011

Я недавно очень полюбил Upstart.Раньше я использовал God, Monit и Bluepill, но мне не очень нравятся эти решения, поэтому я пробую Upstart.

Я использовал гем Foreman для генерации некоторых базовых файлов конфигурации Upstart.для моих процессов в /etc/init.Однако эти сгенерированные файлы обрабатывают только возрождение сбойного процесса.Мне было интересно, можно ли сказать Upstart перезапустить процесс, который потребляет, например, > 150mb памяти, как вы это сделали бы с Monit, God или Bluepill.* и это выглядит как то, что я ищу.Хотя я понятия не имею, как настроить что-то вроде этого.

То, что я в основном хочу, довольно просто.Я хочу перезапустить процесс 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'

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

Ответы [ 2 ]

10 голосов
/ 09 июня 2011

Добавление этого к концу myapp-web-*.conf приведет к тому, что любые вызовы выделения, пытающиеся выделить более 150mb памяти, вернутся ENOMEM:

limit rss 157286400 157286400

В этот момент процесс может завершиться сбоем,или нетЭто до процесса!

Вот тест для этого в Upstart Source .

4 голосов
/ 02 июня 2016

В документах 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 при превышении этого предела. Также автоматическое расширение стека будетfail (и генерирует SIGSEGV, который убивает процесс, если альтернативный стек не был доступен через sigaltstack (2)). Поскольку значение является длинным, на машинах с 32-битной длиной это ограничение не превышает 2 ГиБ, илиэтот ресурс не ограничен.

...