目录
cgroups是什么?
版本问题
如何判断当前版本?
补充:mount相关知识
cgroups的基本概念
实际例子来解释基本概念
cgroup的一些规律
最近因为工作需要调研了cgroups相关内容,网上的资料鱼龙混杂,导致我浪费了很多时间。
因此打算写一系列教程,供新手参考学习,不包含什么高阶的内容。
涉及到的cgroups之外的知识点都有补充介绍,了解的朋友可以不看补充的内容。
本篇介绍的是cgroups的基本概念。
cgroups(control 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 命令可以查看已挂载的文件系统,比如:
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是如何限制资源使用的呢?
这个要引入几个新的概念,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的目录,这就是我们刚刚创建的。
参考文章:
mount相关博客
cgroup的基本概念