Как мне отслеживать и перезапускать мое приложение, запущенное в Docker, на основе использования памяти?

#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 для перезапуска контейнера.