MemoryMax= и MemoryHigh= в systemd
MemoryMax= задаёт жёсткий предел памяти: при его превышении процесс убивает ядро. MemoryHigh= — мягкий: при превышении процесс замедляется, но не убивается.
Что делает
Разница в поведении критична. Жёсткий предел — это гарантия, что служба не съест память машины, но цена — внезапная смерть процесса. Мягкий предел заставляет ядро активнее вытеснять страницы: служба работает медленнее, но живёт. Часто их задают парой: мягкий чуть ниже жёсткого.
Значения принимают суффиксы (M, G) и проценты от общей памяти машины. Проценты удобны для одинаковых unit-файлов на машинах разного размера.
Где ставится. В секции [Service]. Те же параметры доступны у срезов.
Значения
| Значение | Что происходит |
|---|---|
MemoryMax=2G | жёсткий предел: при превышении ядро убивает процесс. |
MemoryHigh=1800M | мягкий предел: замедление вместо смерти. |
MemoryMax=50% | половина памяти машины. |
MemorySwapMax=0 | запретить службе использовать подкачку. |
Пример
Пара пределов: сначала замедление, потом жёсткая граница.
[Service]
MemoryHigh=1800M
MemoryMax=2G
MemoryAccounting=yes
Учёт памяти включается автоматически при задании пределов, но явная строка делает unit-файл понятнее.
Типичные ошибки
При достижении жёсткого предела процесс убивают: состояние результата будет oom-kill, а данные могут потеряться.
Предел ниже реальной потребности превращает службу в бесконечный цикл падений и перезапусков.
Для JVM и подобных предел должен быть выше размера кучи с запасом: иначе процесс убьют сразу после старта.
Проценты считаются от памяти машины, а не от памяти среза.
Связанные ошибки
- Failed with result 'oom-kill'Состояние oom-kill: процесс службы убит из-за нехватки памяти. Как понять, упёрлись в предел службы или в память машины.
- status=204/MEMORY в systemdКод 204/MEMORY: systemd не смог выделить память при подготовке запуска службы. Что проверять на машине и в unit-файле.
- signal=KILL (status=9/KILL) в systemdПроцесс службы убит сигналом KILL. Кто мог его послать: OOM-killer, таймаут остановки systemd, администратор.
Рядом стоящие параметры
Где важен на практике
Источники
- systemd.resource-control(5)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)