- 控制组(CGroups)是Linux内核的一个特性,主要用来对共享资源进行隔离、限制、审计等。只有将分配到容器的资源进行控制,才能避免多个容器同时运行时对宿主机系统的资源竞争。每个控制组是一组对资源的限制,支持层级化结构。
- 控制组提供如下功能:
- 资源限制(resource limiting):可将组设置一定的内存限制。比如:内存子系统可以为进程组设定一个内存使用上限,一旦进程组使用的内存达到限额再申请内存,就会出发Out of Memory警告。
- 优先级(prioritization):通过优先级让一些组优先得到更多的CPU等资源。
- 资源审计(accounting):用来统计系统实际上把多少资源用到适合的目的上,可以使用cpuacct子系统记录某个进程组使用的CPU时间。
- 隔离(isolation):为组隔离命名空间,这样使得一个组不会看到另一个组的进程、网络连接和文件系统。
- 控制(control):执行挂起、恢复和重启动等操作。
- 分析:
- 运行容器,对cpu资源进行限制

- 查看容器的 ID:

- 在 /sys/fs/cgroup/cpu/docker 目录中,Linux 会为每个容器创建一个 cgroup 目录,以容器长ID 命名:

- 目录中包含所有与 cpu 相关的 cgroup 配置,文件 cpu.shares 保存的就是 —cpu-shares 的配置,值为 512。
- 同样的,/sys/fs/cgroup/memory/docker 和 /sys/fs/cgroup/blkio/docker 中保存的是内存以及 Block IO 的 cgroup 配置。
- 原理
- Linux Cgroups ,它就是一个子系统目录加上一组资源限制文件的组合。而对于 Docker 等 Linux 容器项目来说,它们只需要在每个子系统下面,为每个容器创建一个控制组(即创建一个新目录),然后在启动容器进程之后,把这个进程的 PID 填写到对应控制组的 tasks 文件中就可以了。
- 至于在这些控制组下面的资源文件里填上什么值,就靠用户执行 docker run 时的参数指定了,
- 比如这样一条命令:$ docker run -it —cpu-period=100000 —cpu-quota=20000 ubuntu /bin/bash在启动这个容器后,我们可以通过查看 Cgroups 文件系统下,CPU 子系统中,“docker”这个控制组里的资源限制文件的内容来确认:
$ cat /sys/fs/cgroup/cpu/docker/5d5c9f67d/cpu.cfs_period_us 100000
$ cat /sys/fs/cgroup/cpu/docker/5d5c9f67d/cpu.cfs_quota_us 20000
这就意味着这个 Docker 容器,只能使用到 20% 的 CPU 带宽。
