yarn 容器资源隔离和docker容器资源隔离实现原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了yarn 容器资源隔离和docker容器资源隔离实现原理相关的知识,希望对你有一定的参考价值。

参考技术A 查看名称空间
[namespace_id]

Cgroups 提供了以下四大功能:
1、资源限制(Resource Limitation):cgroups 可以对进程组使用的资源总额进行限制。如设定应用运行时使用内存的上限,一旦超过这个配额就发出 OOM(Out of Memory)。
2、优先级分配(Prioritization):通过分配的 CPU 时间片数量及硬盘 IO 带宽大小,实际上就相当于控制了进程运行的优先级。
3、资源统计(Accounting): cgroups 可以统计系统的资源使用量,如 CPU 使用时长、内存用量等等,这个功能非常适用于计费。
4、进程控制(Control):cgroups 可以对进程组执行挂起、恢复等操作。

Docker正是使用cgroup进行资源划分,每个容器都作为一个进程运行起来,每个业务容器都会有一个基础的 pause容器 也就是POD作为基础容器。pause容器提供了划分namespace的内容,并连通同一POD下的所有容器,共享网络资源。

1.CPU:使用调度程序为cgroup任务提供 CPU 的访问。
2.cpuacct:产生cgroup任务的 CPU 资源报告。
3.cpuset:如果是多核心的CPU,这个子系统会为cgroup任务分配单的CPU和内存。
4.devices:允许或拒绝cgroup任务对设备的访问。
5.freezer:暂停和恢复cgroup任务。
6.memory:设置每个cgroup 的内存限制以及产生内存资源报告。
7.net_cls:标记每个网络包以供 cgroup方便使用。
8.ns:命名空间子系统。
9.perf event:增加了对每个group的监测跟踪的能力,可以监测属于某个特定的group 的所有线程以及运行在特定CPU上的线程。

如图所示的 CGroup 层级关系显示,CPU 和 Memory 两个子系统有自己独立的层级系统,而又通过 Task Group 取得关联关系。

资源调度和资源隔离是YARN作为一个资源管理系统,最重要和最基础的两个功能。

1、内存资源隔离

原文链接: https://blog.csdn.net/chen892704067/article/details/76596225

为了避免误杀Container,Hadoop赋予每个进程 年龄 属性,并规定刚启动进程的年龄是1,且MonitoringThread线程每更新一次,各个进程年龄加一
在此基础上,选择被杀死Container的标准如下:

2、cpu资源隔离
Yarn 3.0 版本中,在 Linux 系统环境下,ContainerExecutor 有两种实现:
1、 DefaultContainerExecutor : 简称 DCE , 如其名,是默认的 ContainerExecutor 实现。 如果用户未指定 ContainerExecutor 的具体实现,NM 就会使用它。 DCE 直接使用 bash 来启动 container 进程,所有 container 都使用 NM 进程用户 (yarn) 启动,安全性低且没有任何CPU资源隔离机制。
2、 LinuxContainerExecutor : 简称 LCE,相比于 DCE ,它能提供更多有用的功能,如用户权限隔离,支持使用提交任务用户来启动 container;支持使用 cgroup 进行资源限制; 支持运行 docker container (合并了2.x 版本中的 DockerContainerExecutor)。 LCE 使用可执行的二进制文件 container-executor 来启动 container 进程,container 的用户根据配置可以统一使用默认用户,也可以使用提交任务的用户(需要提前在 NM 上添加所有支持的用户),从而以应用提交者的身份创建文件,运行/销毁 Container,允许用户在启动Container后直接将CPU份额和进程ID写入cgroup路径的方式实现CPU资源隔离。
YARN使用了Cgroups子系统中的CPU和Memory子系统,CPU子系统用于控制Cgroups中所有的进程可以使用的CPU时间片。Memory子系统可用于限定一个进程的内存使用上限,一旦超过该限制,将认为它为OOM,会将其杀死。

对于内存资源隔离,YARN采用了与MRv1这种基于线程监控的资源控制方式,这样做到的主要出发点是:这种方式更加灵活,且能够防止内存骤增骤降导致内存不足而死掉。
对于CPU资源隔离,YARN采用了轻量级的Cgroups。
注:默认情况下,NM未启用任何CPU资源隔离机制,如果想要启用该机制,需使用LinuxContainerExecutor,它能够以应用程序提交者的身份创建文件,运行Container和销毁Container.

Linux内核提供namespace完成隔离,Cgroup完成资源限制。namespace+Cgroup构成了容器的底层技术(rootfs是容器文件系统层技术)

参考
https://blog.csdn.net/zhangzhebjut/article/details/37730013
https://www.cnblogs.com/janeysj/p/11274515.html
https://www.xiaoheidiannao.com/220959.html
https://developer.aliyun.com/article/446778
https://segmentfault.com/a/1190000019016039
https://smarthanwang.github.io/2019/10/12/yarn-container-executor/
https://www.jianshu.com/p/b9245242472b/
https://www.shuzhiduo.com/A/6pdDYYNGzw/
https://www.jianshu.com/p/8f700177d4e4
https://www.cnblogs.com/biyeymyhjob/archive/2012/07/20/2601655.html
https://blog.csdn.net/chen892704067/article/details/76596225

以上是关于yarn 容器资源隔离和docker容器资源隔离实现原理的主要内容,如果未能解决你的问题,请参考以下文章

Docker学习笔记Docker容器相关技术

白话 Linux 容器资源的隔离限制原理

Docker容器的安全

Yarn的资源调度与隔离

docker入门

docker入门LXCwindows container 和 Hyper知识基础实用情况