При эксплуатации серверов снижение производительности нередко связано с постепенным ростом потребления ресурсов одним из сервисов. В результате уменьшается объём доступного процессорного времени и памяти для остальных процессов, что отрицательно влияет на стабильность всей системы.
Для управления ресурсами в Linux используется механизм
control groups (cgroups). Он позволяет ядру учитывать и ограничивать потребление CPU, памяти, дискового ввода-вывода и количество задач, включая процессы и потоки.В большинстве современных дистрибутивов по умолчанию используется
cgroups v2. Проверить это можно командой:findmnt -t cgroup2
или:
stat -fc %T /sys/fs/cgroup
Если используется
cgroups v2, в последнем случае будет получен вывод:cgroup2fs
В системах с
systemd процессы сервисов автоматически размещаются в отдельных cgroups, поэтому ограничения ресурсов обычно задаются средствами systemd.Например, ограничить объём памяти для сервиса можно следующим образом:
systemctl set-property nginx.service MemoryMax=1G
После применения параметра
systemd устанавливает соответствующее ограничение для cgroup сервиса. При достижении лимита ядро сначала пытается освободить память, а если это невозможно, OOM-механизм memory cgroup может завершить один или несколько процессов. Следует учитывать, что
MemoryMax ограничивает не только анонимную память приложения, но и учитываемый page cache. Проверить текущие значения можно командой:systemctl show nginx.service -p MemoryCurrent -p MemoryMax
Для анализа текущего потребления ресурсов удобно использовать:
systemd-cgtop
Утилита отображает активные
cgroups, текущее использование CPU и памяти, объём ввода-вывода и количество задач, что позволяет быстро определить сервис, создающий основную нагрузку.Ограничение использования процессора задаётся аналогичным образом:
systemctl set-property worker.service CPUQuota=50%
Значение
CPUQuota=50% соответствует половине времени одного логического процессора, а CPUQuota=200% позволяет использовать до двух логических процессоров. Ограничение распространяется на суммарное использование CPU всеми процессами, входящими в cgroup сервиса.Количество процессов и потоков можно ограничить следующим параметром:
systemctl set-property worker.service TasksMax=200
Это предотвращает неконтролируемое создание задач и снижает риск исчерпания системных ресурсов.
Постоянные ограничения удобно задавать через override-конфигурацию:
systemctl edit worker.service
Например:
[Service]
MemoryMax=2G
CPUQuota=200%
TasksMax=500
После изменения конфигурации сервис необходимо перезапустить:
systemctl restart worker.service
🔥 Механизм
cgroups работает на уровне ядра и применяет ограничения к группе процессов независимо от языка программирования или способа запуска приложения. На основе cgroups v2 реализованы механизмы управления ресурсами в systemd и большинстве современных контейнерных платформ.🚪 Linux Ready | #практика