status=204/MEMORY в systemd
Код 204/MEMORY значит, что памяти не хватило самому systemd при подготовке процесса — ещё до запуска программы. Это признак либо исчерпанной памяти на машине, либо слишком тесного предела в MemoryMax= для службы.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
На машине действительно кончилась память
При исчерпанной памяти и отсутствии подкачки выделение падает у всех, включая служебные шаги systemd. Часто рядом в журнале видны сообщения ядра про OOM.
-
Слишком низкий
MemoryMax=у службы или её срезаОграничение применяется до запуска программы, поэтому выделение памяти под подготовку упирается в него сразу же.
-
Служба перезапускается по кругу и память фрагментирована накопленными процессами
При
Restart=alwaysи падениях без паузы старые процессы могут не успевать завершаться, и потребление растёт с каждым кругом.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Подтверждает шаг, на котором не хватило памяти.
journalctl -xeu myapp.service --no-pager -n 30Показывает и предел, и текущее потребление: сразу видно, упёрлись ли в ограничение или в память машины.
systemctl show myapp.service -p MemoryMax -p MemoryCurrent -p SliceСообщения ядра про нехватку памяти за текущую загрузку.
journalctl -k -b --no-pager | grep -i oomРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- При исчерпанной памяти и отсутствии подкачки выделение падает у всех, включая служебные шаги systemd. Часто рядом в журнале видны сообщения ядра про OOM.
- Как проверить
-
Посмотрите свободную память и записи ядра об убийстве процессов.
free -h journalctl -k --no-pager | grep -i -E "out of memory|oom"
- Как исправить
- Освободите память, добавьте подкачку или разнесите службы. Пока память исчерпана, перезапуск службы будет падать снова.
MemoryMax= у службы или её среза- Почему происходит
- Ограничение применяется до запуска программы, поэтому выделение памяти под подготовку упирается в него сразу же.
- Как проверить
-
Проверьте действующие ограничения у службы и у её среза.
systemctl show myapp.service -p MemoryMax -p MemoryHigh -p Slice systemctl show system.slice -p MemoryMax
- Как исправить
-
Поднимите
MemoryMax=или уберите его, если ограничение задавалось «на глаз». Разумное значение выбирают по замеру обычного потребления плюс запас.
- Почему происходит
- При
Restart=alwaysи падениях без паузы старые процессы могут не успевать завершаться, и потребление растёт с каждым кругом.
- Как проверить
-
Посмотрите счётчик перезапусков и число процессов в срезе службы.
systemctl show myapp.service -p NRestarts -p TasksCurrent systemd-cgtop -1 --depth=2
- Как исправить
-
Поставьте
RestartSec=не меньше нескольких секунд и разберитесь с исходным падением: бесконечный цикл перезапуска лечится не памятью.
Пример вывода
Служба с очень низким ограничением памяти. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
× indexer.service - Search indexer
Active: failed (Result: exit-code) since Mon 2026-09-14 03:55:12 MSK; 2s ago
Process: 9001 ExecStart=/usr/local/bin/indexer (code=exited, status=204/MEMORY)
systemd[9001]: indexer.service: Failed to allocate memory: Cannot allocate memory
systemd[1]: indexer.service: Main process exited, code=exited, status=204/MEMORY
Связанные ошибки
- Failed with result 'oom-kill' Состояние oom-kill: процесс службы убит из-за нехватки памяти. Как понять, упёрлись в предел службы или в память машины.
- signal=KILL (status=9/KILL) в systemd Процесс службы убит сигналом KILL. Кто мог его послать: OOM-killer, таймаут остановки systemd, администратор.
- status=206/OOM_ADJUST в systemd Код 206/OOM_ADJUST: не удалось изменить оценку OOM для процесса службы. Обычно мешают права или значение вне диапазона.
- Cannot allocate memory в журнале службы Не удалось выделить память: предел службы, память машины, настройка overcommit, исчерпанные области отображения.
- signal=XCPU и signal=XFSZ в systemd Процесс службы убит из-за превышения предела процессорного времени (XCPU) или размера файла (XFSZ) из LimitCPU и LimitFSIZE.
- status=205/LIMITS в systemd Код 205/LIMITS: systemd не смог применить ограничения ресурсов из Limit*=. Обычно значение недопустимо или превышает жёсткий предел.
- systemd-oomd остановил службу из-за нехватки памяти Служба остановлена не ядром, а системной службой наблюдения за памятью: критерий другой, и настраивается он иначе.
- Служба замедляется при упоре в MemoryHigh Мягкий предел памяти не убивает, но тормозит. Как заметить давление памяти и отличить его от нехватки.
Источники
-
systemd.exec(5)
204 EXIT_MEMORY: не удалось выполнить действие из-за нехватки памяти. -
systemd.resource-control(5)
MemoryMax= и поведение при достижении предела. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено на unit с MemoryMax=1M.