CloudSim3.0.3power编程examples及辅助类解析

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

power编程依赖的底层主要类(PowerDataCenter、PowerDCBroker、调度策略类等等)都是org.cloudbus.cloudsim.power包中,这些类在之前的文章中已经介绍:

  1. Cloudsim 3.0.3中Power系列类的解析——PowerDataCenter和PowerDCBroker
  2. Cloudsim 3.0.3中Power系列类的解析——PowerHost, PowerVM, PowerModel
  3. Cloudsim 3.0.3中VM调度策略系列类解析(无迁移的策略)
  4. Cloudsim 3.0.3中VM调度策略系列类解析(带迁移的策略)

等等

CloudSim3.0.3与power包相关的样例在org.cloudbus.cloudsim.examples.power.random/planetlab中,基本辅助类在org.cloudbus.cloudsim.examples.power中,样例特定的辅助类则与样例存放在一起。

1、基本辅助类

位置:org.cloudbus.cloudsim.examples.power,用于辅助power examples的编写,功能主要包括定义所有常量(如VM类型、host类型、任务类型、调度间隔schedulingInterval等)、创建数据中心、VM等各实验对象和初始化并启动模拟等等。

1.1 org.cloudbus.cloudsim.examples.power.Constants.java

定义了power仿真需要用到的各种常量,重要常量包括:

public final static double SCHEDULING_INTERVAL = 300;  //调度间隔,在创建DC时会传入,数据中心在无事件可处理时,会发出delay=SCHEDULING_INTERVAL的事件以将clock向前推演一个间隔。另外,从example代码中看,300秒同时是planetlab.workload负载数据的间隔。
public final static double SIMULATION_LIMIT = 24 * 60 * 60; //仿真模拟时间上限=1天// length: 2500 mips * 1 day
public final static int CLOUDLET_LENGTH= 2500 * (int) SIMULATION_LIMIT; //云任务的指令长度
public final static int CLOUDLET_PES= 1; //云任务的PE需求//定义了4种虚拟机,均为单核
public final static int VM_TYPES= 4;
public final static int[] VM_MIPS= { 2500, 2000, 1000, 500 };
public final static int[] VM_PES= { 1, 1, 1, 1 };
public final static int[] VM_RAM= { 870,  1740, 1740, 613 };
public final static int VM_BW= 100000; // 100 Mbit/s
public final static int VM_SIZE= 2500; // 2.5 GB// 定义了2种服务器
public final static int HOST_TYPES= 2;
public final static int[] HOST_MIPS= { 1860, 2660 };
public final static int[] HOST_PES= { 2, 2 };
public final static int[] HOST_RAM= { 4096, 4096 };
public final static int HOST_BW= 1000000; // 1 Gbit/s
public final static int HOST_STORAGE = 1000000; // 1 GB//2种服务器对应的能耗模型
//每个能耗模型就是一个11元素(0%-100%)的数组
public final static PowerModel[] HOST_POWER = {
new PowerModelSpecPowerHpProLiantMl110G4Xeon3040(),
new PowerModelSpecPowerHpProLiantMl110G5Xeon3075()
};

1.2 org.cloudbus.cloudsim.examples.power.Helper.java

主要封装了创建Broker、DataCenter、主机、VM方法逻辑(Cloudlet不在此创建),用于创建数据中心的最基本组件和底层逻辑,主要方法如下:

创建主机:

public static List<PowerHost> createHostList(int hostsNumber) {
...
//创建主机集合,只需指定数量,其它信息由Constants内指定,其中主机类型是那2种类型循环创建,主机上的VM是timeShared
} 

创建DC

public static Datacenter createDatacenter(String name,Class<? extends Datacenter> datacenterClass,List<PowerHost> hostList,VmAllocationPolicy vmAllocationPolicy) {
...
//创建数据中心,需要指定datacenterClass(在power包中,用到的基本是PowerDataCenter类,譬如RunnerAbstract中调用createDataCenter就传入的它),
//还需要指定vmAllocationPolicy,即虚拟机调度策略类(在系列文章中介绍过),vmAllocationPolicy内部包含了vmSelectionPolicy。
...
}

创建代理

public static DatacenterBroker createBroker() {
...
//创建Broker
} 

创建VM

public static List<Vm> createVmList(int brokerId, int vmsNumber) {
...
// 指定要创建的VM数量,根据Constants.java内指定的4种VM类型类创建VM。
}

打印仿真结果

public static void printResults(PowerDatacenter datacenter,List<Vm> vms,double lastClock,String experimentName,boolean outputInCsv,String outputFolder) {
...
// 这是打印函数,根据传入的PowerDC对象和主机列表,统计各种各样的数据(e.g., 总能耗DC.getPower()、MigrationCount、slaTimePerActiveHost等等)
// 同时会输出到参数指定的outputFolder中的文件(不存在则创建)
}

1.3 org.cloudbus.cloudsim.examples.power.RunnerAbstract.java

在更高一层封装了整个实验初始化代码,将power仿真程序中整个逻辑(从init、创建DC到提交云任务并开始仿真、最后到结束仿真)都封装在了构造函数里,其中构造函数里调用init()方法完成DCBroker、host集合、VM集合和Cloudlet集合的初始化,然后根据字符串解析出所指定的VmAllocationPolicy对象,再调用start()方法创建数据中心(用Helper提供的函数)。不过,基本辅助类RunnerAbstract是抽象类,start()方法是完整可用的(事实上辅助子类直接继承该方法),但init()方法为空,需要继承的子辅助类来实现,这是因为不同样例需要定义的Cloudlet集合不相同。
关键方法解析:

RunnerAbstract:

public RunnerAbstract(boolean enableOutput,boolean outputToFile,String inputFolder,String outputFolder,String workload,String vmAllocationPolicy,String vmSelectionPolicy,String parameter) {
// 构造函数,整个仿真逻辑都封装在了构造函数里,先调用initLogOutput()方法初始化输出目录和文件(其中文件命名与workload、policy等相关),再调用init()方法
// 初始化DCBroker、host集合、VM集合和Cloudlet集合,最后解析字符串获得vmAllocationPolicy对象和vmSelectionPolicy对象并传入start()方法开始仿真。
// 所以该构造函数(准确的说是其子类构造函数)的调用就代表初始化并开始仿真了。
...
}

Init()

protected abstract void init(String inputFolder);
// init()在RunnerAbstract中是抽象函数,没有实现,因为Cloudlet的定义因样例而异。
protected void start(String experimentName, String outputFolder, VmAllocationPolicy vmAllocationPolicy) {
// 首先根据hostlist成员和vmAllocationPolicy创建出数据中心(指定为PowerDataCenter类),使能VM迁移(datacenter.setDisableMigrations(false)),
// 然后通过broker提交VM列表和Cloudlet列表,开始仿真,接收云任务执行返回列表后调用Helper的printResults()方法输出统计信息。
...
}

2、样例相关的辅助类

与样例存放在一起,其中planetlab包包含使用planetlab负载数据(一大批数据文件)的样例,random包则是使用随机的负载数据。两个包里面的样例的逻辑基本是一样的,本节以random包中的辅助类和样例为例。

2.1 RandomConstants.java:
定义了3个常量:

public final static int NUMBER_OF_VMS = 50;
public final static int NUMBER_OF_HOSTS = 50;
public final static long CLOUDLET_UTILIZATION_SEED = 1;//RandomConstants.java是power包中的Constants.java的补充,补充的内容就是VM数、HOST数

2.2 RandomHelper.java:
是对power包中的Helper.java的补充,补充了创建Cloudlet集合的函数如下:

创建任务列表

public static List<Cloudlet> createCloudletList(int brokerId, int cloudletsNumber)
{
...
//该方法根据指定的cloudlet数量、power包Constants.java中定义的任务属性(指令长度、核数)来创建任务集合,另外任务的CPU负载模型采用
//UtilizationModelStochastic类,内存和带宽用的utilizationModelNull。
...
}

2.3 RandomRunner.java
继承:power包的RunnerAbstract
重要函数

public RandomRunner(...){
...
//通过super()调用父类的构造函数,封装整个初始化和模拟程序逻辑。
}

重载的Init()

@Override
protected void init(String inputFolder) {
...
// init()方法实现了父类抽象方法(父类RunnerAbstract)没有实现,完成DCBroker、cloudlet集合、VM集合和HOST集合的创建。
CloudSim.init(1, Calendar.getInstance(), false);//初始化
broker = Helper.createBroker();//调用Helper的方法创建BrokercloudletList = RandomHelper.createCloudletList(brokerId, RandomConstants.NUMBER_OF_VMS);//调用RandomHelper的方法创建Cloudlet集合
vmList = Helper.createVmList(brokerId, cloudletList.size());//调用Helper的方法创建VM集合
hostList = Helper.createHostList(RandomConstants.NUMBER_OF_HOSTS);//调用Helper的方法创建HOST集合...
}

power仿真样例的代码就十分简洁了。
下面以org.cloudbus.cloudsim.examples.power.random包中的两个样例为例,一个是采用简单调度策略(PowerVmAllocationPolicySimple,系列文章中讲过,是无迁移的
First-Fit)的程序样例NonPowerAware.java,以及一个基于阈值选择迁出VM、基于负载相关性进行放置的程序样例ThrMc.java(Thr指基于阈值的vmSelectionPolicy,Mc指基
于Max correlation的放置策略,二者组合为一个总的vmAllocationPolicy来管理DC)。

3.1、NonPowerAware.java
该样例仿真一个采用简单FF调度策略的数据中心,它没有借助RunnerAbstract及其,而是直接调用power包的辅助类(Helper和Constants)的方法、Random包的样例辅助类完成的各类对象创建,所以代码比较长。

public class NonPowerAware {/*** Creates main() to run this example.* * @param args the args* @throws IOException*/public static void main(String[] args) throws IOException {String experimentName = "random_npa";String outputFolder = "output";//允许VM调度Log.setDisabled(!Constants.ENABLE_OUTPUT);Log.printLine("Starting " + experimentName);try {CloudSim.init(1, Calendar.getInstance(), false);//用Helper的方法创建BrokerDatacenterBroker broker = Helper.createBroker();int brokerId = broker.getId();//用RandomHelper的方法创建任务列表List<Cloudlet> cloudletList = RandomHelper.createCloudletList(brokerId,RandomConstants.NUMBER_OF_VMS);//用Helper的方法创建VM集合List<Vm> vmList = Helper.createVmList(brokerId, cloudletList.size());//用Helper的方法创建host集合List<PowerHost> hostList = Helper.createHostList(RandomConstants.NUMBER_OF_HOSTS);//用Helper的方法创建数据中心,并且该样例指定为PowerDatacenterNonPowerAware,VM调度策略使用PowerVmAllocationPolicySimple//即First-FitPowerDatacenterNonPowerAware datacenter = (PowerDatacenterNonPowerAware) Helper.createDatacenter("Datacenter",PowerDatacenterNonPowerAware.class,hostList,newPowerVmAllocationPolicySimple(hostList));datacenter.setDisableMigrations(true);broker.submitVmList(vmList);broker.submitCloudletList(cloudletList);CloudSim.terminateSimulation(Constants.SIMULATION_LIMIT);double lastClock = CloudSim.startSimulation();List<Cloudlet> newList = broker.getCloudletReceivedList();Log.printLine("Received " + newList.size() + " cloudlets");CloudSim.stopSimulation();Helper.printResults(datacenter,vmList,lastClock,experimentName,Constants.OUTPUT_CSV,outputFolder);} catch (Exception e) {e.printStackTrace();Log.printLine("The simulation has been terminated due to an unexpected error");System.exit(0);}Log.printLine("Finished " + experimentName);}
}

该样例调度策略选择的是PowerVmAllocationPolicySimple,是一种无迁移的简单FF;另外,它没有使用RunnerAbstract及其子类提供的方法来创建DC,是因为它创建的是PowerDatacenterNonPowerAware对象(而非PowerDatacenter)。
查看代码,我发现PowerDatacenterNonPowerAware是继承PowerDatacenter的,并且唯一@override的方法是updateCloudletProcessing() ——一个负责输出主机、DC功耗/能耗等信息、调用各主机实例的updateVmsProcessing()方法并根据最快出现的状态变化时刻发出下一个DC事件。虽然实现不尽相同,PowerDatacenterNonPowerAware中updateCloudletProcessing()相比其父类PowerDatacenter逻辑上基本没什么不同,主要区别在于前者是先打印当前集群功耗/能耗信息,再进行状态更新,最后VM调度;而其父类则是先(调用updateCloudetProcessingWithoutSchedulingFutureEventsForce)完成状态更新和信息打印,最后VM调度。

编写自定义VM掉策略的测试样例时,如果想减少封装使代码更直观,那么NonPowerAware.java是不错的参考。

3.2、ThrMc.java
该样例仿真一个采用复杂VM调度策略(基于阈值选择迁出VM、基于负载相关性进行放置)的PowerDC,使用了特定辅助类RandomRunner来实现全部创建和模拟启动工作,所以代码很简洁。

public class ThrMc {public static void main(String[] args) throws IOException {boolean enableOutput = true;boolean outputToFile = false;String inputFolder = "";String outputFolder = "";String workload = "random"; // Random workload,对于plannetlab的样例,这里就要指定负载文件名String vmAllocationPolicy = "thr"; // Static Threshold (THR) VM allocation policyString vmSelectionPolicy = "mc"; // Maximum Correlation (MC) VM selection policyString parameter = "0.8"; // the static utilization threshold// 辅助类RandomRunner的构造函数包含了所有逻辑,上面代码指定的各字符串会被解析并用于PowerDatacenter的配置和创建new RandomRunner(enableOutput,outputToFile,inputFolder,outputFolder,workload,vmAllocationPolicy,vmSelectionPolicy,parameter);}}

在RandomRunner的构造函数中,vmSelectionPolicy = “mc”会被解析为PowerVmSelectionPolicyMaximumCorrelation(基于最大相关性的迁出VM选择),vmAllocationPolicy = “thr”会被解析成为PowerVmAllocationPolicyMigrationStaticThreshold(基于静态阈值的VM放置)。前者创建后作为参数传给后者的构造函数成为后者成员(毕竟VMSelection是整个Allocation或者说VMScheduling的一部分),因为带迁移的VM调度策略的抽象类PowerVmAllocationPolicyMigrationAbstract有成员:private PowerVmSelectionPolicy vmSelectionPolicy; (详见系列文章Cloudsim 3.0.3中VM调度策略系列类解析(带迁移的策略))


CloudSim3.0.3power编程examples及辅助类解析相关推荐

  1. ASP 3.0高级编程(四)

     来    源: 互联网  作    者: 不祥  发表日期: 2005-12-17 15:15:17  阅读次数: 85  文章标题:ASP → ASP 3.0高级编程(四)  查看权限: 普通文章 ...

  2. java 令牌解析_Java编程guava RateLimiter实例解析

    本文主要研究的是Java编程guava RateLimiter的相关内容,具体如下. 场景1 在流量监管中的应用 约定访问速率(CAR)是流量监管常用技术之一,可以应用在端口进和出方向,一般应用在入方 ...

  3. Java并发编程:volatile关键字解析(转载)

    转自https://www.cnblogs.com/dolphin0520/p/3920373.html Java并发编程:volatile关键字解析 Java并发编程:volatile关键字解析 v ...

  4. 输入2个正整数lower和upper(lower_题库 | 华为研发工程师编程题型介绍及解析 第 2 期...

    题目1:给定两个已经升序排序好的的序列 A={a1,a2,a3,-an} 和 B={b1,b2,b3-bn} ,一个数 R,找出满足以下条件的的(ai,bj)序列对. 1.ai<=bj 2.bj ...

  5. php的setinc方法,thinkphp3.2.0 setInc方法 源码全面解析

    搜索热词 我们先来看一下setInc的官方示例: 需要一个字段和一个自增的值(默认为1) 我们通过下面这个例子来一步步分析他的底层是怎么实现的: class TestController extend ...

  6. 虚幻4 游戏引擎 C++编程 官网例程解析

    虚幻4游戏引擎C++编程官网例程解析 官网例程 源代码 FloatingActor.h FloatingActor.cpp 内容说明 pragma once 头文件 UClass宏 AActor类 P ...

  7. C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(中)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(中)),不对的地方欢迎指出与交流. 章节出自<Professional C# ...

  8. C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(上)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(上)),不对的地方欢迎指出与交流. 章节出自<Professional C# ...

  9. 转载:Java并发编程:volatile关键字解析

    看到一篇写的很细致的文章,感谢作者 作者:Matrix海子 出处:http://www.cnblogs.com/dolphin0520/ 本博客中未标明转载的文章归作者Matrix海子和博客园共有,欢 ...

最新文章

  1. 学python有什么好处 学完可以做什么
  2. 让Centos5.6的Firefox支持Java
  3. Spring Cloud Netflix Eureka 配置参数说明
  4. 1.8 finally和return的执行顺序
  5. python安装MySQLdb包遇到的坑:EnvironmentError: mysql_config not found
  6. 一些在线的WebEdit编辑器
  7. mysql添加数据不阻塞_主键表插入数据不提交,外键表插入数据被阻塞
  8. java以正确的方式停止线程
  9. 数据结构(6)----栈与队列之栈的链式存储结构及其实现
  10. 开博第一篇:一个关于正则表达式相关的问题
  11. linux从字符界面转入图形界面一法
  12. CVPR2020-深度图超分辨率DSR新方法| Channel Attention based Iterative Residual Learning for Depth Map SR
  13. 【C++】 bin文件转换成txt文件
  14. jq 数字转中文数字_Jquery 字符串转数字
  15. python职场应用英语作文_职场英语作文万能句子
  16. 高级程序语言c 平时作业,东北大学20秋学期《高级语言程序设计基础X》在线平时作业3...
  17. HDU 6656 Kejin Player(期望)
  18. R语言基础教程(1)
  19. 电路与模拟电子技术----正弦交流电路(上)
  20. 深度学习训练技巧总结

热门文章

  1. 一碗免费削筋面的故事
  2. ESP32 CAM下载程序踩过的吭
  3. C#对图片进行缩放变换
  4. html按钮轮播图,四种方式实现轮播图
  5. home staging_【卖房流程指南3】HomeStaging——旧屋新装,投资回报大提升
  6. 机器学习中牛顿法凸优化的通俗解释
  7. 【汇正财经】国家股是什么意思?什么是国家股?
  8. dnf 连接不上服务器未响应,地下城与勇士游戏无法进入怎么办 DNF进不去的解决方法教程[多图]...
  9. c语言abr是什么错误类型,C语言真他妈难
  10. 同传统的计算机程序相比,人工智能程序有哪些特点?