Cgroups 制造约束
Linux Cgroups 的全称是 Linux Control Group。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。
Cgroups 给用户暴露出来的操作接口是文件系统,即它以文件和目录的方式组织 在操作系统的 /sys/fs/cgroup 路径下。在系统中执行mount -t cgroup
可以看到如下结果:
可以看到,在 /sys/fs/cgroup 下面有很多诸如 cpuset、cpu、 memory 这样的子目录,也叫 子系统。这些都是我这台机器当前可以被 Cgroups 进行限制的资源种类。
进入每个目录下,可以看到每种资源具体可以被限制的方法,如CPU资源:
cgroup限制使用方法:
在对应的子系统下面创建一个目录,比如,我们现在进入 /sys/fs/cgroup/cpu 目录下,创建目录mazi
,这样实现了创建了一个控制组mazi
,操作系统会自动在目录下生成一些关于CPU限制的资源限制文件。
可以编辑其中的tasks文件指定资源隔离进程号,相关的资源限制就会对该进程生效。
除 CPU 子系统外,Cgroups 的每一项子系统都有其独有的资源限制能力,比如:
- blkio,为块设备设定I/O限制,一般用于磁盘等设备;
- cpuset,为进程分配单独的 CPU 核和对应的内存节点;
- memory,为进程设定内存使用的限制。
总结:
对于 容器项目来说,它们只需要在每个子系统下面,为每个容器创建一个控制组(即创建一个新目录),然后在启动容器进程之后,把这个进程的 PID 填写到对应控制组的 tasks 文件中就可以了。
容器的本质是一种特殊的进程。
注: Mount Namespace 跟其他 Namespace 的使用略有不同的地方:它对容器进程视图的改变,一定是伴随着挂载操作(mount)才能生效。
对 Docker 项目来说,它最核心的原理实际上就是为待创建的用户进程:
-
启用 Linux Namespace 配置;
-
设置指定的 Cgroups 参数;
-
切换进程的根目录(Change Root)。(使用pivot_root或者chroot)
pivot_root和chroot的主要区别是: pivot_root主要是把整个系统切换到一个新的root目录,而移除对之前root文件系统的依赖,这样你就能够umount原先的root文件系统。而chroot是针对某个进程,而系统的其它部分依旧运行于老的root目录。