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

Cannot allocate memory в журнале службы

Сообщение Cannot allocate memory (номер 12, ENOMEM) означает отказ выделения памяти. У служб под systemd причины три: собственный предел памяти, нехватка памяти на машине и системные ограничения вроде числа областей отображения.

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

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

  1. Упор в предел памяти службы

    При заданном MemoryMax= выделение сверх предела не проходит. Если программа обрабатывает отказ, она сообщает об ошибке вместо смерти.

  2. Кончилась память на машине

    При исчерпании памяти и отсутствии подкачки выделение падает у всех процессов.

  3. Исчерпаны области отображения памяти

    Предел vm.max_map_count ограничивает число областей на процесс. Службы вроде Elasticsearch упираются в него при значении по умолчанию.

Диагностика

Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.

Память машины и пределы службы вместе.

free -h && systemctl show myapp.service -p MemoryMax -p MemoryPeak

Работал ли механизм освобождения памяти.

journalctl -k -b --no-pager | grep -iE "out of memory|oom"

Системные настройки, влияющие на выделение.

sysctl vm.overcommit_memory vm.max_map_count

Решение

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

1. Упор в предел памяти службы
Почему происходит
При заданном MemoryMax= выделение сверх предела не проходит. Если программа обрабатывает отказ, она сообщает об ошибке вместо смерти.
Как проверить
Сравните предел и потребление.
systemctl show myapp.service -p MemoryMax -p MemoryCurrent -p MemoryPeak
Как исправить
Поднимите предел или уменьшите потребление. Мягкий предел (MemoryHigh=) замедляет службу вместо отказов.
2. Кончилась память на машине
Почему происходит
При исчерпании памяти и отсутствии подкачки выделение падает у всех процессов.
Как проверить
Посмотрите память и записи ядра.
free -h
journalctl -k -b --no-pager | grep -i "out of memory" | tail -5
Как исправить
Найдите потребителя и ограничьте его. Подкачка помогает пережить пики, но не отменяет разбор.
3. Исчерпаны области отображения памяти
Почему происходит
Предел vm.max_map_count ограничивает число областей на процесс. Службы вроде Elasticsearch упираются в него при значении по умолчанию.
Как проверить
Посмотрите предел и текущее число областей.
sysctl vm.max_map_count
PID=$(systemctl show -p MainPID --value myapp.service); wc -l < /proc/$PID/maps
Как исправить
Поднимите предел через файл в /etc/sysctl.d.

Пример вывода

Служба упёрлась в собственный предел памяти. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.

myapp[4300]: error: mmap failed: Cannot allocate memory
myapp[4300]: fatal: cannot grow cache: out of memory
systemd[1]: myapp.service: Main process exited, code=exited, status=1/FAILURE

Связанные ошибки

Где встречается чаще всего

Источники

  • systemd.resource-control(5)
    MemoryMax=, MemoryHigh= и поведение при отказе выделения.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Воспроизведено на службе с MemoryMax=128M и растущим потреблением.
    собственная проверка, systemd 255
    сверено 15 сентября 2026