您的位置:首页 > 其它

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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iaas 调度算法