DRF算法
最近在看yarn的一些东西,看到DRF的时候特别纠结为什么第一个选的是B,查了一些资料,尼玛全是从书上扒下来的,千篇一律,没有任何参考价值。后来从mesos的一篇文章中看到,原来第一个选谁都可以,选A选B的结果是一样的。下面记录下调度器先选择A的调度顺序和资源分配情况是怎样的。
DRF简介
DRF是一种通用的多资源的最大最小公平分配策略,其核心思想是在多环境下一个用户的资源分配应该由用户的主导份额的资源决定。主导份额的资源是在所有已经分配给用户的多种资源中,占据最大份额的一种资源。简而言之,DRF试图最大化所有用户中最小的主导份额。
上面那段话从网上扒的,前面都还好,最后一句绕口令一样的总结也是说蒙了不少人。
算法的完整表述
- 初始化系统所拥有的资源总量R
- 初始化已经分配出去的资源总量C
- 初始化应用的主导份额S
- 初始化每个应用所分配到的资源U
- 每次选择已经分配给应用的主导资源占这种资源总量的比例最小的那个应用
- 更新R,C,S,U的值
可能第五步说的有点绕,举个例子,还是拿书中的例子说把,不过这里我们先选择A进行调度:
调度顺序 | User A 使用的资源 | User A主导资源 | User B使用资源 | User B主导资源 | Cpu | RAM |
---|---|---|---|---|---|---|
A | (1/9, 4/18) | 4/18 | (0,0) | 0 | 1/9 | 4/18 |
A | (2/9, 8/18) | 8/18 | (0,0) | 0 | 2/9 | 8/18 |
B | (2/9, 8/18) | 8/18 | (3/9, 1/18) | 3/9 | 5/9 | 9/18 |
B | (2/9, 8/18) | 8/18 | (6/9, 2/18) | 6/9 | 8/9 | 10/18 |
A | (3/9, 12/18) | 12/18 | (6/9, 2/18) | 6/9 | 9/9 | 14/18 |
最后是分配了3个A和2个B,可以看到最后资源的使用情况和分配结果和书上是一样的,也就是说第一次调度优先调度谁对结果没有影响。