简介

Cgroup:control group,用于限制和隔离一组进程对系统资源的使用。做资源的QoS(quality of service)。资源包括CPU,内存,block I/O,和网络带宽。
Cgroup中的子系统:
device:设备权限控制
cpuset:分配指定的CPU和内存节点
cpu:控制cpu占用率
cpuacct:统计cpu的使用情况
memory:限制内存的使用上限
freezer:冻结Cgroup中的进程
net_cls:配合tc(traffic controller)限制网络带宽
net_prio:设置进程的网络流量优先级
huge_tlb:限制HugeTLB的使用
perf_event:允许Perf工具基于Cgroup分组做性能检测。

在Cgroup出现之前,只能对一个进程做资源控制,(cgroup可以对任意组进程进行资源控制),比如sched_setaffinity的系统调用来限定一个进程的CPU亲和性。或用ulimit来限制进程打开文件上限,栈大小等。

Cgroup的接口与使用

我们可以看一下cgroupfs虚拟文件系统中的内容,我的环境是centos7。
[root@VM_116_112_centos ~]# cd /sys/fs/cgroup/
[root@VM_116_112_centos cgroup]# ls
blkio cpu cpuacct cpu,cpuacct cpuset devices freezer hugetlb memory net_cls perf_event systemd

cgroup目录下的文件就是我们上述所说的子系统,就是由这些子系统对资源进行着限制。

cpuset
  1. [root@VM_116_112_centos cgroup]# cd cpuset/
    [root@VM_116_112_centos cpuset]# ls
    cgroup.clone_children cpuset.cpu_exclusive cpuset.memory_migrate cpuset.memory_spread_slab docker
    cgroup.event_control cpuset.cpus cpuset.memory_pressure cpuset.mems notify_on_release
    cgroup.procs cpuset.mem_exclusive cpuset.memory_pressure_enabled cpuset.sched_load_balance release_agent
    cgroup.sane_behavior cpuset.mem_hardwall cpuset.memory_spread_page cpuset.sched_relax_domain_level tasks
    能够看到里面有非常多的控制文件。

  2. [root@VM_116_112_centos cpuset]# cat cpuset.cpus
    0
    [root@VM_116_112_centos cpuset]# cat cpuset.mems
    0
    这里我们可以看一些文件中的内容,这两个控制文件的内容表示,限制这个cgroup的进程只能在0号cpu上运行,且只会从0号内存节点分配内存。

  3. 这里再关注一个文件tasks
    这里面记录这个cgroup的所有进程(包括线程)。
    [root@VM_116_112_centos cpuset]# cat tasks
    1
    2
    3
    7
    8
    9
    (省略。。。。)

  4. 如何创建一个cgroup,很简单,在cgroup目录下的子系统中创建一个目录
    mkdir /sys/fs/cgroup/cpuset/child/
    这样就创建了一个新的cgroup,你可以cd进去查看目录内容,你会发现目录下自动给你创建了控制文件。
    ls /sys/fs/cgroup/cpuset/child/
    cgroup.clone_children cpuset.cpu_exclusive cpuset.mem_hardwall cpuset.memory_spread_page cpuset.sched_load_balance tasks
    cgroup.event_control cpuset.cpus cpuset.memory_migrate cpuset.memory_spread_slab cpuset.sched_relax_domain_level
    cgroup.procs cpuset.mem_exclusive cpuset.memory_pressure cpuset.mems notify_on_release
    你可以自己设置控制文件中的内容如
    echo 0 > /sys/fs/cgroup/cpuset/child/cpuset.cpus
    echo 0 > /sys/fs/cgroup/cpuset/child/cpuset.mems
    echo $$ > /sys/fs/cgroup/cpuset/child/tasks
    //把当前进程ID写入tasks文件,使能cgroup,就是把当前进程移动到这个cgroup中,并且以后从这个进程派生的子进程也会被移入这个cgroup
    PS:你也可以将pid写入cgroup.procs,区别是tasks只会把指定的进程放入child中,cgroup.procs会把这个进程所属的整个线程组都加到child中。
    [root@VM_116_112_centos child]# echo $$ > tasks
    [root@VM_116_112_centos child]# cat tasks
    11417
    30522
    [root@VM_116_112_centos child]# ps
    PID TTY TIME CMD
    11424 pts/1 00:00:00 ps
    30522 pts/1 00:00:00 bash
    root@VM_116_112_centos child]# ps -aux | grep 30522
    root 11556 0.0 0.0 112664 976 pts/1 R+ 17:32 0:00 grep –color=auto 30522
    root 30522 0.0 0.3 116836 3680 pts/1 Ss 15:47 0:00 -bash

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐