Docker核心原理之 Cgroup详解

cgroup的内核通过hook钩子来实现管理进程资源,提供了一个统一的接口,从单个进程的资源控制到操作系统层面的虚拟卡的过渡,今天通过本文给大家介绍Docker核心原理之 Cgroup详解,需要的朋友参考下吧

内核中强大的工具cgroup,不仅可以限制被NameSpace隔离起来的资源,还可以为资源设置权重,计算用量等

什么是cgroup

cgroup全称是control groups

control groups:控制组,被整合在了linux内核当中,把进程(tasks)放到组里面,对组设置权限,对进程进行控制。可以理解为用户和组的概念,用户会继承它所在组的权限。

cgroups是linux内核中的机制,这种机制可以根据特定的行为把一系列的任务,子任务整合或者分离,按照资源划分的等级的不同,从而实现资源统一控制的框架,cgroup可以控制、限制、隔离进程所需要的物理资源,包括cpu、内存、IO,为容器虚拟化提供了最基本的保证,是构建docker一系列虚拟化的管理工具

对于开发cgroup的特点

API:实现管理

cgroup管理可以管理到线程界别

所有线程功能都是subsystem(子系统)统一的管理方式

子进程和父进程在一个cgroup里面,只需要控制父进程就可以

cgroup的作用

cgroup的内核通过hook钩子来实现管理进程资源,提供了一个统一的接口,从单个进程的资源控制到操作系统层面的虚拟卡的过渡

cgroup提供了四个功能:

  1. 资源控制:cgroup通过进程组对资源总额进行限制。如:程序使用内存时,要为程序设定可以使用主机的多少内存,也叫作限额
  2. 优先级分配:使用硬件的权重值。当两个程序都需要进程读取cpu,哪个先哪个后,通过优先级来进行控制
  3. 资源统计:可以统计硬件资源的用量,如:cpu、内存…使用了多长时间
  4. 进程控制:可以对进程组实现挂起/恢复的操作,

术语表

  • task:表示系统中的某一个进程―PID
  • cgroup:资源控制,以控制组(cgroup)为单位实现,cgroup中有都是task,可以有多个cgroup组,可以限制不同的内容,组名不能相同。
  • subsystem:子系统。资源调度控制器。具体控制内容。如:cpu的子系统控制cpu的时间分配,内存的子系统可以控制某个cgroup内的内存使用量,硬盘的子系统,可以控制硬盘的读写等等。
  • hierarchy:层级树,一堆cgroup构成,包含多个cgroup的叫层级树,,每个hierarchy通过绑定的子系统对资源进行调度,可以包含0个或多个子节点,子节点继承父节点的属性,整个系统可以有多个hierarchy,是一个逻辑概念

关系:一个cgroup里可以有多个task,subsystem相当于控制cgroup限制的类型, hierarchy里可以有多个cgroup,一个系统可以有多个hierarchy。

层级树的四大规则

传统的进程启动,是以init为根节点,也叫父进程,由它来创建子进程,作为子节点,而每个子节点还可以创建新的子节点,这样构成了树状结构。而cgroup的结构跟他类似的。子节点继承父节点的属性。他们最大的不同在于,系统的cgroup构成的层级树允许有多个存在,如果进程模型是init为根节点形成一个树,那cgroup的模型由多个层级树来构成。

如果只有一个层级树,所有的task都会受到一个subsystem的相同的限制,会给不需要这种限制的task造成麻烦

1.同一个层级树(hierarchy)可以附加一个或多个子系统(subsystem)

可以看到在一个层级树中,有一个cpu_mem_cg的cgroup组下还有两个子节点cg1和cg2,如图所示,也就意味着在cpu_mem_cg的组中,附加了cpu和mem内存两个子系统,同时来控制cg1和cg2的cpu和内存的硬件资源使用

2.一个子系统(subsystem)可以附加到多个层级树(hierarchy)中,但是仅仅是可以附加到多个没有任何子系统的层级树中。

如图所示,cpu子系统先附加到层级树A上,同时就不能附加到层级树B上,因为B上已经有了一个mem子系统,如果B和A同时都是没有任何子系统时,这时,cpu子系统可以同时附加到A和B两个层级树中

言外之意就是,如果多个层级树中都没有子系统,这个时候一个cpu子系统依次可以附加到这些层级树中

3.一个进程(task)不能属于同一个层级树(hierarchy)的不同cgroup

系统每次新建一个层级树(hierarchy)时,默认的构成了新的层级树的初始化的cgroup,这个cgroup被称为root cgroup,对于你自己成功的层级树(hierarchy)来说,task只能存在这个层级树的一个cgroup当中,意思就是一个层级树中不能出现两个相同的task,但是它可以存在不同的层级树中的其他cgroup。

如果要将一个层级树cgroup中的task添加到这个层级树的其他cgroup时,会被从之前task所在的cgroup移除

如以上图中示例:

httpd已经加入到层级树(hierarchy)A中的cg1中,且pid为58950,此时就不能将这个httpd进程放入到cg2中,不然cg1中的httpd进程就会被删除,但是可以放到层级树(hierarchy)B的cg3控制组中

其实是为了防止出现进程矛盾,如:在层级树A中的cg1中存在httpd进程,这时cpu对cg1的限制使用率为30%,cg2的限制使用率为50%,如果再将httpd进程添加到cg2中,这时httpd的cpu使用率限制就有了矛盾。

4.刚fork出的子进程在初始状态与父进程处于同一个cgroup

进程task新开的一个子进程(child_task)默认是和原来的task在同一个cgroup中,但是child_task允许被移除到该层级树的其他不同的cgroup中。

当fork刚完成之后,父进程和子进程是完全独立的

如图中所示中,httpd58950进程,当有人访问时,会fork出另外一个子进程httpd58951,这个时候默认httpd58951和httpd58950都在cg1中,他们的关系也是父子进程,httpd58951是可以移动到cg2中,这时候就改变了他们的关系,都变为了独立的进程。

Subsystem子系统

subsystem究竟可以控制什么东西

通过以下的操作来验证

 [root@localhost ~]# yum -y install libcgroup-tools 安装这个工具后就看可以通过使用cgroup命令来查看

列出系统中所有的cgroup控制组

 [root@localhost ~]# lscgroup net_cls,net_prio:/ freezer:/ hugetlb:/ cpu,cpuacct:/ cpu,cpuacct:/machine.slice cpu,cpuacct:/user.slice cpu,cpuacct:/system.slice cpu,cpuacct:/system.slice/network.service cpu,cpuacct:/system.slice/docker.service ...

查看subsystem可以控制的硬件

 [root@localhost ~]# lssubsys -a cpuset cpu,cpuacct memory devices freezer net_cls,net_prio blkio perf_event hugetlb pids

以上查看到的,有存在的对应目录,/sys/fs/cgroup

 [root@localhost ~]# ll /sys/fs/cgroup/ total 0 drwxr-xr-x. 5 root root  0 Mar 25 04:50 blkio lrwxrwxrwx. 1 root root 11 Mar 25 04:50 cpu -> cpu,cpuacct lrwxrwxrwx. 1 root root 11 Mar 25 04:50 cpuacct -> cpu,cpuacct drwxr-xr-x. 5 root root  0 Mar 25 04:50 cpu,cpuacct drwxr-xr-x. 2 root root  0 Mar 25 04:50 cpuset drwxr-xr-x. 5 root root  0 Mar 25 04:50 devices drwxr-xr-x. 2 root root  0 Mar 25 04:50 freezer drwxr-xr-x. 2 root root  0 Mar 25 04:50 hugetlb drwxr-xr-x. 5 root root  0 Mar 25 04:50 memory lrwxrwxrwx. 1 root root 16 Mar 25 04:50 net_cls -> net_cls,net_prio drwxr-xr-x. 2 root root  0 Mar 25 04:50 net_cls,net_prio lrwxrwxrwx. 1 root root 16 Mar 25 04:50 net_prio -> net_cls,net_prio drwxr-xr-x. 2 root root  0 Mar 25 04:50 per

以上就是Docker核心原理之 Cgroup详解的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » 站长技巧