cgroup的内核通过hook钩子管理进程资源,提供了统一的接口,从单个进程的资源控制到操作系统级的虚拟卡的过渡。今天我们就通过这篇文章介绍一下Cgroup对Docker核心原理的详细解释。请有需要的朋友参考一下。
内核中强大的工具Cgroup不仅可以限制按名称空间隔离的资源,还可以设置资源的权重,计算使用量。
什么是cgroup
cgroup的全称是control groups。
控制组:控制组集成到linux内核中,将任务分组,为组设置权限,并控制进程。可以理解为用户和组的概念,用户会继承其组的权限。
Cgroup是linux内核中的一种机制,可以按照特定的行为将一系列的任务和子任务进行整合或分离,实现按照不同的资源级别进行统一资源控制的框架。CGroup可以控制、限制和隔离进程所需的物理资源,包括cpu、内存和IO,为容器虚拟化提供了最基本的保障,是构建docker一系列虚拟化的管理工具。
针对发展中国家集团的特点
API:实施管理
c组管理可以管理到线程扇区。
所有线程功能由子系统统一管理。
子进程和父进程在一个cgroup中,所以你只需要控制父进程。
cgroup的作用
cgroup的内核通过hook钩子管理进程资源,为单个进程的资源控制过渡到操作系统级的虚拟卡提供了统一的接口。
Cgroup提供了四个功能:
资源控制:cgroup通过进程组限制资源总量。比如一个程序在使用内存的时候,需要设置主机的多少内存可以用于程序,这个也叫极限。
优先级:使用硬件的权重值。当两个程序都需要进程读取cpu时,哪个先来,哪个后来,就按优先级控制。
资源统计:可以统计硬件资源的使用情况,比如cpu、内存等。多长时间。
过程控制:您可以暂停/恢复一个过程组,
术语
任务:表示系统中的一个进程-—PID。
Cgroup:资源控制,以控制组(CGroups)为单位实现。所有cgroup都是任务,可以有多个cgroup,可以限制不同的内容。组名不能相同。
子系统:子系统。资源调度控制器。具体控制内容。比如cpu的子系统控制cpu的时间分配,内存的子系统可以控制一个cgroup中的内存使用,硬盘的子系统可以控制硬盘的读写等等。
层次:由一堆CGroups组成的层次树,称为包含多个CGroups的层次树。每个层次结构通过一个绑定的子系统来调度资源,该子系统可以包含0个或多个子节点。子节点继承父节点的属性,整个系统可以有多个层次,这是一个逻辑概念。
关系:一个cgroup可以有多个任务,子系统相当于控制cgroup限制的类型,层次结构可以有多个cgroup,一个系统可以有多个层次结构。
层级树的四大规则
在传统的流程启动中,init是根节点,也称为父流程。它创建子流程作为子节点,每个子节点还可以创建一个新的子节点,从而形成一个树形结构。而且cgroup的结构和他的差不多。子节点继承父节点的属性。两者最大的区别是系统的cgroup形成的层次树允许多个存在。如果流程模型是init为根节点形成一棵树,那么cgroup模型由多个层次树组成。
如果只有一个层次树,那么所有的任务都会受到一个子系统的相同限制,这就给不需要这种限制的任务带来了麻烦。
1.一个或多个子系统可以附加到同一个层次结构树。
可以看到,在一个层次树中,有一个cpu_mem_cg的cgroup组,有两个子节点cg1和cg2,如图所示,这意味着在cpu_mem_cg的组中增加了cpu和mem内存两个子系统,同时控制cpu的硬件资源和cg1、cg2的内存的使用。
2.一个子系统可以附加到多个层次树,但是它只能附加到没有任何子系统的多个层次树。
如图所示,首先将cpu子系统附加到层次树A,但不能同时附加到层次树B,因为B上已经有一个mem子系统,如果B和A同时没有子系统,则cpu子系统可以同时附加到层次树A和B。
其含义是,如果在多个层次树中没有子系统,则可以将一个cpu子系统依次附加到这些层次树中。
3.流程(任务)不能属于同一层次结构树中的不同cgroup。
每当系统创建一个新的层次结构时,就会形成新层次结构的默认cgroup。这个cgroup称为根cgroup。对于你自己成功的层次结构,一个任务只能存在于这个层次结构的一个cgroup中,也就是说不能有两个完全相同的任务出现在一个层次结构中,但是它可以存在于不同层次结构的其他cgroup中。
如果要将分层树cgroup中的任务添加到该分层树中的其他cgroup中,该任务将从上一个任务所在的cgroup中删除。
以上图为例:
Httpd已经添加到层次树A中的cg1,它的pid是58950。此时,这个httpd进程不能放入cg2,否则,cg1中的httpd进程将被删除,但可以放入层次树b中的cg3控制组。
其实是为了防止流程冲突。比如层次树A的cg1中有一个httpd进程,cg1的cpu有限利用率是30%,而cg2是50%。如果将httpd进程加入cg2,httpd的cpu利用率就会矛盾。
4.刚从fork释放出来的子进程和初始状态的父进程在同一个cgroup。
task的一个新打开的子进程(child_task)默认与原task在同一个cgroup中,但是允许将child_task移到这个层次树中的其他不同cgroup中。
fork刚完成的时候,父进程和子进程是完全独立的。
如图所示,httpd58950进程在有人访问时会分叉出另一个子进程httpd58951。此时,默认的httpd58951和httpd58950都在cg1中,它们的关系也是父子进程。httpd58951可以移动到cg2,改变了它们的关系,成为独立的进程。
Subsystem子系统
子系统到底能控制什么?
通过以下操作进行验证
[root @ localhost ~]# yum-y install libc group-tools
安装好这个工具后,使用cgroup命令就可以看到了。
列出系统中的所有cgroup控制组
[root@localhost ~]# lscgroup
net_cls,net_prio:/
冰箱:/
hugetlb:/
cpu,cpuacct:/
cpu,cpuacct:/machine.slice
cpu,cpuacct:/user.slice
cpu,cpuacct:/system.slice
cpu,CPU acct:/system . slice/network . service
cpu,CPU acct:/system . slice/docker . service
.
检查子系统可以控制的硬件。
[root@localhost ~]# lssubsys -a
普塞特
cpu,cpuacct
记忆
设备
冰箱
net_cls,net_prio
blkio
性能事件
hugetlb
pids
上面的视图中有一个对应的目录,/sys/fs/cgroup
[root @ localhost ~]# ll/sys/fs/cgroup/
总计0
drwxr-xr-x . 5 root root 0 Mar 25 04:50 blk io
lrwxrwxrwx。1根根11月25日04:50 cpu - cpu,cpuacct
lrwxrwxrwx。1根根11月25日04:50中央处理器,中央处理器
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根根0月25日04:50设备
drwxr-xr-x. 2根根0月25日04:50冷冻器
drwxr-xr-x . 2 root root 0 Mar 25 04:50 hugetlb
drwxr-xr-x . 5 root root 0 Mar 25 04:50内存
lrwxrwxrwx。1根根16月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根根16月25日04:50 net_prio - net_cls,net_prio
drwxr-xr-x. 2根根0月25日04:50性能事件
drwxr-xr-x. 5根根0月25日04:50 PID
drwxr-xr-x . 5 root root 0 Mar 25 04:50 systemd
您可以看到目录中的内容比命令查看的内容多,因为有几个软链接文件。
#以下三个属于cpu,cpuacct
cpu - cpu
中央处理器,中央处理器
cpu,cpuacct
#以下三个属于net_cls,net_prio
net_cls - net_cls,net_prio
net_prio - net_cls,net_prio
net_cls,net_prio
子系统能控制的内容代表什么?
数字
限制内容
代表意义
一个
块设备提供的输入输出限制
光盘,固态硬盘,USB….
2
中央处理器
你可以通过任务控制cpu的使用。
三
cpuacct
按任务自动生成cpu资源使用报告。
四
Cpuset(用于具有多个处理器的物理机器)
为任务单独分配一个cpu。
五
设备(设备是指键盘、鼠标……)
以及关闭和打开任务对设备的访问。
六
冰箱
控制任务的暂停和恢复。如果一个任务不允许使用cpu,就叫暂停。
七
记忆
控制任务对内存使用的限制,自动生成内存资源使用报告。
八
性能事件
任务可以统一测试,比如检测林旭的cpu性能,硬盘读写效率等。
九
net_cls
不直接使用Docker。它通过使用类标识符(classid)来标记网络数据包,从而允许Linux流控制程序识别从特定cgroup生成的数据包。
注意:到目前为止,还没有工具可以限制容器的硬盘大小,只能限制硬盘的读写频率。
cgroup的工作原理
检查cgroup中cpu控制的tasks文件,该文件中存储了进程的cpu控制。如果要添加某个进程的CPU控制,只需将该进程的pid添加到tasks文件中即可,包括其他硬件资源控制。
[root @ localhost ~]# cat/sys/fs/cgroup/CPU/tasks
一个
2
四
五
六
七
八
九
.
68469
68508
68526
68567
在生产环境中,它是自动添加的,因为它在内核中。
cgroup真正的工作原理是hook钩子,cgroup的实现本质上是钩子系统进程。当任务流程运行过程中设计了某个资源,就会触发挂接的子系统对资源进行检测,最终使用相应的技术对资源进行限制,并根据不同的资源类别分配优先级。
钩子是如何实现的?
简单来说,linux管理任务进程的数据结构,在cgroup的每个任务中设置一个关键字,将关键字指向钩子,称为指针。
当一个任务只对应一个指针结构时,一个指针结构可以被多个任务使用。
当指针读取唯一指针数据的内容时,将触发任务,并且可以控制资源。
在实际使用中,用户需要使用mount来挂载cgroup控制组。
可以在目录里看到,比如httpd程序,pid号是69060。
[root@localhost ~]# yum -y安装httpd^C
[root@localhost ~]# systemctl启动httpd^C
[root @ localhost ~]# netstat-an put | grep 80
TCP 6 0 0:80:* list EN 69060/httpd
查看其pid目录中的mounts文件,其中存储了大量关于cgroup的挂载。
可以看到每个cgroup后面的目录,比如/sys/fs/cgroup/cpu,cpuacct,说明httpd进程是受cpu使用率限制的。这个文件中有很多类似的挂载项,可以看到blkio/perf_event/memory等硬件资源控制。
[root @ localhost ~]# cat/proc/69060/mounts
rootfs/rootfs rw 0 0
/dev/mapper/centos-root/xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0
devtmpfs /dev devtmpfs rw,seclabel,nosuid,size=914476k,nr_inodes=228619,mode=755 0 0
tmpfs /dev/shm tmpfs rw,seclabel,nosuid,nodev 0 0
devpts /dev/pts devpts rw,seclabel,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0
mqueue /dev/mqueue mqueue rw,seclabel,relatime 0 0
hugetlbfs/dev/hugetlbfs rw,seclabel,relatime 0
.
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
cgroup /sys/fs/cgroup/net_cls,net_prio cgroup rw,seclabel,nosuid,nodev,noexec,relatime,net_prio,net_cls 0 0
cgroup/sys/fs/cgroup/freezer cgroup rw,seclabel,nosuid,nodev,noexec,relatime,freezer 0 0
c组/sys/fs/c组/hugetlb c组rw,seclabel,nosuid,nodev,noexec,relatime,hugetlb 0 0
cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,seclabel,nosuid,nodev,noexec,relatime,cpuacct,cpu 0 0
c组/sys/fs/c组/CPU组c组rw,seclabel,nosuid,nodev,noexec,relatime,cpuset 0 0
c组/sys/fs/c组/设备c组rw,seclabel,nosuid,nodev,noexec,relatime,设备0 0
cgroup/sys/fs/cgroup/memory cgroup rw,seclabel,nosuid,nodev,noexec,relatime,memory 0 0
c组/sys/fs/c组/blk io c组rw,seclabel,nosuid,nodev,noexec,relatime,blkio 0 0
c组/sys/fs/c组/pids c组rw,seclabel,nosuid,nodev,noexec,relatime,pids 0 0
c group/sys/fs/c group/perf _ event c group rw,seclabel,nosuid,nodev,noexec,relatime,perf_event 0 0
.
这就是通过增加控制c组的,所有的程序都是这样的,子系统上所有的系统都把文件增加上以后,就可以像操作系统一样操作c组和层级树进行管理,包括权限管理、子文件系统,除了c组文件系统以外,内核中没有为c组的访问提供添加其他任何的操作,想要去操作cgroup,就必须使用增加挂到某一个c组控制组内才行。
资源控制操作
我们需要知道每一个硬件资源的具体怎么去控制的操作
如:
c组组中的中央处理器目录里具体的每一项的具体的含义,都是对中央处理器具体的控制的细节
[root @ localhost ~]# CD/sys/fs/cgroup/CPU
[root@localhost cpu]# ls
c组。clone _ children cpuacct。统计CPU。CFS _配额_美国CPU。统计系统。薄片
c组。事件_控制CPU帐户。CPU使用率。rt _ period _ us机器。薄片任务
c组。进程CPU帐户。usage _ percpu CPU。rt _ runtime _ us通知发布用户。薄片
c组。sane _ behavior CPU。CFS _ period _ us CPU。股票发行_代理
这些具体的使用方法会在下一篇文章中来逐个去解释用法
Docker命令行限制内容
-c/- cpu份额:限制中央处理器优先级
-米/-内存:限制内存的使用容量
-内存交换:限制内存交换的大小
-体重
bps/iops
-设备读取-bps
-设备写入-bps
-设备读取iops
-设备写入iops
具体使用方法:cpu、内存、blkio
c组目录结构如下
/sys/fs/cgroup中存放了所有进程的硬件资源控制
/sys/fs/cgroup/{cpu,内存,blkio.}/目录下存放了特定硬件资源的默认的非码头工人进程的控制,码头工人的进程号不会在这些目录下
/sys/fs/cgroup/cpu/docker/目录下存放了码头工人在主机内的进程控制
/sys/fs/cgroup/cpu/docker/容器id/目录下存放了对码头工人产生的容器的控制
到此这篇关于码头工人核心原理之c组详解的文章就介绍到这了,更多相关码头工人核心原理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。