Docker之Cgroup与接口的使用(一)

来源:互联网 发布:餐饮软件2017排名 编辑:程序博客网 时间:2024/06/09 13:44

http://blog.csdn.net/u013246898/article/details/53020308

简介

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 

    [root@VM_116_112_centos cpuset]# cat cpuset.mems 

    这里我们可以看一些文件中的内容,这两个控制文件的内容表示,限制这个cgroup的进程只能在0号cpu上运行,且只会从0号内存节点分配内存。

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






    (省略。。。。)

  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