CGroup系列二CGroup管理模式
Posted 高桐@BILL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CGroup系列二CGroup管理模式相关的知识,希望对你有一定的参考价值。
写在前面
我们可以通过静态、动态的方式来配置cgroup以达到管控系统资源的目的。静态的方式就是在系统启动时通过系统服务挂载cgroup并加载cgroup配置策略。动态的方式就是根据系统运行时场景实时调整cgroup配置策略。
一、CGroup管理模式
CGroup是分层管理的,类似进程。子层级会继承父层级cgroup的属性。
Linux系统中的所有进程都是通用父进程init的子进程,该进程在引导时由内核执行并启动其他进程。所有进程都归结到一个父进程,所以Linux进程管理模式都是一个单一层级结构,或树结构。另外,init之外的每个Linux进程都会集成其父进程的环境和某些属性。
那么CGroup与Linux的进程管理模式由相似之处,主要体现在以下两点:
- CGroup同样分级
- 子CGroup会继承父CGroup的某些属性
不同之处在于cgroup不是单一树模式,可能是多个树并行的。这里可能不太好理解。如前面所述,CGroup支持多达十几个子系统,那么如果所有的子系统都合并挂载到一个层级上,我们可以直接用Linux系统中init进程管理模式来理解没问题的。但是大多数情况下,可能会有多个层级存在。最极端的情况下, 一个子系统就独立附加到一个层级上去。
以Ubuntu 18.04为例,如下图:
如上图,有多达13个层级,cpu子系统和cpuacct子系统合并挂载到了”cpu,cpuacct”层级中。每个层级都是一个独立的树结构。如果不理解没关系,读完本系列自然一目了然。
二、CGroup默认层级
默认情况下,systemd会自动创建slice,scope和service单位的层级,来为cgroup树提供统一结构。systemd也会自动为/sys/fs/cgroup/目录中重要的kernel子系统挂载层级。
系统中运行的所有进程,都是systemd init进程的子进程。这些进程类型大体上份为3类进程,分别是service、scope和slice。
2.1 service
一个或一组进程,由systemd根据unit配置文件启动。根据需求service对指定进程进行封装,可以作为一个整体来启动或者停止。命名方式如下:
name.service
2.2 scope
一组外部创建的进程,通过fork()函数启动,停止,之后被systemd在运行时注册的进程。这些进程会被标记为scope。如用户会话、容器和虚拟机等。
name.scope
2.3 slice
指按层级排列的类型。slice并不包含进程,但会创建一个层级,并将scope和service都放在其中。真正的进程包含在scope和service中。
parent-name.slice
parent-name-name2.
slice
如name.service属于parent-child.slice,会被映射到cgroup parent.slice/parent-child.lsice/name.service中。
系统默认会创建4种slice:
-
-.slice —— 根 slice;
-
system.slice —— 包含所有系统 service;
-
user.slice —— 包含所有用户会话;
-
machine.slice —— 包含所有虚拟机和 Linux 容器。
......
以上是关于CGroup系列二CGroup管理模式的主要内容,如果未能解决你的问题,请参考以下文章