Cgroup Cpuset 子系统
本文是一系列对 cgroup 说明的文档,已期望说明 cgroup 子系统涉及的所有子系统,本文只对 CpusetGroup 进行说明,本文的目录如下
什么是 CpusetGroup ?
CpusetGroup 在运行时中是如何实现的 ?
1 什么是 CpusetGroup ?
cpuset 提供了一套 linux 内核机制,这套机制用于限制在机器上任务或者进程使用的 CPU 和 Mem(内存),至于在 linux 如何通过这些参数来实现 cpuset 机制不在本文说明范围内。
如上图 cpuset 设置 cpu 节点举例来说,假设需要设置了 A,B,C,D 四个 cpuset 请求,且 A 限制在 0-1,B 限制在 2-3,C 限制在 4-5,D 限制在 6-7 节点,此时根目录下 cpuset 限制的节点只有 2-3,4-5,6-7,此时最终的结果 cpu 限制结果会取根目录下和请求的交集,也就是 B,C,D(2,3,4,5,6,7)
以使用为例,使用 linux cpuset 提供的文件系统方式为例
2 CpusetGroup 在运行时中是如何实现的 ?
目前的常见的容器技术 docker 底层其实是 runc 的调用实现,
runc 对资源的限制正是通过 cgroup 来实现的,以容器运行时中 runc 中的设置 cpuset 逻辑为列:
所在目录上一级目录需要存在,不存在复制上一级目录配置内容。
根据 config 配置中的 cpuset.cpus 配置所在目录的 cpuset.cpus 内容,不存在则复制上一级目录配置
根据 config 配置中的 cpuset.mems 配置所在目录的 cpuset.mems 内容,不存在则复制上一级目录配置
写入 cgroup.procs 文件 pid(pid=2458544),写入 pid 时查看文件内容不一致(2458544)。
相应的,查看对应的日志以及文件
这里的 current 指代的是当前 a 这个任务的目录(/sys/fs/cgroup/cpuset/a),一开始未设置 cpu 和 mem,这里继承了上一级目录(/sys/fs/cgroup/cpuset)的配置,并将任务 id 写入到(/sys/fs/cgroup/cpuset/a/cgroup.procs )和第 1 小节以 shell 的形式写入文件系统类似,由此可以看到,最底层针对 cgroup v1,runc 实现的运行时对 cpuset 也是以这种方式来对任务使用的 cpu 和 mem 进行限制的,最终影响到任务使用的 cpu 节点和 mem 节点
参考文献
https://techpubs.jurassic.nl/manuals/0650/admin/IA_Resource/sgi_html/figures/move_cpuset.gif
https://www.kernel.org/doc/Documentation/cgroup-v1/cpusets.txt
https://www.slideshare.net/Docker/container-performance-analysis-brendan-gregg-netflix
版权声明: 本文为 InfoQ 作者【总想做点什么】的原创文章。
原文链接:【http://xie.infoq.cn/article/775d391c5e15d852dc485dcad】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论