这里写目录标题
一、简介
假设目标是 Kubernetes 中对 pod 的调度优化,通过仿真测试的方式评估调度算法的优劣,算法包括随机调度(RAND)、先来先服务(FCFS)、公平调度(DRF)、模拟退火(SA)。以 RAND 和 FCFS 为基本调度算法,主要分析对比 DRF 和 SA 的优劣。
二、实验设计
2.1.测试环境
采用 java 进行仿真(代码:https://github.com/Happy1215225/Scheduler),对比在单 node 多 pod 的情况下,不同调度算法对资源利用率的影响。以五种 CPU 资源请求量和内存请求量不同的 pod 作为待调度 pod。
POD类型 | CPU request | RAM request |
---|---|---|
a | 1 | 50 |
b | 5 | 30 |
c | 15 | 15 |
d | 30 | 5 |
e | 50 | 1 |
2.2.调度流程
用以上五种 pod 随机组成调度队列,调度算法每次选择一个 pod 进行调度,将 pod 放入 node 中,node 将分配 pod 其对应请求资源。调度完成的 pod 将移出队列,再选择新的 pod 进行调度,直到 node 再也无法装下任何一个 pod 为止。
假设 node 节点的 cpu 总资源量和 ram 总资源量相同,以 50 为间隔,分别设置 node 节点资源为 50~2500,进行 50 次测试,以分析在不同 node 资源的情况下不同算法的资源利用率。
2.3.待测算法
2.3.1 随机调度(RAND)
随机调度,每次从队列中随机选取 pod 进行调度。该调度算法只作为评价其他算法的参考。
2.3.2 先来先服务(FCFS)
每次从队列中选取最先进入队列的 pod 进行调度;
2.3.3 绝对公平调度(DRF)
DRF 算法,每次从队列中选取主导资源占比最低的 pod 进行调度。在介绍 DRF 算法之前,先介绍 Max-min Fairness (最大化最小公平算法)和主导资源的概念。
2.3.3.1 Max-min Fairness
假设我们将一个资源分配给多个用户,我们要公平的将资源分配给每一个用户,也就是说每个用户获取资源的权利是相等的。但是很多时候,有一些用户并不需要别的用户那么多的资源。我们采用最大最小化公平策略,也即满足每个用户的最小需求,并将多余的资源分配给其他的用户。
最大最小公平分配算法的形式化定义如下:
- 资源按照需求递增的顺序进行分配
- 不存在用户得到的资源超过自己的需求
- 未得到满足的用户等价的分享资源
举个例子:有一四个用户的集合,资源需求分别是2,2.6,4,5,其资源总能力为 10,为其计算最大最小公平分配。
解决方法:我们通过几轮的计算来计算最大最小公平分配。第一轮,我们暂时将资源划分成 4 个大小为 2.5 的。由于这超过了用户 1 的需求,这使得剩了 0.5 个均匀的分配给剩下的 3 个人资源,给予他们每个 2.66。这又超过了用户 2 的需求,所以我们拥有额外的 0.066… 来分配给剩下的两个用户,给予每个用户 2.5+0.66…+0.033…=2.7。因此公平分配是:用户 1 得到 2,用户 2 得到 2.6,用户 3 和用户 4 每个都得到 2.7。
2.3.3.2 主导资源(Dominant Resource)
对一个用户所有资源类型分配的最多的分配叫做主导分配,与之对应的资源就是主导资源。那么不同用户的主导资源可能是不同的。比如对 CPU 繁忙型作业来说,它的主导资源就是 CPU;而对于 I/O 繁忙型作业,主导资源就是内存。DRF 只在每个主导资源上进行最大化最小分配。
2.3.3.3 DRF
DRF 认为,Max-min 虽然在公平调度方面做了大量的拓展,但是仍然局限于单一的资源分配。DRF 是 Max-min 算法在多资源环境下的拓展。DRF 算法满足以下四个特性:
- 共享激励(Sharing incentive):相比每个用户只使用自己的集群分区,用户之间共享集群是更好的选择。考虑一个具有相同节点和n个用户的集群。如果不共享集群的话,用户就不能在一个由所有资源的 1/n 的组成的集群分区中分配更多的任务。
- 防护策略(Strategy-proofness):用户不能通过谎报资源的方式去获取更多的资源分配。
- 无嫉妒(Envy-freeness):一个用户不会更喜欢另一个用户的分配,即自己得到的分配永远是对自己而言最佳的。这一属性体现了公平的概念。
- 帕累托效率(Pareto efficiency):从一种分配状态到另一种状态的变化中,在没有使任何用户境况变坏的前提下,使得至少一个用户变得更好,这就是帕累托改进或帕累托最优化。当一个状态下不在存在任何帕累托改进的可能时,即达到了帕累托效率,或帕累托最优。
DRF 算法流程如下:
我们假设一个拥有资源 9CPUs,18GB RAM 的系统,用户 A 的 task 需要资源为 <1 CPU,4 GB RAM>,则用户 A 的资源占比分别为 CPU 1/9,RAM 2/9,则用户 A 的主导资源就是 RAM。用户 B 的 task 需要资源 <3CPUs, 1GB RAM>,则用户 B 的主导资源为 CPU。最后 DRF 要求的结果就是平等权利的用户的主导资源占的份额是一样的,在这个基础上,尽可能最大化给每个用户的分配。分配给 A<3CPUs,12GB RAM> 运行 3 个 task;分配给 B<6CPUs,2GB> 资源可以运行两个 task。这样 A 的主导资源占的份额为 12/18=2/3,B 的主导资源占比 6/9 = 2/3。
我们模拟一下分配过程:在最开始,系统首先选择B执行任务。那么 B 的资源占比就变为了&