Cloudsim 3.0.3中VM调度策略系列类解析(无迁移的策略)
注:本文为旧文的markdown重制版
Cloudsim中VM调度策略类在DataCenter(或PowerDataCenter)创建时需要制定,更是我们在Cloudsim上试验我们的调度算法的核心所在。
CloudSim中给出了VmAllocationPolicy抽象类,还有提供了一个VmAllocationPolicySimple简单调度策略类,本文会对他们进行介绍。
另外,Cloudsim3.0.3中提供了Power系列包(在之前几篇blog中提到的诸如PowerHost, PowerDataCenter等),自然也有对应的Policy类,并且丰富得多。
Power系列包里面有三种Policy:
第一种是PowerVmAllocationPolicyAbstract(继承VmAllocationPolicy)及其子类:是没有迁移的调度策略;提供的接口基本与父类VmAllocationPolicy一致,实现并增加了一些方法。
第二种是PowerVmAllocationPolicyMigrationAbstract(本身继承第一种)及其子类:带有VM迁移的调度策略。
第三种是PowerVmSelectionPolicy及其子类:这个selection是指选择“需要迁移”的VM,所以这些类用来在执行VM migration时选择VM。
本文介绍第一种。
BTW,根据对example6的研究,我发现一旦VM在host上创建成功,会立刻占用主机资源(RAM和Pe),比如2G,4Pe的主机,最多可以创建4台512M,1Pe的VM,再创建就会产生VM创建失败事件。这可能是host内某些策略规定的,比较死板,毕竟实际生产环境不是如此,但确实简化了实验逻辑。
1、abstract class VmAllocationPolicy
继承:无
成员:
- List< ? extends Host> hostList:主机列表,策略本身当然要知晓各host的状况才能为到来的VM分配主机。
主要方法:
构造函数public VmAllocationPolicy(List< ? extends Host> list):就是初始化hostList。
public abstract boolean allocateHostForVm(Vm vm):抽象方法,用来给vm分配主机,主机未指定。
public abstract boolean allocateHostForVm(Vm vm, Host host):抽象方法,用来给vm分配指定的主机。
public abstract List< Map< String, Object>> optimizeAllocation(List< ? extends Vm> vmList):为一堆VM制定分配方案,返回VM->Host映射。
public abstract void deallocateHostForVm(Vm vm):从对应主机上释放VM
public abstract Host getHost(Vm vm);
现在来看一下VmAllocationPolicy的子类VmAllocationPolicySimple,它实现了相关方法,一种简单的调度策略;
1-a、class VmAllocationPolicySimple
继承:父类VmAllocationPolicy
新增成员:
private Map< String, Host> vmTable:VM.id -> host的映射,即全局分配结果
private Map< String, Integer> usedPes:VM.id -> 它所需PE数的映射
private List freePes:一个list,长度和hostList一样,每一个元素对应一个host上的空闲PE数
主要方法:
@Override
public boolean allocateHostForVm(Vm vm):实现了父类的对应方法,即实现为VM寻找并分配一台主机的逻辑。首先,用vmTable判断vm是否已经“有主”,有主就不用做了;否则,遍历freePes列表以寻找一个“最空闲”的主机(空闲Pe最多),尝试分配给它。如果VM在目标主机创建失败(可能是内存不足等原因),就重新遍历,且不再查看失败过的主机。所有host都失败,就return false。这个方法基本体现了Simple的思想——找最闲。@Override
public void deallocateHostForVm(Vm vm):实现父类对应方法,即实现释放某个vm的逻辑。@Override
public boolean allocateHostForVm(Vm vm, Host host) :将vm分配给制定的主机(没有什么策略可言),如果VM创建失败,return false;@Override
public List< Map< String, Object>> optimizeAllocation(List< ? extends Vm> vmList) :在该Simple策略中没有给出实现。
现在来看看Power包里的VM调度策略类们,从父抽象类说起
2、public abstract class PowerVmAllocationPolicyAbstract
继承:父类VmAllocationPolicy
新成员:
- private final Map< String, Host> vmTable:同前
重要方法:
@Override
public boolean allocateHostForVm(Vm vm, Host host):指定了host,同前@Override
public boolean allocateHostForVm(Vm vm):未指定host,先调用findHostForVm(vm)来找一个合适的主机,再调用上面那个方法。public PowerHost findHostForVm(Vm vm):这个方法才是Power系列策略调度的实质(再次说明Power包的编写者应该是另一个家伙),虽然这是抽象类,但这里给了一个简单的寻找合适主机的逻辑:遍历hostList,找到满足资源需求的就分配。
现在来看看它的一个简单实现——PowerVmAllocationPolicySimple
2-a、public class PowerVmAllocationPolicySimple
继承:父类PowerVmAllocationPolicyAbstract
新成员:无,看来只需要vmTable足矣。
重要方法:
- @Override
public List< Map< String, Object>> optimizeAllocation(List< ? extends Vm> vmList):一个空方法,即不做optimization
可以看到,PowerVmAllocationPolicySimple没有重载非常关键的findHostForVm(vm)函数,它沿用了父类(虽然是抽象类)的实现,所以Power包里的Simple含义即FF(First-Fit)调度。
以上都是不支持migration的VM调度策略,另一篇blog会讲述migration所需的selection策略,再讲支持迁移的VM调度策略。