Ошибка systemd: User slice memory limit exceeded — Настройка cgroups
Процессы пользователя или веб-сервиса внезапно завершаются по сигналу 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 Killer | systemd[1]: user-1000.slice: Out of memory |
MemoryHigh (Soft limit) | Троттлинг процессов и агрессивный swap | memory.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:....
- Проверьте текущее потребление памяти и настройки лимитов в сгруппированном виде:
systemd-cgtop systemctl status <service_name_or_user_slice> - Проверьте метрики cgroups v2 для проблемного слайса или сервиса:
cat /sys/fs/cgroup/system.slice/<unit>.service/memory.current cat /sys/fs/cgroup/system.slice/<unit>.service/memory.events - Для увеличения или снятия лимита памяти создайте override-файл юнита:
sudo systemctl edit <service_name>.service # Внесите увеличенные ограничения: [Service] MemoryMax=8G MemoryHigh=7G MemorySwapMax=2G - Если лимит срабатывает на весь пользовательский срез (например,
user-1000.slice), отредактируйте/etc/systemd/system/user-.slice.d/override.conf:[Slice] MemoryMax=16G - Примените параметры к подсистеме управления ресурсами:
sudo systemctl daemon-reload sudo systemctl restart <service_name>
MemoryHigh предпочтительнее MemoryMax, так как при достижении MemoryHigh systemd плавно замедляет ввод-вывод процесса и заставляет ядро сбрасывать файловый кэш, предотвращая аварийное уничтожение процесса (SIGKILL).Частые вопросы (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) сервиса.