Назад | Перейти на главную страницу

Ограничения памяти в systemd

Я использую 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=.

В конечном итоге ваши разработчики должны найти и устранить утечки памяти в приложении.