写点什么

Cgroup Cpuset 子系统

  • 2022 年 7 月 08 日
  • 本文字数:1379 字

    阅读完需:约 5 分钟

Cgroup Cpuset子系统

本文是一系列对 cgroup 说明的文档,已期望说明 cgroup 子系统涉及的所有子系统,本文只对 CpusetGroup 进行说明,本文的目录如下


  1. 什么是 CpusetGroup ?

  2. 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 提供的文件系统方式为例


$ cd /sys/fs/cgroup/cpuset$ mkdir test$ cd test$ lscgroup.clone_children  cpuset.memory_pressurecgroup.event_control   cpuset.memory_spread_pagecgroup.procs           cpuset.memory_spread_slabcpuset.cpu_exclusive   cpuset.memscpuset.cpus            cpuset.sched_load_balancecpuset.mem_exclusive   cpuset.sched_relax_domain_levelcpuset.mem_hardwall    notify_on_releasecpuset.memory_migrate  tasks## 限制cpu使用节点$ /bin/echo 2-3 > cpuset.cpus## 限制mem使用节点$ /bin/echo 1 > cpuset.mems## 需要限制的进程$ /bin/echo $$ > tasks
复制代码

2 CpusetGroup 在运行时中是如何实现的 ?

目前的常见的容器技术 docker 底层其实是 runc 的调用实现,



runc 对资源的限制正是通过 cgroup 来实现的,以容器运行时中 runc 中的设置 cpuset 逻辑为列:


  1. 所在目录上一级目录需要存在,不存在复制上一级目录配置内容。

  2. 根据 config 配置中的 cpuset.cpus 配置所在目录的 cpuset.cpus 内容,不存在则复制上一级目录配置

  3. 根据 config 配置中的 cpuset.mems 配置所在目录的 cpuset.mems 内容,不存在则复制上一级目录配置

  4. 写入 cgroup.procs 文件 pid(pid=2458544),写入 pid 时查看文件内容不一致(2458544)。


相应的,查看对应的日志以及文件


[debug] current=/sys/fs/cgroup/cpuset/a, currentCpus=, currentMems=[debug] parent=/sys/fs/cgroup/cpuset, parentCpus=0-79, parentMems=0-1[debug] write cgroup proc, dir=/sys/fs/cgroup/cpuset/a, CgroupProcesses=cgroup.procs, pid=2458544
[node test]# cat /sys/fs/cgroup/cpuset/a/cgroup.procs 2458547[node test]# cat /sys/fs/cgroup/cpuset/a/cpuset.mems0-1[node test]# cat /sys/fs/cgroup/cpuset/a/cpuset.cpus0-79
复制代码


这里的 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

发布于: 刚刚阅读数: 4
用户头像

自顶向下 2020.11.01 加入

还未添加个人简介

评论

发布
暂无评论
Cgroup Cpuset子系统_总想做点什么_InfoQ写作社区