前戏
control groups简称cgroups,是Linux内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:cpu,memory,IO等等)的机制。最初由google的工程师提出,后来被整合进Linux内核。Cgroups也是LXC为实现虚拟化所使用的资源管理手段,可以说没有cgroups就没有LXC。
从 2.6.24 版本开始,linux 内核提供了一个叫做 cgroups(控制组)的特性。cgroups 就是 control groups 的缩写,用来对一组进程所占用的资源做限制、统计、隔离。也是目前轻量级虚拟化技术 lxc (linux container)的基础之一。每一组进程就是一个控制组,也就是一个 cgroup。cgroups 分为几个子系统,每个子系统代表一种设施或者说是资源控制器,用来调度某一类资源的使用,如 cpu 时钟、内存、块设备 等。
用途
在容器中,如果不对其做任何资源限制,则宿主机允许其占用无限大的内存空间,有时候会因为代码bug程序会一直申请内存,直到把宿主机内存占完,为了避免此类问题出现,宿主机有必要对容器进行资源限制,比如CPU,内存等,主要的作用就是限制和管理资源上限。此外,还可以进程行优先设置,以及将进程挂起和恢复等操作。
验证系统Cgroups
Cgroups在内核层默认开启,从 centos 和 ubuntu 对比来结果来看,显然内核较新的 ubuntu 支持的功能更多
Cgroups中的内存模块
Cgroups具体实现
blkio |
块设备IO限制 |
cpu |
使用调度程序为 cgroup 任务提供 cpu 的访问 |
cpuacct |
生产 cgroup 任务的 cpu 资源 |
cpuset |
如果是多核心的 cpu, 这个是子系统会为 cgroup 任务分配单独的 cpu 和内存 |
devices |
允许或者拒绝 cgroup 中的任务访问设备 |
freezer |
挂起或者恢复 cgroup 中的任务 |
memory |
设置每个 cgroup 的内存限制以及生产内存的资源报告 |
net_cls |
标记每个网络包以供 cgroup 方便使用 |
ns |
命名空间子系统 |
perf_event |
增加了对每个 cgroup 的检测跟踪的能力,可以监测属于某个特定的 cgroup 的所有线程以及运行在特定 CPU 上的线程 |