IAAS分组调度算法实现
2017-10-18 22:15
120 查看
IAAS分组调度算法实现
问题描述:
iaas平台拿到一个调度申请,大体像这样:请在WEB资源池中,申请100组1主1从的redis服务器,在WEB资源池中,有10台交换机,每台交换机下,可以创建的服务器数量是:[9,1,3,4,8,7,2,5,6,0,20]
为了满足用户HA(高可用)的要求,任意一组redis必须在两个交换机上,另外希望,每一次调度完成以后,可创建的服务器数量尽量均衡,不要出现,某一组交换机下,可创建服务很多,另一个交换机下,可创建服务器很少,甚至为0,这样当用户HA要求更严苛的时候,iaas无法提供资源。
模型抽象:
从数组[x1,x2…..xn]中,按照一组取K个,共M组,怎么取使得满足高可用,同时数组剩余的数量,方差最小。一个简单的思路是
取Top(K);
若min(Top(K)) > 0 ,则全部TOP(K)均减一,M = M-1,重试1.2.;
若min(Top(K)) == 0,M>0,则资源不足,返回失败
若min(Top(K)) > 0,M == 0,调度成功,返回成功,返回剩余资源量;
这个简单的逻辑,可以保证数组的方差稳步下降,保持精度,但是速度太慢,因为TOP(k)每次都减1,其实如果针对:
[99,99,2],申请:80组,1主1从的redis的场景;应该要能很快的拿到申请结果,也就是[80,80,0],但是上边的模型还在慢悠悠的下降,步长为1.
改进
针对上述步长太短的问题,尝试引入步长概念,每次步长按照η=∑k=1KTop(k)/∑k=1Nx(k)
Δ=Min(Min(Top(K))∗η,M)
这个设置是合理的,变化率根据,Top(K)占用的比例,这会保证调度结果以最大速度达到业务要求,但是分配后的数组往往不会是方差最小的
在这里考虑增加一个调节系数:μ所以
η=η∗μ
步长变成了Δ=Δ∗η
测试η=0.2 效果较好
条件放松
针对[40,40,20],25 组1主2从的情况。实际是资源不足的,但是用户现在反馈说,当你变成了[20,20,0],5*3的时候,我也接受你在两组交换机上给我分组,这时候,在这个场景下,分组自动切成2组,然后变成了,7*2组,剩余1个,当你分配结束后,选一个资源最丰富的交换机。代码实现,
代码块语法遵循标准markdown代码,例如:“` python
import numpy as np
def scheduleBySwitch(x,groupNum,k,bonus):
print(“本次迭代的参数:x%s,group–%d,k–%d,bonus–%d”%(x,groupNum,k,bonus))
if np.sum(x) < groupNum * k:
print(“资源不足”)
return
if x.shape[0]== k:
temp = range(k)
else:
temp = np.argpartition(-x, k)
array_index = temp[:k]
topK = x[array_index]
print(“topK”,topK)
mini_topk =np.min(topK)
if mini_topk <1:
if k == 2:
print(“资源不足,failed”)
return
else:
bonus += groupNum * k % (k-1)
groupNum = (groupNum * k) // (k-1)
print(groupNum,k,bonus)
k = k-1
groupNum+=bonus//k
bonus %= k
return scheduleBySwitch(x,groupNum,k,bonus)
sumTopk = np.sum(topK)
sumAll = np.sum(x)
topLimit = np.floor(mini_topk * sumTopk/sumAll * eta).astype(int)
topLimit = max(1,topLimit)
delta=min(topLimit,groupNum)
print(“topLimit”,topLimit)
x[array_index] -= delta
print(“迭代后x–”,x,”步长是:”,delta)
groupNum -= delta
if groupNum < 1:
if max(x) > 0:
x[np.argmax(x)] -= bonus
else:
print(“资源不足”)
print(“succeed:”,x)
return
else:
scheduleBySwitch(x,groupNum,k,bonus)
test = np.array([400,400,200])
eta = 0.1
scheduleBySwitch(test,250,2,0)
本次迭代的参数:x[40 40 20],group–25,k–3,bonus–0
topK [40 40 20]
topLimit 8
迭代后x– [32 32 12] 步长是: 8
本次迭代的参数:x[32 32 12],group–17,k–3,bonus–0
topK [32 32 12]
topLimit 4
迭代后x– [28 28 8] 步长是: 4
本次迭代的参数:x[28 28 8],group–13,k–3,bonus–0
topK [28 28 8]
topLimit 3
迭代后x– [25 25 5] 步长是: 3
本次迭代的参数:x[25 25 5],group–10,k–3,bonus–0
topK [25 25 5]
topLimit 2
迭代后x– [23 23 3] 步长是: 2
本次迭代的参数:x[23 23 3],group–8,k–3,bonus–0
topK [23 23 3]
topLimit 1
迭代后x– [22 22 2] 步长是: 1
本次迭代的参数:x[22 22 2],group–7,k–3,bonus–0
topK [22 22 2]
topLimit 1
迭代后x– [21 21 1] 步长是: 1
本次迭代的参数:x[21 21 1],group–6,k–3,bonus–0
topK [21 21 1]
topLimit 1
迭代后x– [20 20 0] 步长是: 1
本次迭代的参数:x[20 20 0],group–5,k–3,bonus–0
topK [20 20 0]
7 3 1
本次迭代的参数:x[20 20 0],group–7,k–2,bonus–1
topK [20 20]
topLimit 8
迭代后x– [13 13 0] 步长是: 7
succeed: [12 13 0]
相关文章推荐
- 使用Cloudsim实现基于多维QoS的资源调度算法之一:配置Cloudsim环境
- java按时间片轮转进程调度算法实现
- linux中采用用户级线程模拟实现EDF和RMS两种处理机实时调度算法之改进
- 用位图索引技术实现超大规模数据量的分组算法
- 三种进程调度算法的实现
- 操作系统-------进程调度算法(C++实现)
- JAVA简单分组的算法实现
- 分组Top N问题(一) - java实现Top n算法基础
- 五种进程调度的算法实现(二)
- [2017/05/18]操作系统调度算法--最短剩余时间优先算法的模拟实现
- 操作系统进程调度算法(Java 实现)
- 基于LinkedHashMap实现LRU缓存调度算法原理
- 最常见的进程调度算法及其实现
- 操作系统进程调度算法(Java 实现)
- 百度2017年暑假实习生编程题目(第二题)----2、页面调度 在计算机中,页式虚拟存储器实现的一个难点是设计页面调度(置换)算法。其中一种实现方式是FIFO算法。
- IaaS云计算弹性扩展的实现以及算法
- JAVA实现简单分组算法
- 操作系统进程调度算法(Java 实现)
- Python实现调度算法代码详解
- lvs实现负载均衡的三种模型及十种负载调度算法的介绍