Cloudsim 3.0.3中VM调度策略系列类解析(带迁移的策略)

注:本文为旧文的markdown重制版

Cloudsim中VM调度策略类在DataCenter(或PowerDataCenter)创建时需要制定,更是我们在Cloudsim上试验我们的调度算法的核心所在。

CloudSim中给出了VmAllocationPolicy抽象类,还有提供了一个VmAllocationPolicySimple简单调度策略类,其介绍见前一篇关于“无迁移”VM放置策略的blog。

另外,Cloudsim3.0.3中提供了Power系列包(在之前几篇blog中提到的诸如PowerHost, PowerDataCenter等),自然也有对应的Policy类,并且丰富得多。Power系列包里面有三种Policy:

第一种是PowerVmAllocationPolicyAbstract(继承VmAllocationPolicy)及其子类:是没有迁移的调度策略;提供的接口基本与父类VmAllocationPolicy一致,实现并增加了一些方法。

第二种是PowerVmAllocationPolicyMigrationAbstract(本身继承第一种)及其子类:带有VM迁移的调度策略。

第三种是PowerVmSelectionPolicy及其子类:这个selection是指选择“需要迁移”的VM,所以这些类用来在执行VM migration时选择VM。

第一种策略不支持迁移,与与父类VmAllocationPolicy基本上一致,在上一篇blog中介绍了。

本文要介绍带有迁移行为的策略,即第二种;而带迁移的VM调度策略的实现需要vm selection策略的支持(即第三种),所以先介绍第三种——VM selection策略

(编号续上一篇博客)

3、public abstract class PowerVmSelectionPolicy

继承:无

成员:无

重要方法

  • public abstract Vm getVmToMigrate(PowerHost host):在host主机上找一个合适的VM准备迁移,是抽象方法,在该抽象类中无实现;

  • protected List getMigratableVms(PowerHost host):有实现,用来在host上获取可迁移的Vm(必须是PowerVm),可迁移=不处在迁移状态

本文选择一个有代表性的VM selection策略的实现——PowerVmSelectionPolicyMinimumUtilization来介绍

3-a、public class PowerVmSelectionPolicyMinimumUtilization

继承:public abstract class PowerVmSelectionPolicy

增加的成员:无

重要方法

  • @Override
    public Vm getVmToMigrate(PowerHost host):首先获取host上可迁移的vm列表,在该列表中遍历vm,最终返回CPU利用率最低的那个vm。

选择完该迁移的VM后,就是要选择目标主机并完成迁移操作,这些内容包含在PowerVmAllocationPolicyMigrationAbstract及其子类中。


4、public abstract class PowerVmAllocationPolicyMigrationAbstract

继承:PowerVmAllocationPolicyAbstract,也就是说分配策略也有所实现

增加的成员

  • private PowerVmSelectionPolicy vmSelectionPolicy:采用的VM selection策略

  • private final List< Map< String, Object>> savedAllocation:存储vm -> host的映射列表

  • private final Map< Integer, List< Double>> utilizationHistory:

  • private final Map< Integer, List< Double>> metricHistory:

  • private final Map< Integer, List< Double>> timeHistory:

  • private final List< Double> executionTimeHistoryVmSelection:记录vm selection操作的用时

  • private final List< Double> executionTimeHistoryHostSelection:记录host selection操作的用时

增加的重要方法

  • @Override
    public List< Map< String, Object>> optimizeAllocation(List< ? extends Vm> vmList):重载了父类方法,实现VM迁移计划的制定(PowerDC.updateCloudletProcess(…)根据其返回的migrationMap进行实质性的VM迁移操作)。该方法的过程大致是:先调用getOverUtilizedHosts()获取过载的主机,再调用getVmsToMigrateFromHosts(overhosts)从这些过载主机上获取适合被迁出的VM列表,然后调用getNewVmPlacement(vmsToMigrate, overUtilizedHosts)来进行过载主机上上的VM迁移(填写迁移列表migrationMap),再接着调用getMigrationMapFromUnderUtilizedHosts()来进行“过闲”主机上的VM迁移(补充迁移列表migrationMap);该函数中没有实际迁移VM,没有修改全局的savedAllocation,最终该函数返回迁移列表migrationMap。

  • protected List< Map< String, Object>> getMigrationMapFromUnderUtilizedHosts(
    overUtilizedHosts):该方法的功能是返回一个migrationMap,是制定从“过闲”主机上迁移VM到其它主机的迁移方案。传入参数是过载主机列表(有点奇怪),但其作用是作为“被排除元素”,即VM不会从上面被迁出(因为该函数只处理“过闲”主机)和迁入(这是自然)。 该方法的过程大致是:先建立两个excluded列表(不可迁出列表、不可迁入列表),两个列表都初始化为过载主机+关闭的主机;接下来该方法循环调用getUnderUtilizedHost()方法来获得“过闲”主机对象,并调用getVmsToMigrateFromUnderUtilizedHost(underUtilHost)方法获得该主机上适合迁移的VM对象,再调用getNewVmPlacementFromUnderUtilizedHost(vm, 不可迁入列表)来获得最终的调度方案并加入migrationMap中。值得一提的是,每个“过闲”主机只被处理一次就被放进不可迁出列表,即一台主机只能最多迁出一台VM。

  • protected abstract boolean isHostOverUtilized(PowerHost host):看样子是用来判断主机是否过载,是个抽象方法,没有实现

  • public PowerHost findHostForVm( Vm vm, Set< ? extends Host> excludedHosts):为vm寻找一个最佳主机,最佳=vm在其上功耗最小=放置vm前后功耗差最小。遍历主机列表时,首先跳过在excludedHosts里的主机以及放置vm会导致过载的主机(利用getPowerAfterAllocation(vm, PowerHost)来判断),遍历完后找到最佳主机并返回。

  • @Override
    public PowerHost findHostForVm(Vm vm)
    :通过调用上面的方法来寻找最佳主机。vm现在无主时,等同于上面那个方法;有主时,自然要exclude掉现在的宿主机。

  • protected boolean isHostOverUtilizedAfterAllocation(PowerHost host, Vm vm):用来判断vm放置到目标主机是否会导致过载。过程:调用host.vmCreate(vm)在host上创建vm(只创建,无事件),判断是否过载(利用isHostOverUtilized(host)),再调用host.vmDestroy(vm)销毁vm。

  • protected List extractHostListFromMigrationMap(List< Map< String, Object>> migrationMap):从传入的migrationMap中提取主机列表;

  • protected List< Map< String, Object>> getNewVmPlacement( vmsToMigrate,
    excludedHosts) :为传入的VM列表制定放置计划。该方法的大致过程是:先按CPU利用率(in MIPS)降序排列vm列表,然后遍历该vm列表,调用findHostForVm(vm,excludedHosts)获得分配方案。

  • protected List< Map< String, Object>> getNewVmPlacementFromUnderUtilizedHost( vmsToMigrate,excludedHosts) :名不副实,该方法与“过闲”主机无关,该方法基本等同于上面那个方法,不过更加科学,增加了一个判断:如果vmsToMigrate中有一个vm放置失败,则取消当前整个放置方案,即不会有副作用。

  • protectedList< ? extends Vm>
    getVmsToMigrateFromHosts(Hosts) :从指定的hosts列表中获取适合迁出的VM列表,主要就是借助PowerVmSelectionPolicy类。过程是:遍历传入的Hosts列表,调用getVmSelectionPolicy().getVmToMigrate(host)来逐个主机的寻找适合迁出的VM。

  • protected List< ? extends Vm> getVmsToMigrateFromUnderUtilizedHost(host):从目标主机(针对过闲的,该想办法关机的)中获取适合迁出的VM,该方法返回host上所有的VM,除了已经在迁移的。

  • protected List< PowerHostUtilizationHistory> getOverUtilizedHosts():获取过载主机列表,自然是借助isHostOverUtilized(host)方法(该方法要在子类中实现),这里返回的是PowerHostUtilizationHistory对象列表(其实PowerHost, PowerHostUtilizationHistory都没有增加关于利用率的成员,是HostDynamicWorkload中提供的)。

  • protected PowerHost getUnderUtilizedHost(Set< ? extends Host> excludedHosts):返回最闲的那台的主机,排除掉excludedHosts和其上所有VM都处于迁移态的主机。

  • protected List< PowerHost> getSwitchedOffHosts():获取关机的主机,判定方法是host.getUtilizationOfCpu() == 0。

  • protected double getPowerAfterAllocation(PowerHost host, Vm vm):预估将vm分配给host之后,该host的功耗,是通过调用getMaxUtilizationAfterAllocation(host, vm)先预估利用率,再用powerModel成员来估算得到。

  • protected double getMaxUtilizationAfterAllocation(PowerHost host, Vm vm):预估将vm分配给host之后,该host的CPU利用率(%)

  • protected double getUtilizationOfCpuMips(PowerHost host):以特殊对待正在迁移的VM的方式计算一台host的CPU占用。先获取host上的VM列表,如果vm是在迁入状态,则它的mips*9,否则mips*1。累加得host的CPU占用(in MIPS)。这里似乎认为迁入十分耗资源,算出来的结果应会远大于host对象调用host.getUtilizationMips()方法。

  • protected void saveAllocation():保存当前所有VM->host的映射关系到成员savedAllocation,VM->host的映射信息从各个host对象处读取,正在迁入的VM会被跳过。这个方法在optimizeAllocation()中被调用,用于在getVmsToMigrateFromHosts(overUtilHosts)(该方法会在相应主机销毁vm)之前保存映射。

  • protected void restoreAllocation():从成员savedAllocation中提取所有VM->host的映射关系。所以该方法先遍历所有主机销毁所有VM(无事件),为正在迁入的VM分配资源,然后按savedAllocation记录的映射逐条创建VM(无事件)。这个方法在optimizeAllocation()中被调用,用于在getNewVmPlacement(…)(该方法会在相应主机创建VM)之后恢复映射。 配合上面那个save函数,两个函数的结合使得optimizeAllocation()对数据中心内的VM分配的修改是无效的(应该是仅用于统计效率),真正完成VM迁移的是optimizeAllocation()函数返回migrationMap之后,PowerDC.updateCloudletProcessing()发送一个包含migrationMap的事件, 然后根据Cloudsim的那套事件机制最终交由PowerDC.processVmMigrate()方法完成。

Note: 我们在编写VM迁移方面的自定义逻辑时,就是修改optimizeAllocation()方法的内容,而该方法由相关方法组合而成,包括:

**寻找迁出主机相关方法:**isHostOverUtilized()、getOverUtilizedHosts()、getUnderUtilizedHost()等;

**从迁出主机上选择VM:**getVmsToMigrateFromHosts()、getVmsToMigrateFromUnderUtilizedHost(),同时涉及到PowerVmSelectionPolicy类的二次开发。

**为迁出的VM选择迁入主机:**getNewVmPlacement(vmsToMigrate, excludedHosts)、getMigrationMapFromUnderUtilizedHosts()以及最核心的findHostForVm(vm, excludedHosts)

现在来看PowerVmAllocationPolicyMigrationAbstract的一些子类,这些子类增加内容都较少,因为父类虽然是Abstract,但实现了绝大多数逻辑。有心的同学就会发现,在查找适合迁出的主机时,有个重要的判定方法在父类未实现——isHostOverUtilized()。

所有的子类(比如static_threshold迁移策略、localRegression迁移策略)基本都是重载了 isHostOverUtilized()方法,其它改动很少,这说明CloudSim给出的几个迁移策略主要关注迁出

下面以static_threshold迁移策略为例:

4-a、public class PowerVmAllocationPolicyMigrationStaticThreshold

继承:PowerVmAllocationPolicyMigrationAbstract

增加成员:private double utilizationThreshold = 0.9; 过载阈值

增加的重要方法

  • @Override
    protected boolean isHostOverUtilized(PowerHost host):判定这个host有没有过载。实现方法是遍历host.getVmList(),累加mips然后除以host.getTotalMips()得到主机利用率(其实应该可以直接调用PowerHost的计算CPU利用率的方法),若该值>utilizationThreshold ,则判定超载。

Cloudsim 3.0.3中VM调度策略系列类解析(带迁移的策略)相关推荐

  1. SpringSession系列-sessionId解析和Cookie读写策略

    SpringSession系列-sessionId解析和Cookie读写策略 sessionId 解析策略 HttpSessionIdResolver 基于Cookie解析sessionId 基于请求 ...

  2. 总结Android中的Info系列类

    Andorid系统的Framework层中包含了许多管理应用信息的类,比如PackageItmeInfo类下包括ApplicationInfo,ComponentInfo,Instrumentatio ...

  3. discuz mysql 类_Discuz论坛中的的MySQL类解析

    PHP代码 class MySQL{ //一些常量的的设定 public $version = ''; public $querynum = 0; public $link; //定义链接方法 fun ...

  4. ACE中ACE_SOCK下ACE_SOCK_Acceptor类解析

    ACE_SOCK_Acceptor,ACE中面对流(有连接)sock编程的接受器类,将服务器端编程的细节,步骤做了包装,让我们不需要再直接的使用OS的复杂,繁多的API函数,那么这个类中到底替我们做了 ...

  5. java的日历类_java 中的Calendar日历类

    一.java 中的Calendar日历类解析 Calendar类是一个抽象类public abstract class Calendar implements Serializable, Clonea ...

  6. 在ASP.NET 2.0中操作数据教程系列

    在ASP.NET 2.0中操作数据教程系列 Scott Mitchell最近完成了为 www.asp.net 网站撰写的<在ASP.NET 2.0中操作数据 (Working with Data ...

  7. 技术系列课|网易云信音视频通话2.0产品中的美声/变声功能

    随着技术的发展,越来越多的直播和社交类产品开始引入RTC功能.新的业务和生态对原本服务于实时通话.视频会议等场景的RTC PaaS产品提出新的需求,原本关注于通话基础功能的设计只能提供基本的交互,并没 ...

  8. CloudSim 4.0源码阅读笔记(功耗实例)

    文章目录 一.NonPowerAware案例 1.1 基本概述 1.2 云任务/虚机/主机/功耗模型参数设置 1.3 初始化云任务(CloudletList)-如何载入自定义真实数据集中的CPU利用率 ...

  9. CloudSim(3.0.3)运行机制见解

    CloudSim(3.0.3)运行机制见解 本文为markdown重构版 原文链接:CloudSim(3.0.3)运行机制见解 接到导师的命令,最近几日在学习CloudSim3.0.3的源码,看着看着 ...

最新文章

  1. Java Volatile keyword
  2. ClickHouse【资源分享 01】Linux环境 clickhouse-19.7.3.9 离线安装文件分享(百度云盘)
  3. java 随机数 【指定范围】
  4. 万字整理,图解Linux内存管理所有知识点
  5. OpenVR——驱动接口之IServerTrackedDeviceProvider简介
  6. 腾讯再出新招!社交新产品“有记”已上线?
  7. python接管已经打开的浏览器_Python Webdriver 从新使用已经打开的浏览器实例
  8. LeetCode 53.最大子序和(动态规划)
  9. 基金指数温度怎么算_基金指数温度靠谱吗【指数温度查询技巧】
  10. 中望3D 2021 插入基准面 - 2实体构面法
  11. Java8 Stream接口流式方法:map操作、filter操作以及flatMap操作
  12. c语言函数内判断嵌套常见错误,c语言不等于(c语言多个if函数怎么嵌套)
  13. 客户无盘系统服务器内存,无盘服务器内存大小
  14. java计算机毕业设计ssm学生宿舍管理系统15pjb(附源码、数据库)
  15. 用java实现简易的切换房间砍怪(大作业)
  16. mysql菜鸟指南(增删查改、数据类型、常用命令)
  17. mysql声明存储过程_MySQL 声明变量及存储过程分析
  18. 惠普HP Smart Tank 516 打印机驱动
  19. xp职称计算机考试题库,全国职称计算机考试题库(WindowsXP模块)
  20. 每日文件类型--CR2

热门文章

  1. 论一个糟糕的大数据码农的自我修养
  2. 147_Merkle(默克尔)树简单理解
  3. 2021.11.02--Estimating motorway traffic states with data fusion and physics-informed deep learning
  4. DRAM失效机制和故障模型
  5. Python安装教程(版本3.8.10)windows10
  6. IOS学习之斯坦福大学IOS开发课程笔记(第二课)
  7. Ode45以及龙格-库塔算法
  8. 文本溢出处理显示省略号
  9. 【愚公系列】2022年10月 微信小程序-电商项目-UI设计之蓝湖的使用
  10. 零基础学小程序 —— 模板样式(三)