docker中如何理解cgroups


这篇文章将为大家详细讲解有关docker中如何理解cgroups,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。理解docker,主要从namesapce,cgroups,联合文件,运行时(runC),网络几个方面。接下来我们会花一些时间,分别介绍。namesapce主要是隔离作用,cgroups主要是资源限制,联合文件主要用于镜像分层存储和管理,runC是运行时,遵循了oci接口,一般来说基于libcontainer。网络主要是docker单机网络和多主机通信模式。Cgroup是control group的简写,属于Linux内核提供的一个特性,用于限制和隔离一组进程对系统资源的使用,也就是做资源QoS,这些资源主要包括CPU、内存、block I/O和网络带宽。Cgroup从2.6.24开始进入内核主线,目前各大发行版都默认打开了Cgroup特性。
Cgroups提供了以下四大功能:资源限制(Resource Limitation):cgroups可以对进程组使用的资源总额进行限制。如设定应用运行时使用内存的上限,一旦超过这个配额就发出OOM(Out of Memory)。优先级分配(Prioritization):通过分配的CPU时间片数量及硬盘IO带宽大小,实际上就相当于控制了进程运行的优先级。资源统计(Accounting): cgroups可以统计系统的资源使用量,如CPU使用时长、内存用量等等,这个功能非常适用于计费。进程控制(Control):cgroups可以对进程组执行挂起、恢复等操作。cgroup 控制组 。cgroup 是对进程分组管理的一种机制,一个cgroup包含一组进程,并可以在这个cgroup上增加Linux subsystem的各种参数的配置,将一组进程和一组subsystem的系统参数关联起来。subsystem 子系统。subsystem 是一组资源控制的模块。这块在下面会详细介绍。hierarchy 层级树。hierarchy 的功能是把一组cgroup串成一个树状的结构,一个这样的树便是一个hierarchy,通过这种树状的结构,Cgroups可以做到继承。比如我的系统对一组定时的任务进程通过cgroup1限制了CPU的使用率,然后其中有一个定时dump日志的进程还需要限制磁盘IO,为了避免限制了影响到其他进程,就可以创建cgroup2继承于cgroup1并限制磁盘的IO,这样cgroup2便继承了cgroup1中的CPU的限制,并且又增加了磁盘IO的限制而不影响到cgroup1中的其他进程。
cgroup中实现的子系统及其作用如下:devices:设备权限控制。cpuset:分配指定的CPU和内存节点。cpu:控制CPU占用率。cpuacct:统计CPU使用情况。memory:限制内存的使用上限。freezer:冻结(暂停)Cgroup中的进程。net_cls:配合tc(traffic controller)限制网络带宽。net_prio:设置进程的网络流量优先级。huge_tlb:限制HugeTLB的使用。perf_event:允许Perf工具基于Cgroup分组做性能监测。每个子系统的目录下有更详细的设置项,例如:
cpu

除了限制 CPU 的使用量,cgroup 还能把任务绑定到特定的 CPU,让它们只运行在这些 CPU 上,这就是 cpuset 子资源的功能。除了 CPU 之外,还能绑定内存节点(memory node)。
在把任务加入到 cpuset 的 task 文件之前,用户必须设置 cpuset.cpus 和 cpuset.mems 参数。cpuset.cpus:设置 cgroup 中任务能使用的 CPU,格式为逗号(,)隔开的列表,减号(-)可以表示范围。比如,0-2,7 表示 CPU 第 0,1,2,和 7 核。cpuset.mems:设置 cgroup 中任务能使用的内存节点,和 cpuset.cpus 格式一样。memory 香港云主机
memory.limit_bytes:强制限制最大内存使用量,单位有k、m、g三种,填-1则代表无限制。memory.soft_limit_bytes:软限制,只有比强制限制设置的值小时才有意义。填写格式同上。当整体内存紧张的情况下,task获取的内存就被限制在软限制额度之内,以保证不会有太多进程因内存挨饿。可以看到,加入了内存的资源限制并不代表没有资源竞争。memory.memsw.limit_bytes:设定最大内存与swap区内存之和的用量限制。填写格式同上。这里专门讲一下监控和统计相关的参数,比如cadvisor采集的那些参数。memory.usage_bytes:报告该 cgroup中进程使用的当前总内存用量(以字节为单位)。memory.max_usage_bytes:报告该 cgroup 中进程使用的最大内存用量。创建一个容器验证Docker是否为此容器放置了一些cgroup一般在安装k8s的过程中经常会遇到如下错误:
其实此处错误信息已经很明白了,就是docker 和kubelet指定的cgroup driver不一样。 docker
支持systemd和cgroupfs两种驱动方式。通过runc代码可以更加直观了解。
cgroup 只能限制 CPU 的使用,而不能保证CPU的使用。也就是说, 使用
cpuset-cpus,可以让容器在指定的CPU或者核上运行,但是不能确保它独占这些CPU;cpu-shares
是个相对值,只有在CPU不够用的时候才其作用。也就是说,当CPU够用的时候,每个容器会分到足够的CPU;不够用的时候,会按照指定的比重在多个容器之间分配CPU。对内存来说,cgroups 可以限制容器最多使用的内存。使用 -m 参数可以设置最多可以使用的内存。关于cgroups在runc的代码部分,大家可以点击进去详细阅读。这边我们只讲一个大概。
首先container的创建是由factory调用create方法实现的,而cgroup相关,factory实现了根据配置文件cgroup drive驱动的配置项,新建CgroupsManager的方法,systemd和cgroupfs两种实现方式:抽象cgroup manager接口。接口如下:在创建container的过程中,会调用上面接口的方法。例如:
在container_linux.go中,接下来我们重点讲一下fs的实现。
在fs中,基本上每个子系统都是一个文件,如上图。重点说一下memory.go,即memory子系统,其他子系统与此类似。
关键方法:通过d.path(“memory”)查找到cgroup的memory路径d.join(“memory”),将pid写到memory路径下关于docker中如何理解cgroups就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

相关推荐: PHP中怎么过滤敏感词

这篇文章将为大家详细讲解有关PHP中怎么过滤敏感词,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解 香港云主机。1、敏感词过滤方法2、调用方法关于PHP中怎么过滤敏感词就分享到这里了,希望以上内容可以对大家有一定的…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 08/12 16:12
下一篇 08/12 16:13

相关推荐