Назад | Перейти на главную страницу

Использование cgroups для ограничения ЦП и ввода-вывода по имени процесса в CentOS7 / systemd

В настоящее время я использую cgroups (через /sbin/cgrulesengd) в CentOS 6, чтобы ограничить использование ЦП для процессов с именами процессов zip, unzip и gpg.

Я добиваюсь этого через это в /etc/cgconfig.conf определить некоторые контрольные группы ...

group limitcpu {
        cpu {
                cpu.shares=256;
        }
}

group limitio {
        blkio {
                blkio.throttle.read_bps_device = "9:1         5292880";
                blkio.throttle.write_bps_device = "9:1        5292880";
        }
}

... и это в /etc/cgrules.conf чтобы затем поместить процессы в эти группы:

*:zip           cpu,blkio       limitio/,limitcpu/
*:unzip         cpu,blkio       limitio/,limitcpu/
*:gpg           cpu,blkio       limitio/,limitcpu/

Теперь я хочу воспроизвести ту же настройку на CentOS 7. В документации CentOS 7 говорится, что этот способ работы устарел (https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/resource_management_guide/chap-using_libcgroup_tools). В CentOS 7 кажется, что вам следует использовать средства из systemd (https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/resource_management_guide/chap-using_control_groups).

Моя проблема в том, что документация (и другие ресурсы в Google) не объясняют, как достичь моей цели. В основном они концентрируются на ограничении systemd Сервисы или процессы, запуск которых вы контролируете.

Однако в моих настройках пользователи запускают упомянутые двоичные файлы различными способами (некоторые косвенно через другие инструменты, которые они используют), и я специально хочу ограничить запуск двоичных файлов таким образом (т.е. вежливо просить пользователей изменить команды, которые они запускают, это не решение).

Как это может быть сделано?

Я думаю, для этого вам нужно написать сервис, который будет следить за новыми zip/unzip/gpg процессов и перемещает их в выделенный фрагмент (или область действия), как только они появляются (запишите их PID, например, в. /sys/fs/cgroup/limitZUG.slice/cgroup.procs, предполагая cgroups v2). Кажется, в основном это то, что cgrulesengd действительно в вашей текущей настройке (хотя я с ней не знаком), за исключением того, что cgroup, в которую она перемещает процессы, будет настроена systemd как модуль среза (или модуль области видимости, динамически создаваемый службой).

(Я также думал о переопределении zip/unzip/gpg в обертки вокруг systemd-run -p CPUShares=256 … /usr/bin/… через скрипты в /usr/local/bin/, но это означает, что вам нужно дать непривилегированным пользователям возможность создавать новые системные службы с systemd-run, потому что управление ресурсами, похоже, недоступно в пользовательских единицах: я думаю, что у менеджера пользователей нет разрешения на его настройку.)

Реализация systemd (по крайней мере, в мире Ubuntu) еще не созрела. (Другими словами, игнорируйте устаревшую вещь и продолжайте делать то, что вы делали в CentOS 6)