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管理模式的主要内容,如果未能解决你的问题,请参考以下文章

CGroup系列三CGroup使用指南

CGroup系列九Devices子系统

cgroup小记

CGroup系列七CPUSET子系统

linux cgroup机制

畅谈Docker底层技术-LXC与Cgroup