cgroup 简介
本文对 linux 提供的 cgroup 能力,已期望说明以下内容:
什么是 cgroups ?
为什么需要 cgroups ?
cgroups 是怎么实现的?
如何使用 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 的属性则可以通过修改相应的文件内容进行修改。
美团对这个架构图有一个绘制,如图所示。
4 如何使用 cgroups ?
以一个 httpd 程序 pid=51656 程序为例,需要限制 httpd cpu 使用 2,3, mem 使用 1 限制,net 限制使用 cg3 中已有的配置内容。示意图如图所示
参考文献
版权声明: 本文为 InfoQ 作者【总想做点什么】的原创文章。
原文链接:【http://xie.infoq.cn/article/8194bcc4d361ea09087b48dd0】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论