systemd-oomd остановил службу из-за нехватки памяти
Помимо остановки процессов ядром есть отдельная служба, останавливающая срезы по давлению на память. Она срабатывает раньше ядра и целится в срез, а не в отдельный процесс, поэтому её решения выглядят неожиданными: останавливается служба, которая потребляет не больше всех.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Давление на память в срезе превысило порог
Решение принимается по давлению, а не по объёму. Срез с активным обменом страницами останавливается даже при умеренном потреблении.
-
Служба помечена как предпочтительная для остановки
Пометка в описании службы делает её первой целью. Пометка могла быть унаследована из шаблона.
-
Остановку службой наблюдения путают с остановкой ядром
Это разные механизмы с разными причинами и настройками. Разбор по неверной ветке уходит в сторону.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Решения службы наблюдения за памятью.
journalctl -u systemd-oomd -b --no-pagerПометки и пределы памяти службы.
systemctl show myapp.service -p ManagedOOMPreference -p MemoryMax -p MemoryHighПотребление памяти по срезам.
systemd-cgtop -1 -n1 -m | head -10Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Решение принимается по давлению, а не по объёму. Срез с активным обменом страницами останавливается даже при умеренном потреблении.
- Как проверить
-
Посмотрите сообщения службы наблюдения и давление на память.
journalctl -u systemd-oomd -b --no-pager | tail -10 cat /sys/fs/cgroup/system.slice/myapp.service/memory.pressure 2>/dev/null
- Как исправить
- Ограничьте потребление памяти службы или снизьте её нагрузку. Настройка порогов задаётся в описании срезов, а не в самой службе.
- Почему происходит
- Пометка в описании службы делает её первой целью. Пометка могла быть унаследована из шаблона.
- Как проверить
-
Посмотрите пометки службы и её среза.
systemctl show myapp.service -p ManagedOOMPreference -p ManagedOOMSwap -p ManagedOOMMemoryPressure
- Как исправить
-
Уберите пометку предпочтения или наоборот пометьте службу как избегаемую, если она важнее остальных.
[Service] ManagedOOMPreference=avoid
- Почему происходит
- Это разные механизмы с разными причинами и настройками. Разбор по неверной ветке уходит в сторону.
- Как проверить
-
Сравните сообщения обеих подсистем.
journalctl -b --no-pager | grep -iE "systemd-oomd|Out of memory: Killed process" | tail -10
- Как исправить
- Определите источник по сообщению: служба наблюдения называет срез, ядро называет процесс и его потребление.
Пример вывода
Срез службы остановлен по давлению на память. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
systemd-oomd[720]: Considered 4 cgroups for killing, top candidate was: /system.slice/myapp.service
systemd-oomd[720]: Killed /system.slice/myapp.service due to memory pressure for /system.slice being 62.01% > 60.00% for > 20s with reclaim activity
systemd[1]: myapp.service: systemd-oomd killed some process(es) in this unit.
Связанные ошибки
- Failed with result 'oom-kill' Состояние oom-kill: процесс службы убит из-за нехватки памяти. Как понять, упёрлись в предел службы или в память машины.
- Cannot allocate memory в журнале службы Не удалось выделить память: предел службы, память машины, настройка overcommit, исчерпанные области отображения.
- MySQL убит из-за памяти: буферный пул больше доступной памяти MySQL падает сразу после старта или через минуты: размер innodb_buffer_pool_size превышает память машины.
- status=204/MEMORY в systemd Код 204/MEMORY: systemd не смог выделить память при подготовке запуска службы. Что проверять на машине и в unit-файле.
- Служба замедляется при упоре в MemoryHigh Мягкий предел памяти не убивает, но тормозит. Как заметить давление памяти и отличить его от нехватки.
- Disk quota exceeded для службы Место на разделе есть, а запись отклоняется: исчерпана дисковая квота пользователя или группы.
- Elasticsearch: max virtual memory areas vm.max_map_count is too low Elasticsearch отказывается стартовать из-за заниженного vm.max_map_count. Как поднять значение и закрепить его.
- Elasticsearch: служба падает из-за размера кучи JVM Размер кучи больше доступной памяти или больше предела службы: падение при старте или под нагрузкой.
Где встречается чаще всего
Источники
-
systemd-oomd.service(8)
Критерии остановки срезов по давлению на память. -
systemd.resource-control(5)
ManagedOOMPreference= и связанные параметры. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено на systemd 255: сообщения службы наблюдения отличаются от сообщений ядра.