Docker 核心原理 cgroup
1. Cgroup
Docker 通过 cgroup 来控制容器使用的 资源配额,包括 CPU、内存、 磁盘等三个大的方面,基本覆盖了常见的资源配额和使用量的控制。
Cgroup( controller group),是Linux内核中提供的一种可以限制、记录、隔离进程组所使用的物理资源,例如CPU、Memory、磁盘IO等等)的机制,被LXC、Docker 等多种项目用于实现进程资源控制。
Cgroup 简单的来理解,就是可以将cpu、内存、磁盘I/O进行资源分配,限制使用的 大小、以及频率
2. Cgroup 功能实现
1) 资源限制: 对进程组使用的资源总额进行限制
- Memory 子系统可以为进程组设定一个 Memory 使用上限,一旦进程组使用的内存达到限定的额度再次申请内存。
2) 优先级分配: 通过使用权重值分配CPU 的时间和硬盘的I/O大小
- 可以使用CPU子系统为某个进程组分配特定 CPU share(优先级)
3) 资源统计: 记录容器对硬件的使用,时间用量等等
- 可以使用cpuacct 子系统记录某个进程组使用的 cpu 时间等等
4) 进程控制: 对进程挂起、恢复等操作
- 使用freezer 子系统可以将进程组挂起和恢复
5) 进程组隔离: 使不同的进程组使用不同的Namespace ,打到隔离的目的
-
不同的进程组有各自的进程、网络、文件系统挂载空间。
-
查看cgroup 挂载的子系统
[root@localhost ~]# ll /sys/fs/cgroup/
total 0
drwxr-xr-x. 5 root root 0 Mar 25 04:59 blkio
lrwxrwxrwx. 1 root root 11 Mar 25 04:59 cpu -> cpu,cpuacct
lrwxrwxrwx. 1 root root 11 Mar 25 04:59 cpuacct -> cpu,cpuacct
drwxr-xr-x. 5 root root 0 Mar 25 04:59 cpu,cpuacct
drwxr-xr-x. 3 root root 0 Mar 25 04:59 cpuset
drwxr-xr-x. 5 root root 0 Mar 25 04:59 devices
drwxr-xr-x. 3 root root 0 Mar 25 04:59 freezer
drwxr-xr-x. 3 root root 0 Mar 25 04:59 hugetlb
drwxr-xr-x. 5 root root 0 Mar 25 04:59 memory
lrwxrwxrwx. 1 root root 16 Mar 25 04:59 net_cls -> net_cls,net_prio
drwxr-xr-x. 3 root root 0 Mar 25 04:59 net_cls,net_prio
lrwxrwxrwx. 1 root root 16 Mar 25 04:59 net_prio -> net_cls,net_prio
drwxr-xr-x. 3 root root 0 Mar 25 04:59 perf_event
drwxr-xr-x. 5 root root 0 Mar 25 04:59 pids
drwxr-xr-x. 5 root root 0 Mar 25 04:59 systemd
3. Cgroup 子系统
Cgroup 将任意进程进行分组化管理的linux内核功能,cgroup 本身就是提供将进程进行分组化管理的功能和接口的基础结构,I/O或内存的分配控制等具体的资源管理功能是通过这个功能来实现的,这些具体的资源管理功能被称为一个Cgroup子系统。
blkio – 设置限制每个块设备(磁盘、U盘)的输入输出的控制。
CPU – 使用调度程序为Cgroup任务提供CPU 的访问
Cpuacct – 产生Cgroup 任务的CPU资源报告
cpuset – 如果,是多核心的CPU,这个子系统会为cgroup 任务分配单独的CPU和内存
devices – 允许 或拒绝 cgroup 任务对设备的访问
freezer – 暂停和恢复cgroup 的内存限制以及产生内存资源报告
memory – 设置每个Cgroup的内存限制以及生产内存资源的报告
net_cls – 标记了每个网络包,供cgroup 方便使用
ns – 命名空间子系统
perf_event – 增加了对每个 group 的检测跟踪能力,可以检测属于某个特定的group的所有线程以及运行在特定CPU上的 线程
4. 相关概念
- task(任务):在Cgroup是一个要控制的系统进程
- cgroup(控制族群): 控制组群就是按照某一种标准划分的进程。Cgroups 中的资源控制都是以控制族群为单位实现,可以有多个 cgroup 组,可以限制不同的 内容,组名不能相同
- subsystem(子系统): 子系统限制具体的内容,cgroup 组中的具体事项, 子系统就是资源控制器
- hierarchy(层级): 层级树,由一堆cgroup 构成,包含了多个 cgroup的叫层级树, 用于控制cgroup
查看cgroup 支持的所有的子系统
lssubsys -a cgroup
cpuset // 给task 分配独立的CPU
cpu,cpuacct // cpu(控制程序对CPU使用), cpuacct(生成CPU使用情况报告)
memory // 内存使用量进行限制,并且生成报告
devices // 开启关闭设备的访问,不仅仅是块设备
freezer //