Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
systemd Error: User slice memory limit exceeded (MemoryMax enforcement) Linux / DevOps

Ошибка systemd: User slice memory limit exceeded — Настройка cgroups

Обновлено: 18.08.2026  ·  Официальная база знаний

Процессы пользователя или веб-сервиса внезапно завершаются по сигналу SIGKILL без явных записей глобального OOM ядра. В системном журнале фиксируется: user.slice: A process of this unit was killed by the OOM killer или MemoryMax exceeded, killing process.

Параметр cgroupsДействие при превышенииРегистрируемое событие
MemoryMax (Hard limit)Ядро мгновенно вызывает cgroup OOM Killersystemd[1]: user-1000.slice: Out of memory
MemoryHigh (Soft limit)Троттлинг процессов и агрессивный swapmemory.high breached, processes slowed down
TasksMaxБлокировка системного вызова fork() / clone()cgroup: fork rejected by pids.max
  • Падение ресурсоемких сборщиков (Webpack, Maven), серверов баз данных или пулов PHP/NodeJS.
  • В выводе journalctl -u <unit> появляется признак Killed process <PID> (app) total-vm:... anon-rss:....
  1. Проверьте текущее потребление памяти и настройки лимитов в сгруппированном виде:
    systemd-cgtop
    systemctl status <service_name_or_user_slice>
  2. Проверьте метрики cgroups v2 для проблемного слайса или сервиса:
    cat /sys/fs/cgroup/system.slice/<unit>.service/memory.current
    cat /sys/fs/cgroup/system.slice/<unit>.service/memory.events
  3. Для увеличения или снятия лимита памяти создайте override-файл юнита:
    sudo systemctl edit <service_name>.service
    
    # Внесите увеличенные ограничения:
    [Service]
    MemoryMax=8G
    MemoryHigh=7G
    MemorySwapMax=2G
  4. Если лимит срабатывает на весь пользовательский срез (например, user-1000.slice), отредактируйте /etc/systemd/system/user-.slice.d/override.conf:
    [Slice]
    MemoryMax=16G
  5. Примените параметры к подсистеме управления ресурсами:
    sudo systemctl daemon-reload
    sudo systemctl restart <service_name>
Внимание: Использование MemoryHigh предпочтительнее MemoryMax, так как при достижении MemoryHigh systemd плавно замедляет ввод-вывод процесса и заставляет ядро сбрасывать файловый кэш, предотвращая аварийное уничтожение процесса (SIGKILL).
Практический опыт инженера: При переходе на cgroups v2 параметры `MemoryLimit` устарели. Используйте актуальные директивы `MemoryMax`, `MemoryHigh` и `MemoryMin`.

Частые вопросы (FAQ)

В чем разница между cgroup OOM Killer и System OOM Killer?

System OOM Killer срабатывает, когда заканчивается вся физическая память и swap хоста. Cgroup OOM Killer изолированно уничтожает процессы конкретного юнита или слайса, превысившего свою персональную квоту MemoryMax, даже если на сервере свободно 90% общей памяти.

Как узнать, какой именно процесс был убит по лимиту памяти?

Выполните команду journalctl -k | grep -i oom или просмотрите memory.events в каталоге cgroup соответствующего сервиса.

Что произойдет, если установить MemoryMax=infinity?

Ограничение памяти на уровне cgroup будет полностью отключено, и сервис сможет использовать всю доступную оперативную память хоста.

Как сбросить накопленную статистику OOM событий сервиса?

Счетчики memory.events поддерживаются ядром Linux и обнуляются только при полном перезапуске или уничтожении контрольной группы (cgroup) сервиса.