• 售前

  • 售后

热门帖子
入门百科

Docker核心原理之 Cgroup详解

[复制链接]
慧眼识英雄1 显示全部楼层 发表于 2021-8-14 14:24:07 |阅读模式 打印 上一主题 下一主题
内核中强盛的工具cgroup,不仅可以限定被NameSpace隔离起来的资源,还可以为资源设置权重,盘算用量等
什么是cgroup

cgroup全称是control groups
control groups:控制组,被整合在了linux内核当中,把进程(tasks)放到组内里,对组设置权限,对进程举行控制。可以明白为用户和组的概念,用户会继承它所在组的权限。
cgroups是linux内核中的机制,这种机制可以根据特定的举动把一系列的任务,子任务整合大概分离,按照资源划分的等级的不同,从而实现资源统一控制的框架,cgroup可以控制、限定、隔离进程所必要的物理资源,包括cpu、内存、IO,为容器虚拟化提供了最根本的包管,是构建docker一系列虚拟化的管理工具
对于开发cgroup的特点
  1. API:实现管理
  2. cgroup管理可以管理到线程界别
  3. 所有线程功能都是subsystem(子系统)统一的管理方式
  4. 子进程和父进程在一个cgroup里面,只需要控制父进程就可以
复制代码
cgroup的作用

cgroup的内核通过hook钩子来实现管理进程资源,提供了一个统一的接口,从单个进程的资源控制到利用系统层面的虚拟卡的过渡
cgroup提供了四个功能:
       
  • 资源控制:cgroup通过进程组对资源总额举行限定。如:步调使用内存时,要为步调设定可以使用主机的多少内存,也叫作限额   
  • 优先级分配:使用硬件的权重值。当两个步调都必要进程读取cpu,哪个先哪个后,通过优先级来举行控制   
  • 资源统计:可以统计硬件资源的用量,如:cpu、内存…使用了多长时间   
  • 进程控制:可以对进程组实现挂起/规复的利用,
术语表
       
  • 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)
  1. 可以看到在一个层级树中,有一个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毕竟可以控制什么东西
通过以下的利用来验证
  1. [root@localhost ~]# yum -y install libcgroup-tools
  2. 安装这个工具后就看可以通过使用cgroup命令来查看
复制代码
列出系统中所有的cgroup控制组
  1. [root@localhost ~]# lscgroup
  2. net_cls,net_prio:/
  3. freezer:/
  4. hugetlb:/
  5. cpu,cpuacct:/
  6. cpu,cpuacct:/machine.slice
  7. cpu,cpuacct:/user.slice
  8. cpu,cpuacct:/system.slice
  9. cpu,cpuacct:/system.slice/network.service
  10. cpu,cpuacct:/system.slice/docker.service
  11. ...
复制代码
检察subsystem可以控制的硬件
  1. [root@localhost ~]# lssubsys -a
  2. cpuset
  3. cpu,cpuacct
  4. memory
  5. devices
  6. freezer
  7. net_cls,net_prio
  8. blkio
  9. perf_event
  10. hugetlb
  11. pids
复制代码
以上检察到的,有存在的对应目次,
  1. /sys/fs/cgroup
复制代码
  1. [root@localhost ~]# ll /sys/fs/cgroup/
  2. total 0
  3. drwxr-xr-x. 5 root root  0 Mar 25 04:50 blkio
  4. lrwxrwxrwx. 1 root root 11 Mar 25 04:50 cpu -> cpu,cpuacct
  5. lrwxrwxrwx. 1 root root 11 Mar 25 04:50 cpuacct -> cpu,cpuacct
  6. drwxr-xr-x. 5 root root  0 Mar 25 04:50 cpu,cpuacct
  7. drwxr-xr-x. 2 root root  0 Mar 25 04:50 cpuset
  8. drwxr-xr-x. 5 root root  0 Mar 25 04:50 devices
  9. drwxr-xr-x. 2 root root  0 Mar 25 04:50 freezer
  10. drwxr-xr-x. 2 root root  0 Mar 25 04:50 hugetlb
  11. drwxr-xr-x. 5 root root  0 Mar 25 04:50 memory
  12. lrwxrwxrwx. 1 root root 16 Mar 25 04:50 net_cls -> net_cls,net_prio
  13. drwxr-xr-x. 2 root root  0 Mar 25 04:50 net_cls,net_prio
  14. lrwxrwxrwx. 1 root root 16 Mar 25 04:50 net_prio -> net_cls,net_prio
  15. drwxr-xr-x. 2 root root  0 Mar 25 04:50 perf_event
  16. drwxr-xr-x. 5 root root  0 Mar 25 04:50 pids
  17. drwxr-xr-x. 5 root root  0 Mar 25 04:50 systemd
复制代码
可以看到目次中的内容是比下令检察到的多,是由于有几个软链接文件
  1. # 以下三个都属于cpu,cpuacct
  2. cpu -> cpu,cpuacct
  3. cpuacct -> cpu,cpuacct
  4. cpu,cpuacct
  5. # 以下三个都属于net_cls,net_prio
  6. net_cls -> net_cls,net_prio
  7. net_prio -> net_cls,net_prio
  8. net_cls,net_prio
复制代码
Subsystem可以控制的内容分别代表什么
            编号            限定内容            代表意思                                    1            blkio(对块装备提供输入输出的限定)            光盘、固态磁盘、USB…。                            2            cpu            可以调控task对cpu的使用。                            3            cpuacct            自动天生task对cpu资源使用情况的陈诉。                            4            cpuset(针对多处理处罚器的物理机使用)            对task单独分配某个cpu使用的。                            5            device(装备是指键盘、鼠标…)            关闭和开启task对装备的访问。                            6            freezer            控制task的挂起和规复,如不答应某个task使用cpu被称之为挂起。                            7            memory            控制task对内存使用量的限定,自动天生对内存资源使用的陈诉                            8            perf_event            对task可以举行统一的性能测试,如探测linxu的cpu性能以及硬盘的读写效率等等。                            9            net_cls            在docker中没有直接被使用,它通过使用等级辨认符(classid)标志网络数据包,从而答应 Linux 流量控制步调辨认从详细cgroup中天生的数据包。        
留意:到现在为止,还没有可以对容器硬盘巨细举行限定的工具,只能限定硬盘的读写频率
cgroup的工作原理

检察cgroup中的CPU控制中的tasks文件,存放了对文件中的进程的cpu的控制,假如要添加某个进程对cpu的控制,将进程的pid到场tasks文件即可,包括其他的硬件资源控制也是如此
  1. [root@localhost ~]# cat /sys/fs/cgroup/cpu/tasks
  2. 1
  3. 2
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. ...
  11. 68469
  12. 68508
  13. 68526
  14. 68567
复制代码
在生产情况中,由于在内核中,所以它是自动增长的
cgroup真正的工作原理就是hook钩子,cgroup的实现本质上是给系统进程挂上钩子实现的,当task进程运行的过程中,筹划到某个资源是,就会触发钩子上附带的subsystem子系统举行资源检测,最终根据资源种别的不同使用对应的技能举行资源限定和优先级分配。
钩子是怎么实现的
简朴来说,linux中管理task进程的数据布局,在cgroup的每个task设置一个关键词,将关键词都指向钩子,叫做指针。
一个task只对应一个指针布局时,一个指针布局可以被多个task举利用用
当一个指针一旦读取到唯一指针数据的内容,task就会被触发,就可以举行资源控制
在现实的使用过程中,用户必要使用mount来挂载cgroup控制组
在目次中可以看到,比如httpd步调,pid号为69060
  1. [root@localhost ~]# yum -y install httpd^C
  2. [root@localhost ~]# systemctl start httpd^C
  3. [root@localhost ~]# netstat -anput | grep 80
  4. tcp6       0      0 :::80           :::*          LISTEN      69060/httpd
复制代码
检察它pid号目次中的mounts文件,存放了大量的关于cgroup的挂载
可以看到每一个cgoup反面的目次,如
  1. /sys/fs/cgroup/cpu,cpuacct
复制代码
,阐明httpd进程受到了cpu使用的限定,该文件中另有许多雷同的挂载项,可以看到的有
  1. blkio/perf_event/memory
复制代码
等的硬件资源控制。
  1. [root@localhost ~]# cat /proc/69060/mounts
  2. rootfs / rootfs rw 0 0
  3. /dev/mapper/centos-root / xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0
  4. devtmpfs /dev devtmpfs rw,seclabel,nosuid,size=914476k,nr_inodes=228619,mode=755 0 0
  5. tmpfs /dev/shm tmpfs rw,seclabel,nosuid,nodev 0 0
  6. devpts /dev/pts devpts rw,seclabel,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0
  7. mqueue /dev/mqueue mqueue rw,seclabel,relatime 0 0
  8. hugetlbfs /dev/hugepages hugetlbfs rw,seclabel,relatime 0 0
  9. ...
  10. cgroup /sys/fs/cgroup/systemd cgroup rw,seclabel,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd 0 0
  11. cgroup /sys/fs/cgroup/net_cls,net_prio cgroup rw,seclabel,nosuid,nodev,noexec,relatime,net_prio,net_cls 0 0
  12. cgroup /sys/fs/cgroup/freezer cgroup rw,seclabel,nosuid,nodev,noexec,relatime,freezer 0 0
  13. cgroup /sys/fs/cgroup/hugetlb cgroup rw,seclabel,nosuid,nodev,noexec,relatime,hugetlb 0 0
  14. cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,seclabel,nosuid,nodev,noexec,relatime,cpuacct,cpu 0 0
  15. cgroup /sys/fs/cgroup/cpuset cgroup rw,seclabel,nosuid,nodev,noexec,relatime,cpuset 0 0
  16. cgroup /sys/fs/cgroup/devices cgroup rw,seclabel,nosuid,nodev,noexec,relatime,devices 0 0
  17. cgroup /sys/fs/cgroup/memory cgroup rw,seclabel,nosuid,nodev,noexec,relatime,memory 0 0
  18. cgroup /sys/fs/cgroup/blkio cgroup rw,seclabel,nosuid,nodev,noexec,relatime,blkio 0 0
  19. cgroup /sys/fs/cgroup/pids cgroup rw,seclabel,nosuid,nodev,noexec,relatime,pids 0 0
  20. cgroup /sys/fs/cgroup/perf_event cgroup rw,seclabel,nosuid,nodev,noexec,relatime,perf_event 0 0
  21. ...
复制代码
这就是通过mount控制cgroup的,所有的步调都是如许的,子系统上所有的系统都把文件mount上以后,就可以像利用系统一样利用cgroup和层级树举行管理,包括权限管理、子文件系统,除了cgroup文件系统以外,内核中没有为cgroup的访问提供添加其他任何的利用,想要去利用cgroup,就必须使用mount挂到某一个cgroup控制组内才行。
资源控制利用

我们必要知道每一个硬件资源的详细怎么去控制的利用
如:
cgroup组中的cpu目次里详细的每一项的详细的含义,都是对cpu详细的控制的细节
  1. [root@localhost ~]# cd /sys/fs/cgroup/cpu
  2. [root@localhost cpu]# ls
  3. cgroup.clone_children  cpuacct.stat          cpu.cfs_quota_us   cpu.stat           system.slice
  4. cgroup.event_control   cpuacct.usage         cpu.rt_period_us   machine.slice      tasks
  5. cgroup.procs           cpuacct.usage_percpu  cpu.rt_runtime_us  notify_on_release  user.slice
  6. cgroup.sane_behavior   cpu.cfs_period_us     cpu.shares         release_agent
复制代码
这些详细的使用方法会在下一篇文章中来逐个去表明用法
Docker下令行限定内容
  1. -c/--cpu-shares:限制cpu优先级
  2. -m/--memory:限制内存的使用容量
  3. --memory-swap:限制内存+swap的大小
  4. --blkil-weight
  5. bps/iops
  6. --device-read-bps
  7. --device-write-bps
  8. --device-read-iops
  9. --device-write-iops
复制代码
详细使用方法:cpu、内存、blkio
cgroup目次布局如下
  1. /sys/fs/cgroup
复制代码
中存放了所有进程的硬件资源控制
  1. /sys/fs/cgroup/{cpu,memory,blkio...}/
复制代码
目次下存放了特定硬件资源的默认的非docker进程的控制,docker的进程号不会在这些目次下
  1. /sys/fs/cgroup/cpu/docker/
复制代码
目次下存放了docker在主机内的进程控制
  1. /sys/fs/cgroup/cpu/docker/容器id/
复制代码
目次下存放了对docker产生的容器的控制

到此这篇关于Docker焦点原理之 Cgroup详解的文章就介绍到这了,更多相干Docker焦点原理内容请搜索脚本之家从前的文章或继承欣赏下面的相干文章盼望大家以后多多支持脚本之家!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作