cgset

当我们将一个子系统附加到一个层次中,我们必须去调节对应子系统的参数才能够达到资源限制的目的。给某个子系统设置参数需要用到cgset命令,但是需要注意一个问题就是,使用cgset的权限。不是哪个用户都可以使用cgset对某一个control group下的子系统设置参数。

先来看下cgset的语法:

cgset -r parameter=value path_to_cgroup

pathtocgroup:是一个相对于root cgroup的一个路径。

cgred

cgred(cgrulesengd后台驻留程序启动服务)。

考虑一个场景,如果我要对某个进程做限制,那么如果使用上面提到的方法来对vsftpd进程做限制,那么存在一个问题就是,每次系统重启都需要重新设置,因为进程的PID发生了变化。好在红帽给我们提供了一个cgred的服务,是随着libcgroup的安装而安装的。通过cgred可以自动帮我们去设置。

该设置使用配置文件为/etc/cgrules.conf。

snippet.bash
[yz@localhost ~]$ vim /etc/cgrules.conf
# /etc/cgrules.conf
#The format of this file is described in cgrules.conf(5)
#manual page.
#
# Example:
#<user>         <controllers>   <destination>
#@student       cpu,memory      usergroup/student/
#peter          cpu             test1/
#%              memory          test2/
# End of file

语法说明:

@adminstaff     devices   /admingroup
@labstaff       %         %

实例

假设我们需要把 yz 用户的 postgres 进程加入到 cpu/pg_yz 资源组中。

首先,修改 /etc/cgrules.conf,增加一行:

yz:postgres          cpu             pg_yz/

然后,重启 cgred 服务(如果没有启动的话,则启动):

snippet.bash
[yz@localhost ~]$ sudo systemctl start cgred.service
[yz@localhost ~]$ sudo systemctl status cgred.service
● cgred.service - CGroups Rules Engine Daemon
   Loaded: loaded (/usr/lib/systemd/system/cgred.service; disabled; vendor preset: disabled)
   Active: active (running) since 2020-12-09 10:35:29 CST; 5s ago
  Process: 18178 ExecStart=/usr/sbin/cgrulesengd $OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 18181 (cgrulesengd)
    Tasks: 1
   CGroup: /system.slice/cgred.service
           └─18181 /usr/sbin/cgrulesengd -s -g cgred
……

现在,可以启动 postgres 了:

snippet.bash
[yz@localhost ~]$ pg_ctl -D /home/yz/pg_data/ -l ~/logfile start
waiting for server to start.... done
server started
[yz@localhost ~]$ ps ux | grep postgres
yz       18221  0.0  0.1 275748 13360 ?        Ss   10:37   0:00 /home/yz/pg_bin/bin/postgres -D /home/yz/pg_data
yz       18223  0.0  0.0 275864  2660 ?        Ss   10:37   0:00 postgres: checkpointer
yz       18224  0.0  0.0 275880  2380 ?        Ss   10:37   0:00 postgres: background writer
yz       18225  0.0  0.0 275748  5288 ?        Ss   10:37   0:00 postgres: walwriter
yz       18226  0.0  0.0 276432  2312 ?        Ss   10:37   0:00 postgres: autovacuum launcher
yz       18227  0.0  0.0 130520  1208 ?        Ss   10:37   0:00 postgres: stats collector
yz       18228  0.0  0.0 276304  1848 ?        Ss   10:37   0:00 postgres: logical replication launcher

确认一下上述进程PID(18221、18223~18228)是否已经写入到相应资源组下:

snippet.bash
[yz@localhost ~]$ cat /sys/fs/cgroup/cpu/pg_yz/tasks
18221
18223
18224
18225
18226
18227
18228

注意:修改 /etc/cgrules.conf 文件需要重启 cgred 服务。

参考