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
-
[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
能够看到里面有非常多的控制文件。 -
[root@VM_116_112_centos cpuset]# cat cpuset.cpus
0
[root@VM_116_112_centos cpuset]# cat cpuset.mems
0
这里我们可以看一些文件中的内容,这两个控制文件的内容表示,限制这个cgroup的进程只能在0号cpu上运行,且只会从0号内存节点分配内存。 -
这里再关注一个文件tasks。
这里面记录这个cgroup的所有进程(包括线程)。
[root@VM_116_112_centos cpuset]# cat tasks
1
2
3
7
8
9
(省略。。。。) -
如何创建一个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