# cgset 当我们将一个子系统附加到一个层次中,我们必须去调节对应子系统的参数才能够达到资源限制的目的。给某个子系统设置参数需要用到cgset命令,但是需要注意一个问题就是,使用cgset的权限。不是哪个用户都可以使用cgset对某一个control group下的子系统设置参数。 先来看下cgset的语法: ``` cgset -r parameter=value path_to_cgroup ``` path_to_cgroup:是一个相对于root cgroup的一个路径。 # cgred cgred(cgrulesengd后台驻留程序启动服务)。 考虑一个场景,如果我要对某个进程做限制,那么如果使用上面提到的方法来对vsftpd进程做限制,那么存在一个问题就是,每次系统重启都需要重新设置,因为进程的PID发生了变化。好在红帽给我们提供了一个cgred的服务,是随着libcgroup的安装而安装的。通过cgred可以自动帮我们去设置。 该设置使用配置文件为/etc/cgrules.conf。 ```bash [yz@localhost ~]$ vim /etc/cgrules.conf # /etc/cgrules.conf #The format of this file is described in cgrules.conf(5) #manual page. # # Example: # #@student cpu,memory usergroup/student/ #peter cpu test1/ #% memory test2/ # End of file ``` 语法说明: * @:当在 user 使用前缀时,代表是一个组群而不是单独用户。例如:@admins 是 admins 组群中的所有用户。 * *:代表“所有”。例如:subsystem 字段中的 * 代表所有子系统。 * %:代表与以上行中项目相同的项目。例如: ``` @adminstaff devices /admingroup @labstaff % % ``` # 实例 假设我们需要把 yz 用户的 postgres 进程加入到 cpu/pg_yz 资源组中。 首先,修改 /etc/cgrules.conf,增加一行: ``` yz:postgres cpu pg_yz/ ``` 然后,重启 cgred 服务(如果没有启动的话,则启动): ```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 了: ```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)是否已经写入到相应资源组下: ```bash [yz@localhost ~]$ cat /sys/fs/cgroup/cpu/pg_yz/tasks 18221 18223 18224 18225 18226 18227 18228 ``` 注意:修改 /etc/cgrules.conf 文件需要重启 cgred 服务。 # 参考 * [Cgroup使用进阶](https://blog.csdn.net/zhangyifei216/article/details/49703361) * [Redhat 7资源管理指南](Redhat 7资源管理指南)