CPUQuota в Linux средствами systemd


CPUQuota — ограничение потребления CPU средствами системы инициализации systemd, которое удобно использовать на серверах с несколькими пользователями.



CPUQuota — ограничение потребления CPU для пользователя


Часто бывает такое, что процессы одного пользователя потребляют слишком много ресурсов, что сказывается на работе всей машины, нагрузку замечают другие пользователи.


Существует несколько способов ограничить потребление CPU.



Стандартный nice / renice не очень удобен потому, что применяется к выполняющимся процессам, ко всем процессам определенного пользователя применять ограничения таким образом можно, но нужно это дополнительно скриптовать.

То же относится к утилите cpulimit.



Для shell пользователя можно выставить nice и все порождаемые процессы в рамках ssh сессии будут иметь указанный администратором приоритет.

Любые ограничения по процессору на уровне операционной системы задаются через cgroups


cgroups на низком уровне позволяет ограничивать все процессы порождаемые определенной командой.

cgcreate -g cpu:/cpulimited

cgset -r cpu.shares=128 cpulimited

cgexec -g cpu:cpulimited КОМАНДА


limits.conf


Можно лимитировать потребление процессора задавая количество процессорных минут в /etc/security/limits.conf


Можно поставить максимальное количество минут CPU и максимальное количество процессов для пользователя.

1 процессорная минута — это 100% загрузка одного ядра процессора в течение одной минуты.



systemd CPUQuota


Чтобы задать ограничение средствами systemd прежде всего нужно найти id пользователя. Его можно посмотреть в файле /etc/passwd

Например, пользователь user13

cat /etc/passwd | tail -n 1


user13:x:512:512::/var/www/user13/data:/bin/bash



Далее от имени root выполняем

systemctl edit --force user-512.slice


Идентификатор пользователя для передачи systemctl взят из /etc/passwd



В Unit файле задаём CPUQuota

[Slice]
CPUQuota=10%


Со следующим логином пользователя в системе ограничение будет применяться.



На скриншоте показано как можно задать лимит для системного пользователя git:

CPUQuota linux


Смотрите пример практического применения изменения приоритетов для процессов (в данном случае ограничение не по CPU, а по дисковым операциям)

Сказать спасибо