Docker进阶与实战
上QQ阅读APP看书,第一时间看更新

2.3 Cgroup介绍

2.3.1 Cgroup是什么

Cgroup是control group的简写,属于Linux内核提供的一个特性,用于限制和隔离一组进程对系统资源的使用,也就是做资源QoS,这些资源主要包括CPU、内存、block I/O和网络带宽。Cgroup从2.6.24开始进入内核主线,目前各大发行版都默认打开了Cgroup特性。

从实现的角度来看,Cgroup实现了一个通用的进程分组的框架,而不同资源的具体管理则是由各个Cgroup子系统实现的。截止到内核4.1版本,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配置了较高的系统资源限额。

提示

从1.6版本开始,Docker也支持ulimit,读者可以查阅相关Docker文档及Linux用户手册。