Control groups
Control groups(Cgroups)中文称为控制组。Docker利用Cgroups实现了对资源的配额和度量。Cgroups可以限制CPU、内存、磁盘读写速率、网络带宽等系统资源。Linux使用文件系统来实现Cgroups,我们可以直接使用下面的命令查看当前的Cgroups中有哪些子系统:
![](https://i-blog.csdnimg.cn/blog_migrate/61386ac9eb26da689a588f2c8f3ed151.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/005fa56bafaf275da4616397d751ecdf.webp?x-image-process=image/format,png)
以下是每个子系统的说明:
Blkio:这个子系统设置限制每个块设备的输入输出控制。例如:磁盘,光盘以及usb等等。
Cpu:这个子系统使用调度程序为cgroup任务提供cpu的访问。
Cpuacct:产生cgroup任务的cpu资源报告。
Cpuset:如果是多核的cpu,这个子系统会为cgroup任务分配单独的cpu和内存。
Devices:允许或拒绝cgroup任务对设备的访问。
Freezer:暂停和恢复cgroup任务。
Memory:设置每个cgroup的内存限制以及产生内存资源报告。
net_cls:标记每个网络包以供cgroup方便使用。
Cgroup的使用非常简单,如果想要创建一个新的cgroup,只需要在想要分配或者限制资源的子系统下面创建一个新的文件夹,然后cgroup会在这个文件夹下自创建很多内容。当然如果在Linux上安装了Docker,会发现所有子系统的目录下都有一个名为 Docker 的文件夹:
![](https://i-blog.csdnimg.cn/blog_migrate/9f111c0e683f9d905ec2f6be74394815.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/5410c7ed7ea3e88bac8a3961073c65f2.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/ab3461bf48094bd851971e6a79c3c020.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/d3aa901168d3240a02c4987232ba7ac7.webp?x-image-process=image/format,png)
或许你可能发现存在两个文件夹:
![](https://i-blog.csdnimg.cn/blog_migrate/a30c8220aa68208cf09f7a68139c238e.webp?x-image-process=image/format,png)
3498d766e1axxx和7078ee1f4cb79xxx,这两个文件夹名字其实就是我们之前启动的两个容器的ID号。Cgroup是层级结构,父子继承关系,当你打开上述两个文件夹可以看到拥有类似的目录结构。
另外,每个子系统下面都有一个tasks文件,这个文件记录了所有加入这个资源组的进程号。
![](https://i-blog.csdnimg.cn/blog_migrate/bdd87b8088f5250138b79fcb28dfb349.webp?x-image-process=image/format,png)
这些进程号恰巧是PID=2173的docker-containerd-shim进程的所有子进程,这说明和这个容器7078ee1f4cbxx相关的进程都被限制在这个以容器ID为名的子系统中。
![](https://i-blog.csdnimg.cn/blog_migrate/7b043b3a57d9467f9efebe6d7bb7eee4.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/7a3622c80ce3776dbd4f842add7cc50b.webp?x-image-process=image/format,png)