cgroup从入门到懵圈——cgroup使用举例

  • Post author:
  • Post category:其他


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来实现,或者直接将进程终止。



版权声明:本文为huang987246510原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。