Я использую systemd для запуска Celery, распределенного планировщика задач Python, на сервере Ubuntu 18.04 LTS.
Мне приходится планировать в основном длительные задачи (выполнение которых занимает несколько минут), которые, в зависимости от данных, могут в конечном итоге потреблять большой объем оперативной памяти. Я хочу принять какие-то меры безопасности, чтобы контролировать использование памяти.
я прочитал Вот что вы можете контролировать, сколько оперативной памяти используется службой systemd, используя MemoryHigh
и MemoryMax
параметры
Я использовал эти параметры в своей настройке службы сельдерея, и я наблюдал, что происходит с службой сельдерея, когда она достигает заданных пределов с помощью htop
.
Служба останавливает выполнение и переводится в состояние «D», но остается там, а выделенная память не освобождается.
Может ли systemd убить процесс поедания памяти?
ОБНОВИТЬ
Как предлагается в комментарии ниже, я попробовал выполнить диагностику и добавлю другие подробности проблемы.
Сервер Linux работает на виртуальной машине разработки, размещенной в Virtual Box, и выполняет только задачу, потребляющую ресурсы.
В MemoryMax
настройка устанавливается в процентах (35%).
На картинке ниже вы можете увидеть статус процесса в htop
Как было предложено в ответе на этот Вопрос, следующее содержимое стека приостановленного процесса.
[<0>] __lock_page_or_retry+0x19b/0x2e0
[<0>] do_swap_page+0x5b4/0x960
[<0>] __handle_mm_fault+0x7a3/0x1290
[<0>] handle_mm_fault+0xb1/0x210
[<0>] __do_page_fault+0x281/0x4b0
[<0>] do_page_fault+0x2e/0xe0
[<0>] page_fault+0x45/0x50
[<0>] 0xffffffffffffffff
Процесс уже должен быть убит, если он достигнет MemoryMax=
. Но если это пройдет MemoryHigh=
тогда он может быть приостановлен описанным вами способом. Проблема в том, что если вы достигнете MemoryHigh=
тогда ты никогда не сможешь достичь MemoryMax=
. Если процесс на самом деле не освобождает память, он будет приостановлен навсегда.
Если вы хотите, чтобы служба умирала, если она использует определенный объем памяти, не указывайте MemoryHigh=
вообще, только MemoryMax=
.
В конечном итоге ваши разработчики должны найти и устранить утечки памяти в приложении.