Docker原理之Cgroups
Cgroup简介
CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组 (process groups) 所使用的物理资源 (如 cpu memory i/o 等等) 的机制。2007 年进入 Linux 2.6.24 内核,CGroups 不是全新创造的,它将进程管理从 cpuset 中剥离出来,作者是 Google 的 Paul Menage。CGroups 也是 LXC 为实现虚拟化所使用的资源管理手段。
Cgroup架构
CGroup 技术可以被用来在操作系统底层限制物理资源,起到 Container 的作用。图中每一个 JVM 进程对应一个 Container Cgroup 层级,通过 CGroup 提供的各类子系统,可以对每一个 JVM 进程对应的线程级别进行物理限制,这些限制包括 CPU、内存等等许多种类的资源。
Cgroup子系统解释
子系统 | 描述 |
blkio | 这个子系统为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB 等等) |
cpu | 这个子系统使用调度程序提供对 CPU 的 cgroup 任务访问 |
cpuacct | 这个子系统自动生成 cgroup 中任务所使用的 CPU 报告 |
cpuset | 这个子系统为 cgroup 中的任务分配独立 CPU(在多核系统)和内存节点 |
devices | 这个子系统可允许或者拒绝 cgroup 中的任务访问设备 |
freezer | 这个子系统挂起或者恢复 cgroup 中的任务 |
memory | 这个子系统设定 cgroup 中任务使用的内存限制,并自动生成由那些任务使用的内存资源报告 |
net_cls | 这个子系统使用等级识别符(classid)标记网络数据包,可允许 Linux 流量控制程序(tc)识别从具体 cgroup 中生成的数据包 |
Cgroups限制测试
- /sys/fs/cgroup下面都称为子系统,目录下包含了限制的资源种类,CentOS7
- cfs_period 和 cfs_quota的关键字,主要是对cpu的限制,功能是限制进程在长度为 cfs_period 的一段时间内,只能被分配到总量为 cfs_quota 的 CPU 时间。
- 验证cpu限制
- 进入到cpu目录创建一个自己的容器 busket,系统会默认创建被限制的子系统
-
- 当前目录默认cpu使用时间
# 默认cpu使用时间(us) ## 结果:100ms cat cpu.cfs_period_us 100000 # 分配的时间 ## -1 表示不限制 cat cpu.cfs_quota_us -1
-
- 执行死循环,验证不限制的情况是否占满cpu
# 执行死循环 ## 返回pid while : ; do : ; done & [2] 25013
由于我执行了两次死循环,所以看到有两个PID,都把cpu占满了。由于我的虚拟机是分了3cpus,所以top的整个cups占用达到了70.7%,我执行一个的时候占用大概是36%左右。杀掉两个进程后,Cpu(s) 降为正常,小于10%。
-
- 更改cpu.cfs_quota_us的值为25000(us), 即单位时间内,即每100毫秒内占用25毫秒的时间,即执行死循环的话,单cpu占用率无限接近25%。验证一下:
- vi是无权限的,用echo进行修改。
- 更改cpu.cfs_quota_us的值为25000(us), 即单位时间内,即每100毫秒内占用25毫秒的时间,即执行死循环的话,单cpu占用率无限接近25%。验证一下:
## 更改cpu.cfs_quota_us为25000us echo 25000 > cpu.cfs_quota_us
-
-
- 执行死循环
-
# 执行死循环 ## 返回pid while : ; do : ; done & [1] 4853
-
-
- top
-
-
-
- 把当前跑满cpu的进程ID写入限制进程的tasks子系统中。
-
# 把刚才死循环进程id写入tasks子系统 echo 4853 > tasks
-
-
- 验证单cpu是否无限接近25%
-
可以看出,cgroup就是通过这种方式将控制组的资源使用进行限制。
docker限制
同理,docker也是通过cgroup进行限制的,可以看到我的子系统下面每个都有docker目录。
可以看到cpu目录下有刚才创建的busket,也有docker,还有我安装的k8s的kubepods, 进入docker后里面又有很多容器ID,进入容器ID后也是一系列子系统文件。所以,docker就是基于namespace隔离出来并且通过cgroup做内核资源限制的虚拟化容器,本质是进程。
参考
https://time.geekbang.org/column/article/14653
https://blog.csdn.net/lbyyy/article/details/54342541