#docker #memory #runit
#docker #память #runit
Вопрос:
У меня есть приложение, запущенное в Docker, которое со временем теряет память. Мне нужно периодически перезапускать это приложение, когда использование памяти превышает пороговое значение. Мое приложение может реагировать на сигналы или прикасаться tmp/restart.txt
(это Rails)… пока я могу запускать скрипт или отправлять настраиваемый сигнал при срабатывании ограничений, я могу безопасно завершить / перезапустить свой процесс.
Я изучил ограничение использования памяти с помощью Docker, но я не вижу пользовательского действия при достижении предела или резервирования. SIGKILL
Не подходит для моего приложения… Мне нужно некоторое время для очистки.
Я использую runit как минимальную систему инициализации внутри контейнера и ECS для оркестровки контейнера. Это похоже на проблему, которая решается на уровне приложения или инициализации… уничтожение контейнера вместо перезапуска процесса кажется тяжелым.
В прошлом я использовал для этого Monit, но мне не нравится, как Monit работает с pid-файлами… слишком часто Monit теряет контроль над процессом. Я пробую Inspeqtor, который, кажется, очень хорошо подходит, но, хотя он поддерживает runit, нет пакетов, которые работают с runit из коробки.
Итак, мой вопрос в том, если SIGKILL не подходит для моего варианта использования, каков наилучший способ отслеживать процесс на предмет использования памяти, а затем выполнить действие очистки / перезапуска на основе того, что использование превышает пороговое значение?
Комментарии:
1. Интересно, добавите ли вы в свое приложение API на основе Rails, указав его вид памяти изнутри контейнера. Затем снаружи вы могли бы реализовать проверку работоспособности, которая завершается неудачей, если объем памяти превышает установленный предел. Я полагаю, что в этом случае Docker выполнит перезапуск контейнера?
2. Или вы могли бы отправить
SIGINT
основной задаче вашего контейнера, обнаружив увеличение объема памяти в задаче супервизора / фоновой задачи, а затем использовать правила перезапуска Docker для перезапуска контейнера.