我当前/sbin/cgrulesengd
在 CentOS 6 上使用 cgroups(通过 )来限制进程名称为zip
、unzip
和的进程的 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 中所做的事情)