写点什么

cgroup 简介

  • 2022 年 7 月 03 日
  • 本文字数:1111 字

    阅读完需:约 4 分钟

cgroup简介

本文对 linux 提供的 cgroup 能力,已期望说明以下内容:


  1. 什么是 cgroups ?

  2. 为什么需要 cgroups ?

  3. cgroups 是怎么实现的?

  4. 如何使用 cgroups ?

1 什么是 cgroups ?

CGroups 提供了一套管理进程(子进程)资源控制机制。


定义了以下专业术语:cgroup:使用一个或多个 subsystems 的参数集合来控制一组任务集合。subsystem:subsystem 是内核提供的管理特定资源的资源控制器。hierarchy:hierarchy 是一个逻辑概念,cgroup 按照 subsystem 进行分类,形成一系列 cgroups,并以 tree 的结构组织,hierarchy 这里指的是类似 tree 层级。每个 hierarchy 层级可以映射到操作系统中的虚拟文件系统,每个 subsystem 映射到一颗 cgroup tree。


用户态程序会使用 cgroup 虚拟文件系统对应的名字来创建、删除 cgroup 实例、设置或查询任务所在的 cgroup。这些操作只影响 cgroup 文件系统中关联的 cgroup 实例所在的 hierarchy。

2 为什么需要 cgroups?

Linux 内核为了使用了多种技术(cpusets, CKRM/ResGroups, UserBeanCounters, 以及 virtual servernamespaces)管理进程。这些技术都需要对进程分组/分区。


内核提供的 cgroup 提供了一套内核机制。举例来说:


echo pid > /sys/fs/cgroup/network/<new_class>/tasks


只需要把管理的任务写入,即可达到对某一资源的控制(如 network)。

3 cgroup 是如何实现的?

cgroups 扩展了内核以下内容:


  • 每个任务在系统中指向一个 css_set 结构体指针.

  • 一个 css_set 含有一系列指向 cgroup_subsys_state 结构体的指针, 每个 cgroup_subsys_state 对应一个 cgroup subsystem.

  • cgroup hierarchy 文件可以被挂载浏览、执行用户态操作.

  • 查看 cgroup 下所有的任务 PID.


具体在内核中如何通过 css_set 管理不在本文讨论范围之内。


在文件夹目录下,可以看到 cgroup 含有以下文件夹内容:


  • tasks: 一系列的 pids. 将进程 ID 写入这个文件会将其移动到这个 cgroup.

  • cgroup.procs: 一系列的进程组 IDs.将进程组 ID 写入这个文件会将其移动到这个 cgroup.

  • notify_on_release flag: 是否运行 release agent?

  • release_agent: 用于发布通知的路径(此文件仅存在于顶级 cgroup)


cgroups 可以使用 mkdir 系统调用或者 shell 命令创建,cgroup 的属性则可以通过修改相应的文件内容进行修改。


美团对这个架构图有一个绘制,如图所示。


图1 cgroups架构图

4 如何使用 cgroups ?

以一个 httpd 程序 pid=51656 程序为例,需要限制 httpd cpu 使用 2,3, mem 使用 1 限制,net 限制使用 cg3 中已有的配置内容。示意图如图所示


  ## 限制cpu、mem使用  cd /sys/fs/cgroup/cpu_mem_cg  mkdir cg2  cd cg2  /bin/echo 2-3 > cpuset.cpus  /bin/echo 1 > cpuset.mems  /bin/echo 51565 > tasks  ## 限制net使用  cd /sys/fs/cgroup/net/cg3  /bin/echo 51565 > tasks
复制代码


图2 cgroups示例图


参考文献

linux资源管理之cgroups简介

Linux kernel cgroups-v1

发布于: 2022 年 07 月 03 日阅读数: 20
用户头像

自顶向下 2020.11.01 加入

还未添加个人简介

评论

发布
暂无评论
cgroup简介_Cgroups_总想做点什么_InfoQ写作社区