Cgroup
# Cgroup是什么
# 1、Cgroup介绍
Cgroup是control group的简写,属于Linux内核提供的一个特性,用于限制和隔离一组进程对系统资源的使用,也就是做资源QoS,这些资源主要包括CPU、内存、block I/O和网络带宽。
Cgroup从2.6.24开始进入内核主线,目前各大发行版都默认打开了Cgroup特性。
Cgroup实现了一个通用的进程分组的框架,而不同资源的具体管理则是由各个Cgroup子系统实现的,其中各个子系统及其作用如下:
- devices:设备权限控制
- cpuset:分配指定的CPU和内存结点
- cpu:控制CPU占有率
- cpuacct:统计CPU使用情况
- memory:限制内存的使用上线
- freezer:冻结(暂停)Cgroup中的进程
- net_cls:配合tc(traffic controller)限制网络带宽
- net_prio:设置进程的网络流量优先级
- huge_tlb:限制HugeTLB的使用
- perf_event:允许Perf工具基于Cgroup分组做性能监测
在Cgroup出现之前,只能对一个进程做一些资源控制,例如通过sched_setaffinity系统调用限定一个进程的CPU亲和性,或者用ulimit限制一个进程的打开文件上限、栈大小等。另外,使用ulimit可以对少数资源基于用户做资源控制,例如限制一个用户能创建的进程数。而Cgroup可以对进程进行任意的分组,如何分组是用户自定义的,例如安卓的应用分为前台应用和后台应用,前台应用是直接跟用户交互的,需要响应速度快,因此前台应用对资源的申请需要得到更多的保证。为此安卓将前台应用和后台应用划分到不同的Cgroup中,并且对放置前台应用的Cgroup配置了较高的系统资源限额。
# 2、Cgroup的接口和使用
Cgroup的原生接口通过cgroupfs提供,类似于procfs和sysfs,是一种虚拟文件系统。以下用一个实例演示如何使用Cgroup
1、挂载cgroupfs
# mount –t cgroup –o cpuset cpuset /sys/fs/cgroup/cpuset
首先必须将cgroupfs挂载起来,这个动作一般已经在启动时由Linux发行版做好了。可以把cgroupfs挂载在任意一个目录上,不过标准的挂载点是/sys/fs/cgroup
2、查看cgroupfs
# ls /sys/fs/cgroup/cpuset cgroup.clone_children cpuset.memory_pressure cgroup.procs
cpuset.memory_pressure_enabled cgroup.sane_behavior
cpuset.memory_spread_page cpuset.cpu_exclusive
cpuset.memory_spread_slab cpuset.cpus
cpuset.mems cpuset.effective_cpus
cpuset.sched_load_balance cpuset.effective_mems
cpuset.sched_relax_domain_level
cpuset.mem_exclusive notify_on_release
cpuset.mem_hardwall release_agent
cpuset.memory_migrate tasks
2
3
4
5
6
7
8
9
10
可以看到这里有很多控制文件,其中以cpuset开头的控制文件都是cpuset子系统产生的,其他文件则由Cgroup产生。这里面的tasks文件记录了这个Cgroup的所有进程(包括线程),在系统启动后,默认没有对Cgroup做任何配置的情况下,cgroupfs只有一个根目录,并且系统所有的进程都在这个根目录中,即进程pid都在根目录的tasks文件中
3、创建Cgroup
# mkdir /sys/fs/cgroup/cpuset/child
通过mkdir创建一个新的目录,也就创建了一个新的Cgroup。
4、配置Cgroup
# echo 0 > /sys/fs/cgroup/cpuset/child/cpuset.cpus
# echo 0 > /sys/fs/cgroup/cpsuet/child/cpuset.mems
2
接下来配置这个Cgroup的资源配额,通过上面的命令,就可以限制这个Cgroup的进程只能在0号CPU上运行,并且只会从0号内存节点分配内存。
5、使用Cgroup
# echo $$ > /sys/fs/cgroup/cpuset/child/tasks
最后,通过将进程id写入tasks文件,就可以把进程移动到这个Cgroup中。并且,这个进程产生的所有子进程也都会自动放在这个Cgroup里。这时,Cgroup才真正起作用了。
# 3、Cgroup子系统介绍
最后,通过将进程id写入tasks文件,就可以把进程移动到这个Cgroup中。并且,这个进程产生的所有子进程也都会自动放在这个Cgroup里。这时,Cgroup才真正起作用了。