Многие привыкли к тому, что лимиты CPU и памяти - это что-то из мира docker и k8s. Но на самом деле механизм один и тот же:
cgroups. И если у вас обычный linux-сервер без контейнеров, вы все равно можете жестко ограничивать ресурсы для systemd-сервисов.Это удобно, когда один процесс начинает съедать всю память, душить CPU или мешать остальным сервисам на хосте.
В современных дистрибутивах используется cgroups v2, а systemd умеет работать с ним из коробки.
▪️ Что можно ограничить:
Память. Чтобы сервис не выедал весь RAM и не отправлял сервер в OOM.
CPU. Чтобы процесс не занимал все ядра и не мешал соседям.
Число процессов. Чтобы защититься от fork-бомб и неконтролируемого роста дочерних процессов.
▪️ Пример: ограничим сервис по памяти и CPU.. Откроем override-конфиг:
systemctl edit myapp.service
Добавим:
[Service]
MemoryMax=500M
CPUQuota=50%
TasksMax=200
MemoryMax=500M - сервис не сможет использовать больше 500 МБ памятиCPUQuota=50% - максимум половина одного CPUTasksMax=200 - не более 200 процессов/потоковПосле этого применяем изменения:
systemctl daemon-reload
systemctl restart myapp.service
Проверить лимиты можно так:
systemctl show myapp.service | grep -E "MemoryMax|CPUQuota|TasksMax"
Или посмотреть, в какой cgroup живет процесс:
systemctl status myapp.service
Если хотите ограничить уже запущенный сервис без ручного редактирования unit-файла, можно использовать runtime-свойства:
systemctl set-property myapp.service MemoryMax=300M CPUQuota=25%
Это удобно для быстрого придушивания прожорливого процесса на боевом сервере.
▪️ Еще полезные параметры:
[Service]
MemoryHigh=400M
MemoryMax=500M
CPUWeight=200
IOWeight=200
Тут разница такая:
MemoryHigh - мягкий порог, после которого ядро начинает сильнее давить процесс по памятиMemoryMax - жесткий пределCPUWeight - относительный приоритет по CPU среди других cgroupIOWeight - относительный приоритет по дисковому I/O⚠️ Важно помнить
CPUQuota=50% - это не половина всех ядер, а квота CPU-времени. На многоядерных системах поведение нужно понимать внимательно.
И еще: если сервис уже упирается в лимит памяти, он может начать падать, а не магически оптимизироваться. Лимиты защищают систему, но не исправляют плохое приложение.
#systemd #cgroups
🧑💻 NetworkAdmin