SystemdDoctor
служба не работает память ограничения ресурсы

status=204/MEMORY в systemd

Код 204/MEMORY значит, что памяти не хватило самому systemd при подготовке процесса — ещё до запуска программы. Это признак либо исчерпанной памяти на машине, либо слишком тесного предела в MemoryMax= для службы.

Вероятные причины

По порядку: сверху то, что встречается чаще.

  1. На машине действительно кончилась память

    При исчерпанной памяти и отсутствии подкачки выделение падает у всех, включая служебные шаги systemd. Часто рядом в журнале видны сообщения ядра про OOM.

  2. Слишком низкий MemoryMax= у службы или её среза

    Ограничение применяется до запуска программы, поэтому выделение памяти под подготовку упирается в него сразу же.

  3. Служба перезапускается по кругу и память фрагментирована накопленными процессами

    При 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

Решение

Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.

1. На машине действительно кончилась память
Почему происходит
При исчерпанной памяти и отсутствии подкачки выделение падает у всех, включая служебные шаги systemd. Часто рядом в журнале видны сообщения ядра про OOM.
Как проверить
Посмотрите свободную память и записи ядра об убийстве процессов.
free -h
journalctl -k --no-pager | grep -i -E "out of memory|oom"
Как исправить
Освободите память, добавьте подкачку или разнесите службы. Пока память исчерпана, перезапуск службы будет падать снова.
2. Слишком низкий MemoryMax= у службы или её среза
Почему происходит
Ограничение применяется до запуска программы, поэтому выделение памяти под подготовку упирается в него сразу же.
Как проверить
Проверьте действующие ограничения у службы и у её среза.
systemctl show myapp.service -p MemoryMax -p MemoryHigh -p Slice
systemctl show system.slice -p MemoryMax
Как исправить
Поднимите MemoryMax= или уберите его, если ограничение задавалось «на глаз». Разумное значение выбирают по замеру обычного потребления плюс запас.
3. Служба перезапускается по кругу и память фрагментирована накопленными процессами
Почему происходит
При 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 255
    сверено 15 сентября 2026
  • systemd.resource-control(5)
    MemoryMax= и поведение при достижении предела.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Воспроизведено на unit с MemoryMax=1M.
    собственная проверка, systemd 255
    сверено 15 сентября 2026