计算机系统应用教程网站

网站首页 > 技术文章 正文

cgroup概述

btikc 2024-12-31 09:38:10 技术文章 17 ℃ 0 评论

本文对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所示。

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

参考文献

[linux资源管理之cgroups简介] https://tech.meituan.com/2015/03/31/cgroups.html

[Linux kernel cgroups-v1] https://www.kernel.org/doc/Documentation/cgroup-v1/cgroups.txt

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表