cgroups新手教程-基本概念

 

目录

cgroups是什么?

版本问题

如何判断当前版本?

补充:mount相关知识

cgroups的基本概念

实际例子来解释基本概念

cgroup的一些规律

最近因为工作需要调研了cgroups相关内容,网上的资料鱼龙混杂,导致我浪费了很多时间。

因此打算写一系列教程,供新手参考学习,不包含什么高阶的内容。

涉及到的cgroups之外的知识点都有补充介绍,了解的朋友可以不看补充的内容。

本篇介绍的是cgroups的基本概念。


cgroups是什么?

cgroupscontrol groups),是linux内核的一个功能。它的主要功能是将进程划分成若干个组,按组限制进程的资源使用情况,限制的资源包括cpu,内存,io等。

版本问题

cgroup有两个版本,v1和v2。v1版本开发过程相对混乱,导致该版本的cgroup的管理非常复杂。

Linuxe Kernel 4.5.0的时候,cgroup v2已经成为正式特性。cgroup v2希望完全取代cgroup v1,但是为了兼容,cgroup v1没有被移除

ubuntu2004默认使用的是v1版本,因此以下都介绍的都是v1版本。

如何判断当前版本?

mount|grep croup

如果输出的文件系统都是cgroup2格式的,那说明是v2版本,不然就是v1。

补充:mount相关知识

通过 mount 命令可以查看已挂载的文件系统,比如:

cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate)

输出中的每行代表挂载的一个文件系统,其格式为:
fs_spec on fs_file type fs_vfstype (fs_mntopts)
fs_spec:挂载的块设备或远程文件系统
fs_file:文件系统的挂载点
fs_vfstype:文件系统的类型
fs_mntopts:与文件系统相关的更多选项,不同的文件系统其选项也不太一样


比如这一行的含义为:挂载的文件系统为 cgroup2,挂载点为 /sys/fs/cgroup,文件系统的类型为 cgroup2。 

cgroup2是v2的文件系统,cgroup是v1的文件系统。

因此执行mount|grep croup输出的文件系统都是cgroup2格式的,就说明当前cgroups是v2版本。

cgroups的基本概念

cgroups是将进程划分为若干个组,分组限制进程的资源使用。

那cgroups是如何限制资源使用的呢?

这个要引入几个新的概念,subsystem,这个词被翻译为子系统

就是subsystem限制了进程使用资源,因此也被称呼资源控制器,比如 cpu子系统就是控制cpu时间分配的一个控制器。

cgroups划分的组也有大组和小组之分,小组和大组之间是从属关系,一个大组里若干个小组这样。

大组叫做Hierarchy,这个词也被翻译为层次体系或者继承体系,subsystem需要与Hierarchy关联才能起到资源限制的效果。大组与小组之间有继承关系,Hierarchy关联的subsystem会限制该Hierarchy下的所有小组。因为组与组之间的树状关系,Hierarchy也被称为树形结构

小组也叫做cgroups,在系统上以目录的形式存在。

为什么要有大组小组之分,只用Hierarchy不用cgroup不行嘛?

其实划分多个cgroup是为了更详细的限制。因为每个subsystem都有多个参数可以配置,不同的组可以配置不同的参数。

每个Hierarchy创建的时候系统会默认再创建一个control groups,并且这个control groups被称之为root cgroup。

在cgroups中进程被翻译为task。

Hierarchy是系统自动创建的,一般不需要手动创建。

实际例子来解释基本概念

#执行以下指令
cat /proc/cgroups

#输出
#subsys_name    hierarchy    num_cgroups    enabled
cpuset               3            1           1
cpu                  5            2           1
cpuacct              5            2           1
blkio                8            1           1
memory               11           143         1
devices              12           72          1
freezer              7            2           1
net_cls              2            1           1
perf_event           10           1           1
net_prio             2            1           1
hugetlb              6            1           1
pids                 4            74          1
rdma                 9            1           1

这个指令可以查看系统当前支持的subsystem。

输出的信息从左到右依次是subsystem名,关联Hierarchy的id,关联Hierarchy内group的数量以及该subsystem是否启用。num_cgroups为1就是只有root group。

系统支持的subsystem数量是固定的,用户无法增删。

#执行以下指令
ll /sys/fs/cgroup/

#输出
drwxr-xr-x 15 root root 380 10月 31 09:07 ./
drwxr-xr-x  8 root root   0 10月 31 09:07 ../
dr-xr-xr-x  2 root root   0 10月 31 09:07 blkio/
lrwxrwxrwx  1 root root  11 10月 31 09:07 cpu -> cpu,cpuacct/
lrwxrwxrwx  1 root root  11 10月 31 09:07 cpuacct -> cpu,cpuacct/
dr-xr-xr-x  3 root root   0 10月 31 09:07 cpu,cpuacct/
dr-xr-xr-x  2 root root   0 10月 31 09:07 cpuset/
dr-xr-xr-x  5 root root   0 10月 31 09:07 devices/
dr-xr-xr-x  3 root root   0 10月 31 09:07 freezer/
dr-xr-xr-x  2 root root   0 10月 31 09:07 hugetlb/
dr-xr-xr-x  4 root root   0 10月 31 09:07 memory/
lrwxrwxrwx  1 root root  16 10月 31 09:07 net_cls -> net_cls,net_prio/
dr-xr-xr-x  2 root root   0 10月 31 09:07 net_cls,net_prio/
lrwxrwxrwx  1 root root  16 10月 31 09:07 net_prio -> net_cls,net_prio/
dr-xr-xr-x  2 root root   0 10月 31 09:07 perf_event/
dr-xr-xr-x  4 root root   0 10月 31 09:07 pids/
dr-xr-xr-x  2 root root   0 10月 31 09:07 rdma/
dr-xr-xr-x  5 root root   0 10月 31 09:07 systemd/
dr-xr-xr-x  5 root root   0 10月 31 09:07 unified/

输出的目录就是系统默认创建的Hierarchy,他们已经与subsystem关联。

系统为了方便用户,就将Hierarchy设置成关联的subsystem的名字。


我们创建一个group试一下,在名为rdma的Hierarchy下创建subgroup这个group。

ps:cgcreate这个指令来自cgroup-tools

#执行
sudo cgcreate -g rdma:subgroup
ll /sys/fs/cgroup/rdma/

#输出
总用量 0
dr-xr-xr-x  3 root root   0 11月  1 09:25 ./
drwxr-xr-x 15 root root 380 11月  1 09:25 ../
-rw-r--r--  1 root root   0 11月  1 10:40 cgroup.clone_children
-rw-r--r--  1 root root   0 11月  1 10:40 cgroup.procs
-r--r--r--  1 root root   0 11月  1 10:40 cgroup.sane_behavior
-rw-r--r--  1 root root   0 11月  1 10:40 notify_on_release
-rw-r--r--  1 root root   0 11月  1 10:40 release_agent
drwxr-xr-x  2 root root   0 11月  1 10:38 subgroup/
-rw-r--r--  1 root root   0 11月  1 10:40 tasks

发现rdma对应的目录下出现了名为subgroup的目录,这就是我们刚刚创建的。
 

cgroup的一些规律

  1. 每个subsystem只能关联一个Hierarchy,一个Hierarchy可以关联多个subsystem。
  2. 系统默认创建的Hierarchy是只关联一个subsystem的,因为一个subsystem限制一种资源,每个进程都可以使用多种资源,因此每个Hierarchy都包含整个系统中的tasks。
  3. 一个进程可以属于多个Hierarchy中的cgroup,但是不能同时属于一个Hierarchy的多个cgroup。

 参考文章:

mount相关博客

cgroup的基本概念

你可能感兴趣的:(linux,运维,服务器)