1 基本用法
通过cgroup虚拟文件系统可以创建,修改,使用cgroup。
挂载一个关联所有子系统的cgroup 层级树可以使用以下命令:
mount -t cgroup xxx /sys/fs/cgroup
xxx不会被cgroup的代码处理,但是会呈现到/proc/mounts或者mount命令输出中。
注意:有些子系统在用户配置之前不会生效。比如cpusets子系统,它必须在cpus和mems两个文件被配置后才能生效,所以设置的时候,一定要先配置cpuset.cpus和cpuset.mems两个文件后再将目标进程ID写入tasks文件。
cgroup建议对于不同的资源使用不同的层级树控制,对于用户想限制的资源,也建议使用独立的层级树进行控制。因此,通常的做法是将/sys/fs/cgroup挂载为tmpfs文件系统,在其下的每个目录,依次挂载独立的cgroup层级树关联不同类型的资源。比如:
mount -t tmpfs cgroup_root /sys/fs/cgroup
mkdir /sys/fs/cgroup/rg1
挂载cpuset和memory子系统:
mount -t cgroup -o cpuset,memory hier1 /sys/fs/cgroup/rg1
cgroup文件系统可以支持重复挂载,比如在挂载了cpuset,memory之后:
mount -t cgroup -o blkio hier1 /sys/fs/cgroup/rg1
cgroup重复挂载需要改变子系统,完全一样的子系统不允许重复挂载。
通过下面的语法可以在挂载时指定release_agent:
mount -t cgroup -o cpuset,release_agent="/sbin/cpuset_release_agent" xxx /sys/fs/cgroup/rg1
挂载命令多次指定release_agent会报错。
在/sys/fs/cgroup/cg1目录下,可以找目录树对应这个系统的cgroup。比如,/sys/fs/cgroup/rg1就是整个系统的cgroup。
如果想要修改release_agent的内容,通过如下命令进行:
echo "/sbin/new_release_agent" > /sys/fs/cgroup/rg1/release_agent
通过重新挂载cgroup,设置release_agent也可以达到目录
在/sys/fs/cgroup/rg1下面创建新的cgroup:
cd /sys/fs/cgroup/rg1
mkdir my_cgroup
设置cgroup
cd my_cgroup
echo $$ > tasks
进一步的,可以在这个目录下创建新的子cgroup。
mkdir my_sub_cs
删除cgroup,通过rmdir命令实现
如果cgroup处在运行状态,删除操作会报错,只有当tasks中包含的进程生命结束,对应的cgroup才能删除。
2 添加任务进程到cgroup
echo PID > tasks
注意是PID不是PIDs。一次只能添加一个任务进程ID。如果有多个任务ID,分多次添加。
把当前shell的进程ID添加到cgroup:
echo 0 > tasks
将TGID或者线程组中包含的任意线程ID添加到cgroup.procs中,可以实现将线程组所有线程添加到cgroup。往cgroup.procs文件中写0表示将写入进程所在进程组所有进程都添加到cgroup中。
注意:cgroup各个子系统初始化时,默认把系统中所有进程都纳管了。将一个进程的PID添加到新建的cgroup tasks文件的操作,实际是从一个cgroup移入另一个cgroup的操作。所以要将进程从某个cgroup中删除,只能通过将其移出到另一个cgroup来实现,或者直接将进程终止。