本文的最初目的是介绍一种Hadoop部署资源隔离和线程调度的解决方案。 现在,我们来介绍一下容器和容器集群管理。
回到线程,CPU和内存之间是分离的。 CPU基于cgroups,内存可以自行计算ru_maxrss。 我还比较了k8n的隔离性。 它的内存和CPU是基于cgroup的。 关于调度,yarn引入了两种调度机制:Capacity Scheduler和Fair Scheduler。
总体:https://segmentfault.com/a/11...
yarn
yarn是Hadoop的资源隔离和调度
在YARN中运行的好处:
集群部署多个版本的计算资源,以按需扩展和混合具有不同负载的应用程序。 集群利用率高,底层存储共享,避免集群间数据迁移
两层资源调度
RM
负责创建AM,接收分配请求上午。 有一个调度器(上面提到的调度算法插件放在这里),负责计算ASM(AM Allocation)
AM
Allocation(每个容器的大小,容器数量)I将要。 )/监控/容错。 一个容器执行一项任务,AM可以将多个任务分配给自己的内部任务。
1. 应用于 RM 并在容器内启动 AM(只是一个 Java 对象、虚拟的、指定的资源大小、启动时运行任务的 bin 文件等)
包含异步分配的资源暂时存储在缓冲区中并等待 AM 执行。 获得
2。 AM RPC获取资源并与NM通信
AM获取资源后的任务分配不是线程的事情,可以由用户自己实现
3.各种状态同步包含。 例如7,连续nm到rm。
隔离
目前只能实现CPU和内存隔离
基于cgroups
linux /kernel/cgroup,包括子系统:cpu、io、mmemory、net等。
内核代码位于kennel中。在下面。
用户使用:通过文件系统配置(由内核提供给用户)
VFS 文件:ext2、ext3 磁盘、套接字、cgroup。 操作系统实现后,可以通过mount
vi /etc/cgconfig.conf挂载到cgroups文件系统。 只需在/sys/fs/cgroup/cpuset中设置即可
Cgroup不直接用于内存
内存隔离:线程监视进程中的内存量,一旦超出限制则不强制执行不会完成。 长寿
仅 JVM 是不够的。 每个任务不仅有Java进程,还使用C++进行约简。
简单的cgroup不能直接在内存树中配置
Linux中的所有进程都是通过fork()复制来实现的。 为了减少进程创建时的堆栈消耗和性能影响,Linux 使用写时复制机制来快速创建进程。 也就是说,子进程刚创建的时候,它的栈空间和父进程一模一样,所以从一开始就和父进程有相同的ru_maxrss。 如果父进程的ru_maxrss比较大,即使触发copy-on-write后更新了子进程实际使用的最大驻留集大小,得到的最大rusage计算值是: 仍然是父进程的值。 即无法获取子进程实际使用的内存。 。
Java在创建子进程时使用“fork() + exec()”解决方案。 当子进程启动时,其内存使用量与其父进程相同。 exec函数是将当前进程的使用权传递给另一个程序的函数。 此时进程原有的执行栈和其他所有数据都被丢弃,因此ru_maxrss也被清除并计算,子进程的内存恢复正常。 这意味着容器(子进程)创建过程中,内存使用量可能会超出预定义的限制(取决于父进程,即NodeManager的内存使用量)。 这时候如果用Cgroup来隔离内存资源,这个容器就可能被“干掉”。
我们有,但是可以获取每个容器的进程树的内存使用量(物理内存、虚拟内存),但是进程树的内存使用量(物理内存、虚拟内存)是否超过了内存使用量(物理内存、虚拟内存)呢?无法仅通过使用来决定是否“杀死”容器 上限。 由于“子进程”的内存使用情况是“波动的”,为了避免“意外终止”,Hadoop给每个进程赋予了一个“age”属性,该属性指定新启动的进程的age为1。指定MonitoringThread线程每次都会更新。 每个进程的运行时间加一。 基于此,选择“强制退出”容器的标准是: 如果容器对应的进程树中所有进程(age大于0)的总内存(物理或虚拟内存)超过上限的两倍。 或者,如果年龄大于 1 的所有进程的总内存(物理或虚拟内存)使用量超过限制,则认为容器使用了过多的内存,可能会被“杀死”。 (注:这里的容器通常指的是容器进程树)
fork/exec/thread/process在单独的文章中:xx
调度
1. 它可以占用闲置资源。 容量调度器DefaultResourceCalculator(以使用点数少者为准)、drf
2.均匀分布的公平调度器支持fair、fifo和drf。
两者都选择队列、应用程序和容器,并从根(递归到叶容器)分配资源。 每个选择的理由都不同。
容量调度程序
容量调度程序在比较资源使用情况时使用不同的资源比较器来以不同方式定义资源。 默认为DefaultResourceCalculator,仅考虑内存资源。 另一个是DominantResourceCalculator,它使用DRF比较算法,同时考虑内存和CPU资源。 DRF:每个计算资源的最大分配。 选择最大点中最小的点资源分配
考虑一个具有 9 个 CPU、18GB 和 2 个用户的系统。 用户A的每个任务需要(1CPU,4GB)资源。 用户B的每个任务需要(3CPU,1GB)资源。 最终A分配3股,B分配2股。
公平调度器
公平比较:
如果急需s2则由于资源不足,急需s1则不需要资源。 ,把资源给s2
如果s1和s2都急需资源,就把资源给minShareRatio。 较小,minShareRatio1 = 已用内存/最小资源保证
如果s1和s2都急需资源,则useToWeightRatio较小,useToWeightRatio = 已用内存/容器权重
容器概述/资源隔离与调度技术
命名空间技术用于提供进程之间的隔离。 Linux 命名空间有六种类型:mount 命名空间、uts 命名空间、ipc 命名空间、pid 命名空间和网络命名空间。 ,用户命名空间。 用于组合挂载点、UTS(主机名、域名)、IPC资源、进程、网络、用户等。 该资源提供进程级隔离。 作为正常进程,容器使用命名空间技术来隔离自身。
pivot_root 切换根文件系统。 mount –bind /etc /tmp/test/etc 方法允许你从其他地方访问任何文件或目录,但其他用户仍然可以看到这些挂载点,并且挂载命名空间允许你可以用 . 尽管如此,由于目前没有用于文件/目录的进程间隔离的命名空间,因此您需要创建一个根文件系统并使用pivot_root命令在容器中替换它(注意:chro(不仅仅是在指定的根文件系统上运行命令)。
cgroups技术用于限制CPU、内存、存储、网络等资源。
AUFS文件系统采用CoW写时复制技术来组合多个文件系统。 转到挂载点。 这为容器启用了只读基础镜像和可写镜像,从而减小了镜像的大小。 体积。
早期版本的chroot(目录隔离)
虚拟机(一个独立的系统,通过hypervisor将硬件页面指向VM,并对VM进行hypercall调用并(负责硬件)
LXC(相比虚拟机,不需要带多个操作系统)共享操作系统越多,节省的就越多,这就是docker的基础)
内核命名空间(ipc、uts、mount、pid、网络、用户)
Apparmor 和 SELinux 配置文件
Seccomp 策略
Chroots(使用 hub_root)
内核功能
CGroups(控制组)
docker(基于lxc(无调度分配集群管理),详细信息https://stackoverflow.com/que ...:应用程序容器、镜像、AUFS可跨机器/平台移植(增量更改、自动应用程序部署), rkt(k8s降低了Docker的技术门槛,k8s可以集成任何只要支持的容器)。 可以运行在虚拟机上
资源隔离调度/容器编排管理
来自JobTracker第一版的单进程资源分配,源自h采用。
第二版Borg(Google,未发布)/yarn/mesos(twitter)以及另外两个层(单个master负责整体分配,多个Secondary各框架层负责监控等)。不知道集群范围内的资源使用情况,只是被动地从主节点接收资源,主节点将可用资源推送到每个框架)
Omega (Google) 第三版的去中心化、集群信息共享和乐观锁定,集群应用变化太快时性能会下降(http://dockone.io/article/1153)
上面的容器本身是抽象安排的。 隔离和调度可以为这些容器提供隔离和固定大小。 分配。 可以与docker等容器(反复隔离)配合使用进行调度和部署。 Docker是运行时隔离和镜像
k8s专注于调度和部署,需要针对特定容器。 它可以用作 Docker 编排管理器,也用于许多 Docker 应用程序中。
容器编排与管理、容器互联,只要支持k8s(Google是基于Omega的,开发者基本来自Omega和Borg)、pod组合等
其实就可以使用任何 k8s、yarn 来部署和控制您的 Docker 资源配置。
国内的百度云、腾讯云都有自己的实现,比如百度的Matrix。 类似于Borg
Cloud
云计算和云存储的思想是一个大规模的分布式环境,根据用户请求返回按需计算费用:云计算服务是按需付费的。 一种模型,提供对可配置计算资源共享池(资源包括网络、服务器、存储、应用软件和服务)的可用、方便、按需网络访问
云计算可以被认为包括以下级别:服务: 基础设施即服务 (IaaS)、平台即服务 (PaaS) 和软件即服务 (SaaS)
许多分发副本和各种版本控制升级(在需要时), docker提供了一种减少运维的方法(Iaas+升级等管理工具也是如此)。 虚拟技术和容器管理为虚拟技术和容器提供了多种能力。租户隔离和调度。
云可以使用虚拟机来节省硬件。 您可以直接在私有云中使用 docker 和 k8s,从而节省硬件和操作系统的使用量。 虚拟机和Docker也可以适当超卖。 由于迁移方便,超卖Docker的成本很低,而迁移虚拟机的成本则显得很高。 在提供虚拟机的同时,还可以提供k8s+docker服务,所以k8s本质上是完全基于cgroups的。 然而,对于未压缩的资源,例如内存/磁盘,没有它就无法使用,会添加一个阈值以防止不稳定,低于该阈值的资源可以分配。 这无意中增加了 k8s 内存限制并阻止它在 fork 时被处理。
https://juejin.im/post/5b3d8c...
评论前必须登录!
注册