yarn on yarn cgroup 资源隔离(cpu篇)

yarn on yarn cgroup 资源隔离(cpu篇),第1张

yarn container 默认不支持对cpu进行资源隔离,一些计算密集型任务甚至可能占满NM节点的cpu资源,从而影响到其他任务的执行效率。

例如申请的1个vcore,实际上又启动了多线程,还有GC线程等都会造成资源使用不可控。

默认情况下,NodeManager 使用 DefaultContainerExecutor 以 NodeManager 启动者的身份来执行启动Container等 *** 作,安全性低且没有任何CPU资源隔离机制。

要达到这种目的,必须要使用 LinuxContainerExecutor ,从而以应用提交者的身份创建文件,运行/销毁 Container。允许用户在启动Container后直接将CPU份额和进程ID写入cgroup路径的方式实现CPU资源隔离。

Cgroup 是linux kernel的一个功能,可以资源进行隔离,Yarn中现在支持对cpu/mem/io三种资源进行隔离。

NodeManager 通过修改 cgroup 的 cpu.cfs_period_us , cpu.cfs_quota_us , cpu.shares 三个文件实现对 cpu 的资源限制,还可以进一步细分为 soft limit 和 hard limit 两种方式。

NodeManager 资源相关配置

nm 所在的物理机 core 数量为 40,cpu limit 设置为 90%,则 nm 上所有 container 的综合 cpu 使用不会超过 3600%

在 yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage 设置为 true 时生效。通过改变 cpu.cfs_quota_us 和 cpu.cfs_period_us 文件控制cpu资源使用的上限。

严格按照任务初始分配的cpu进行限制,即使还有空闲的CPU资源也不会占用。

yarn 是通过降低 cpu.cfs_period_us 的值来实现控制, cpu.cfs_quota_us 固定为1000000。

例如一台4核的虚拟机,VCore 设置为8,启动一个vcore 为 1 的 Container,在 yarn.nodemanager.resource.percentage-physical-cpu-limit 为 100的情况下,使用率不会超过50%

如果将 yarn.nodemanager.resource.percentage-physical-cpu-limit 设置为90,则每个Container的cpu使用率不会超过45%

在 yarn.nodemanager.linux-container-executor.cgroups.strict-resource-usage 设置为 false 时生效,通过 cpu.shares 文件控制资源使用,该参数只能控制资源使用的下限。

按比例对资源进行限制,在这种模式下,允许 Container 使用额外的空闲CPU资源。

有 VCore 分别为 1,1,2 的三个 Container,则 cpu.shares 会被设置为 1024 1024 2048,那么他们可以使用的cpu时间比率为1 : 1 : 2

启动两个应用,每个应用的 Container 的 VCore 都为1,则每个executor都使用100%

启动两个应用,一个应用Container VCore为1,一个应用 Container VCore为2,前者分到的cpu 资源为66%,后者为132%

启动两个应用,一个应用Container vcore为1,一个应用 Container vcore为3,前者分到的cpu 资源为50%,后者为150%

TIPS: 由此可见,任务的可用资源会随着不同的机器负载发生变化

PCore 为8的机器,NM VCore 设置为6,p-limit 设置为50。

同一个任务多次运行,在开启 cgroup 后稳定性有很大的提升,不过速度略有下降,可以通过增加资源的方式解决。

CgroupsLCEResourcesHandler.setupLimits

namespace是一种隔离机制,一个独立的namespace看上去拥有所有linux主机的资源,也拥有自己的0号进程(即系统初始化的进程)。一个namespace可以产生多个子namespace,通过设置clone系统调用的flag可以实现。事实上namespace是为了支持linux container(即linux容器)出现的,运用kernel中的namespace机制和cgroup机制(kernel的配额管理机制)可以实现轻量级的虚拟,即多个虚拟主机(容器)公用宿主机的kernel,彼此之间资源隔离。docker的部分技术也依赖于此。

查看名称空间

[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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7389184.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-05
下一篇 2023-04-05

发表评论

登录后才能评论

评论列表(0条)

保存