在 CentOS7/systemd 下使用 cgroups 按进程名限制 CPU 和 I/O

在 CentOS7/systemd 下使用 cgroups 按进程名限制 CPU 和 I/O

我当前/sbin/cgrulesengd在 CentOS 6 上使用 cgroups(通过 )来限制进程名称为zipunzip和的进程的 CPU 使用率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服务或您控制启动的流程。

但是,在我的设置中,用户通过各种方式运行上述二进制文件(有些是通过他们正在使用的其他工具间接运行的),我特别想限制以这种方式运行的二进制文件(即礼貌地要求用户修改他们正在运行的命令不是一个解决方案)。

如何才能做到这一点?

答案1

我认为为此您需要编写一个服务来持续监视新的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

答案2

systemd 实现(至少在 Ubuntu 领域)尚不成熟。(换句话说,忽略已弃用的东西并继续执行您在 CentOS 6 中所做的事情)

相关内容