关键词:
参考技术A 说起容器监控,首先会想到通过Cadvisor, Docker stats等多种方式获取容器的监控数据,并同时会想到容器通过Cgroups实现对容器中的资源进行限制。但是这些数据来自哪里,并且如何计算的?答案是Cgroups。最近在写docker容器监控组件,在深入Cadvisor和Docker stats源码发现数据都来源于Cgroups。了解之余,并对Cgroups做下笔记。01
Cgroups介绍
Cgroups 是 control groups 的缩写,是Linux内核提供的一种可以限制,记录,隔离进程组(process groups)所使用物理资源的机制。最初有google工程师提出,后来被整合进Linux的内核。因此,Cgroups为容器实现虚拟化提供了基本保证,是构建Docker,LXC等一系列虚拟化管理工具的基石。
02
Cgroups作用
资源限制(Resource limiting): Cgroups可以对进程组使用的资源总额进行限制。如对特定的进程进行内存使用上限限制,当超出上限时,会触发OOM。
优先级分配(Prioritization): 通过分配的CPU时间片数量及硬盘IO带宽大小,实际上就相当于控制了进程运行的优先级。
资源统计(Accounting): Cgroups可以统计系统的资源使用量,如CPU使用时长、内存用量等等,这个功能非常适用于计费。
进程控制(ControlCgroups): 可以对进程组执行挂起、恢复等操作。
03
Cgroups 组成
Cgroups主要由task,cgroup,subsystem及hierarchy构成。下面分别介绍下各自的概念。
task: 在Cgroups中,task就是系统的一个进程。
cgroup: Cgroups中的资源控制都以cgroup为单位实现的。cgroup表示按照某种资源控制标准划分而成的任务组,包含一个或多个子系统。一个任务可以加入某个cgroup,也可以从某个cgroup迁移到另外一个cgroup。
subsystem: Cgroups中的subsystem就是一个资源调度控制器(Resource Controller)。比如CPU子系统可以控制CPU时间分配,内存子系统可以限制cgroup内存使用量。
hierarchy: hierarchy由一系列cgroup以一个树状结构排列而成,每个hierarchy通过绑定对应的subsystem进行资源调度。hierarchy中的cgroup节点可以包含零或多个子节点,子节点继承父节点的属性。整个系统可以有多个hierarchy。
组件之间的关系
Subsystems, Hierarchies,Control Group和Tasks之间有许多的规则,下面介绍下:
1、同一个hierarchy能够附加一个或多个subsystem。
如下图,将cpu和memory subsystems(或者任意多个subsystems)附加到同一个hierarchy。
2、一个subsystem只能附加到一个hierarchy上。
如下图,cpu subsystem已经附加到了hierarchy A,并且memory subsystem已经附加到了hierarchy B。因此cpusubsystem不能在附加到hierarchy B。
3、系统每次新建一个hierarchy时,该系统上的所有task默认构成了这个新建的hierarchy的初始化cgroup,这个cgroup也称为root cgroup。对于你创建的每个hierarchy,task只能存在于其中一个cgroup中,即一个task不能存在于同一个hierarchy的不同cgroup中,但是一个task可以存在在不同hierarchy中的多个cgroup中。如果操作时把一个task添加到同一个hierarchy中的另一个cgroup中,则会从第一个cgroup中移除。
如下图,cpu和memory被附加到cpu_mem_cg的hierarchy。而net_cls被附加到net_cls hierarchy。并且httpd进程被同时加到了cpu_mem_cg hierarchy的cg1 cgroup中和net hierarchy的cg3 cgroup中。并通过两个hierarchy的subsystem分别对httpd进程进行cpu,memory及网络带宽的限制。
4、系统中的任何一个task(Linux中的进程)fork自己创建一个子task(子进程)时,子task会自动的继承父task cgroup的关系,在同一个cgroup中,但是子task可以根据需要移到其它不同的cgroup中。父子task之间是相互独立不依赖的。
如下图,httpd进程在cpu_and_mem hierarchy的/cg1 cgroup中并把PID 4537写到该cgroup的tasks中。之后httpd(PID=4537)进程fork一个子进程httpd(PID=4840)与其父进程在同一个hierarchy的统一个cgroup中,但是由于父task和子task之间的关系独立不依赖的,所以子task可以移到其它的cgroup中。
04
Cgroups使用
我们直接使用shell 命令直接操作hierarchy并设置cgroup参数。在centos6上也可以直接使用libcgroup提供的工具可简化对cgroup的使用。
Create a Hierarchy
使用shell命令创建hierarchy并附加subsystems到该hierarchy上。 作为root为hierarchy创建一个mount point。并且在mount point中包含cgrou的名字。
例如:
接下来使用mount命令去挂载hierarchy并附加一个或多个subsystem到该hierarchy上。
例如:
如果想在已有的hierarchy上attch或detach subsystem,可以使用remount操作,例如我们想detach掉memory subsystem。
Unmounting a Hierarchy
可以直接用umount命令来unmount一个已有的Hierarchy:
例如:
Creating Control Groups
直接使用shell命令mkdir创建一个子cgroup:
例如:
Setting Control Cgroup Parameters
在group1中使用echo命令插入0-1到cpuset.cpus,来限制该cgroup中的tasks只能跑在0和1的cpu core上。如下:
Moving a Process to a Control Group
只要将想要限制的进程PID,追加到想要的cgroup的tasks文件中就可以了。例如:将PID=1701的进程放到“/cgroup/cpu_and_mem/group1/”的cgroup中。
05
Subsystem 介绍
blkio: blkio 子系统控制并监控cgroup中的task对块设备的I/O的访问。如:限制访问及带宽等。
cpu: 主要限制进程的cpu使用率。
cpuacct: 可以统计cgroup中进程的cpu使用报告。
cpuset: 可以为cgroup中的进程分配独立的cpu和内存节点。
memory: 自动生成cgroup中task使用的内存资源报告,并对该cgroup的task进行内存使用限制。
devices: 可以控制进程能否访问某些设备。
net_cls: 使用等级标识符(clssid)标记网络数据包,可允许Linux流量控制程序(tc)识别从具体cgroup中生成的数据包。
freezer: 可以挂起或回复cgroup中的进程。
ns: 可以使不同cgroup中的进程使用不同的namespace。
06
容器使用Cgroups进行资源限制
无论是使用docker run方式直接创建容器,还是通过各类容器编排工具(如:Kubernetes)创建容器,对于容器的限制本质都是通过Cgroups。我们分别使用这两种方式来创建容器并观察cgroups:
测试环境:
使用docker run方式创建容器
1、限制CPU share,创建两个容器,则会在运行该容器宿主的/sys/fs/cgroup/cpu/docker/ 下分别创建两个子cgroup,格式如下。
2、创建一个容器,并设置--cpu-shares参数为:1024*10。
查看该容器cgroup的cpu.shares文件内容如下。
3、创建一个容器,并设置--cpu-shares参数为: 1024*14。
查看该容器cgroup的cpu.shares文件内容如下。
4、两个容器使用cpu的stats,一个容器分到14核的相对cpu计算时间,另一个容器分到10核的相对cpu计算时间:
限制容器内存使用量
1、创建一个容器,限制容器能使用的内存上限为1024M。
2、查看容器memory的stats,内存使用率100%。
3、当容器使用的内存量超过1024M,则容器会被kill -9掉。
使用Kubenetes容器编排工具创建容器
使用kubernetes编排工具创建的容器,则与容器关联的cgroup均在运行该容器宿主机的/sys/fs/cgroup/cpu/kubepods/下,具体的格式如下所示:
使用Pod创建一个容器,对应的yaml文件内容如下:
在运行该容器的宿主机上查看该容器的cgroup信息,会观察到cpu.shares为1核,memory.limit_in_bytes为2G。
相关文章
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/resource_management_guide/ch01
https://www.kernel.org/doc/Documentation/cgroup-v1/cgroups.txt
http://www.infoq.com/cn/articles/docker-kernel-knowledge-cgroups-resource-isolation
转载:浅谈scala中下划线的用途
Scala作为一门函数式编程语言,对习惯了指令式编程语言的同学来说,会不大习惯,这里除了思维方式之外,还有语法层面的,比如 underscore(下划线)就会出现在多种场合,令初学者相当疑惑,今天就来总结下Scala中下划线... 查看详情
浅谈c#委托和事件(转载)
委托给了C#操作函数的灵活性,我们可使用委托像操作变量一样来操作函数,其实这个功能并不是C#的首创,早在C++时代就有函数指针这一说法,而在我看来委托就是C#的函数指针,首先先简要的介绍一下委托的基本知识:委托的... 查看详情
浅谈分支预测流水线与条件转移(转载)
一一个问题原文链接:http://www.cnblogs.com/yangecnu/p/4196026.html#undefined在StackOverflow上有这么一个问题 Whyisprocessingasortedarrayfasterthananunsortedarray? 。例子中,对一个数组进行条件求和,在排序前和排序后,性能有很大的差别。原... 查看详情
转载浅谈tddbdd与atdd软件开发
转载自(此处仅供学习):http://blog.csdn.net/zhenyu5211314/article/details/220332951.首先了解一下这三个开发模式都是什么意思: TDD:测试驱动开发(Test-DrivenDevelopment) 测试驱动开发是敏捷开发中的一项核心实践和技术,也是一... 查看详情
浅谈java中的hashcode方法(转载)
哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率。在Java的Object类中有一个方法:1public native int hashCode(); 根据这个方法的声明可知,该方法返回一个int类型的数值,并且... 查看详情
浅谈java中的深拷贝和浅拷贝(转载)
原文链接:http://blog.csdn.net/tounaobun/article/details/8491392假如说你想复制一个简单变量。很简单: intapples= 5; intpears=apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情 查看详情
浅谈一类积性函数的前缀和(转载)
本文转自:http://blog.csdn.net/skywalkert/article/details/50500009另外,莫比乌斯反演和杜教筛其他可转到 http://blog.leanote.com/post/totziens/%E8%8E%AB%E6%AF%94%E4%B9%8C%E6%96%AF%E5%8F%8D%E6%BC%94 写在前面笔者在刷题过程中遇到一些求 查看详情
浅谈高清显示接口rgblvdsmipiedphdmimini-lvdsv-by-one(转载)
浅谈高清显示接口RGB、LVDS、MIPI、eDP、HDMI、mini-LVDS、V-By-One 标签:hdmi转edprgb转edplvds转edplvds转v-by-onencs8803 近年来随着电子产业的高速发展,智能显示设备也取得了辉煌的成就,高清显示得到了消费者的青睐。目前高清显... 查看详情
浅谈蓝牙低功耗(ble)的几种常见的应用场景及架构(转载)
转载来至beautifulzzzz,网址http://www.cnblogs.com/zjutlitao/,推荐学习蓝牙在短距离无线通信领域占据举足轻重的地位——从手机、平板、PC到车载设备,到耳机、游戏手柄、音响、电视,再到手环、电子秤、智能医疗器械(血糖... 查看详情
转载:浅谈double与float的坑与解决办法(代码片段)
老大说:谁要再用double定义商品金额,就自己收拾东西走先看现象涉及诸如float或者double这两种浮点型数据的处理时,偶尔总会有一些怪怪的现象,不知道大家注意过没,举几个常见的栗子:典型现象(... 查看详情
转载:浅谈double与float的坑与解决办法(代码片段)
老大说:谁要再用double定义商品金额,就自己收拾东西走先看现象涉及诸如float或者double这两种浮点型数据的处理时,偶尔总会有一些怪怪的现象,不知道大家注意过没,举几个常见的栗子:典型现象(... 查看详情
浅谈elk日志分析平台
...uanlan.zhihu.com/p/22104361来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。小编的话“技术干货”系列文章意在分享技术牛人的知识干货,每期主题都不一样哟!期待各位读者在文后发表留言,... 查看详情
浅谈容器监控和网易云计算基础服务实践(代码片段)
本文来自网易云社区docker监控的调研实践docker发展到这么久,涌现了非常多的延伸工具,有的甚至自成一套系统。相信大家都对各类编排工具有所了解。而各类监控方案也都应运而生。linux内核以及cgroup技术其实已经为监控的技... 查看详情
浅谈容器监控和网易云计算基础服务实践(代码片段)
本文来自网易云社区docker监控的调研实践docker发展到这么久,涌现了非常多的延伸工具,有的甚至自成一套系统。相信大家都对各类编排工具有所了解。而各类监控方案也都应运而生。linux内核以及cgroup技术其实已经为监控的技... 查看详情
himi浅谈游戏开发de自学历程!(仅供参考)
李华明Himi 原创,转载务必在明显处注明:转载自【黑米GameDev街区】 原文链接: http://www.himigame.com/himistudy/382.html ☞点击订阅☜ 本博客最新动态!及时将最新博文通知您!很多群友进群之后都会... 查看详情
浅谈es6原生promise
浅谈ES6原生Promise转载作者:samchowgo链接:https://segmentfault.com/a/1190000006708151 ES6标准出炉之前,一个幽灵,回调的幽灵,游荡在JavaScript世界。 正所谓: 世界本没有回调,写的人多了,也就有了})})})})})。 Promise的兴... 查看详情
转载:浅谈double与float的坑与解决办法(代码片段)
老大说:谁要再用double定义商品金额,就自己收拾东西走先看现象涉及诸如float或者double这两种浮点型数据的处理时,偶尔总会有一些怪怪的现象,不知道大家注意过没,举几个常见的栗子:典型现象(... 查看详情
浅谈qmake之propriprfprl文件
浅谈qmake之pro、pri、prf、prl文件转载自:http://blog.csdn.net/dbzhang800/article/details/6348432 尽管每次和cmake对比起来,我们总是说qmake简单、功能少。但是qmake仍然是一个非常复杂的东西,我想大多人应该和我一样吧:不是太清楚CONFIG... 查看详情