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

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

你可能感兴趣的:(内核)