CloudSim Plus能耗仿真(一)
能耗编程
如何使用CloudSimPlus进行能耗仿真呢?下面通过简单案例进行学习。
主要步骤
设置数据中心的更新间隔。
定义更新的时间间隔以保留主机 CPU 利用率历史记录。间隔越大,准确性越低。
使用函数:
setSchedulingInterval()
Datacenter.setSchedulingInterval(SCHEDULING_INTERVAL).
设置能耗模型。
基类
PowerModel
是一个接口类。其下有许多子类,例如:PowerModelHost
、PowerModelDatacenter
等。此外,还提供了实现类:
PowerModelHostSimple
等。可以使用默认实现或者自定义。设置可以记录CPU状态。
因为需要根据CPU的利用率来计算能耗。
host.enableUtilizationStats():
它迭代所有现有的虚拟机,启用对每个虚拟机的统计计算。但请记住,当创建主机时,它没有虚拟机。因此,如果您在模拟之前启用计算,则需要为每个虚拟机调用此方法 启动并执行 VM 放置。vm.enableUtilizationStats():
如果为放置 VM 的主机启用统计信息,则会自动为该主机上的每个 VM 启用统计信息。
实例
设置间隔
private Datacenter createDatacenterSimple() {for(int i = 0; i < HOSTS; i++) {Host host = createPowerHost(i);hostList.add(host);}final Datacenter dc = new DatacenterSimple(simulation, hostList, new VmAllocationPolicySimple());dc.setSchedulingInterval(SCHEDULING_INTERVAL);return dc;}
设置能耗模型与记录CPU状态
private Host createPowerHost(final int id) {final List<Pe> peList = new ArrayList<>(HOST_PES);//List of Host's CPUs (Processing Elements, PEs)for (int i = 0; i < HOST_PES; i++) {peList.add(new PeSimple(1000, new PeProvisionerSimple()));}final PowerModelHost powerModel = new PowerModelHostSimple(MAX_POWER, STATIC_POWER);final long ram = 2048; //in Megabytesfinal long bw = 10000; //in Megabits/sfinal long storage = 1000000; //in Megabytesfinal ResourceProvisioner ramProvisioner = new ResourceProvisionerSimple();final ResourceProvisioner bwProvisioner = new ResourceProvisionerSimple();final VmScheduler vmScheduler = new VmSchedulerTimeShared();final Host host = new HostSimple(ram, bw, storage, peList);host.setRamProvisioner(ramProvisioner).setBwProvisioner(bwProvisioner).setVmScheduler(vmScheduler).setPowerModel(powerModel);host.setId(id);host.enableUtilizationStats();return host;}
输出结果
private void printHostCpuUtilizationAndPowerConsumption(final Host host) {final HostResourceStats cpuStats = host.getCpuUtilizationStats();final double utilizationPercentMean = cpuStats.getMean();final double watts = host.getPowerModel().getPower(utilizationPercentMean);System.out.printf("Host %2d CPU Usage mean: %6.1f%% | Power Consumption mean: %8.0f W%n", host.getId(), utilizationPercentMean * 100, watts);}
实例代码
public class PowerExample1 {private static final int SCHEDULING_INTERVAL = 10;private static final int HOSTS = 1;private static final int HOST_PES = 4;private static final int VMS = 1;private static final int VM_PES = 2;private static final int CLOUDLETS = 10;private static final int CLOUDLET_PES = 2;private static final int CLOUDLET_LENGTH = 50000;/*** Defines the power a Host uses, even if it's idle (in Watts).*/private static final double STATIC_POWER = 35;/*** The max power a Host uses (in Watts).*/private static final int MAX_POWER = 50;private final CloudSim simulation;private DatacenterBroker broker0;private List<Vm> vmList;private List<Cloudlet> cloudletList;private Datacenter datacenter0;private final List<Host> hostList;public static void main(String[] args) {new PowerExample1();}private PowerExample1() {Log.setLevel(Level.WARN);simulation = new CloudSim();hostList = new ArrayList<>(HOSTS);datacenter0 = createDatacenterSimple();broker0 = new DatacenterBrokerSimple(simulation);vmList = createVms();cloudletList = createCloudlets();broker0.submitVmList(vmList);broker0.submitCloudletList(cloudletList);simulation.start();System.out.println("------------------------------- SIMULATION FOR SCHEDULING INTERVAL = " + SCHEDULING_INTERVAL+" -------------------------------");final List<Cloudlet> finishedCloudlets = broker0.getCloudletFinishedList();final Comparator<Cloudlet> hostComparator = comparingLong(cl -> cl.getVm().getHost().getId());finishedCloudlets.sort(hostComparator.thenComparing(cl -> cl.getVm().getId()));new CloudletsTableBuilder(finishedCloudlets).build();printHostsCpuUtilizationAndPowerConsumption();}private void printHostsCpuUtilizationAndPowerConsumption() {System.out.println();for (final Host host : hostList) {printHostCpuUtilizationAndPowerConsumption(host);}System.out.println();}private void printHostCpuUtilizationAndPowerConsumption(final Host host) {final HostResourceStats cpuStats = host.getCpuUtilizationStats();// The total Host's CPU utilization for the time specified by the map keyfinal double utilizationPercentMean = cpuStats.getMean();final double watts = host.getPowerModel().getPower(utilizationPercentMean);System.out.printf("Host %2d CPU Usage mean: %6.1f%% | Power Consumption mean: %8.0f W%n", host.getId(), utilizationPercentMean * 100, watts);}private Datacenter createDatacenterSimple() {for(int i = 0; i < HOSTS; i++) {Host host = createPowerHost(i);hostList.add(host);}final Datacenter dc = new DatacenterSimple(simulation, hostList, new VmAllocationPolicySimple());dc.setSchedulingInterval(SCHEDULING_INTERVAL);return dc;}private Host createPowerHost(final int id) {final List<Pe> peList = new ArrayList<>(HOST_PES);//List of Host's CPUs (Processing Elements, PEs)for (int i = 0; i < HOST_PES; i++) {peList.add(new PeSimple(1000, new PeProvisionerSimple()));}final PowerModelHost powerModel = new PowerModelHostSimple(MAX_POWER, STATIC_POWER);final long ram = 2048; //in Megabytesfinal long bw = 10000; //in Megabits/sfinal long storage = 1000000; //in Megabytesfinal ResourceProvisioner ramProvisioner = new ResourceProvisionerSimple();final ResourceProvisioner bwProvisioner = new ResourceProvisionerSimple();final VmScheduler vmScheduler = new VmSchedulerTimeShared();final Host host = new HostSimple(ram, bw, storage, peList);host.setRamProvisioner(ramProvisioner).setBwProvisioner(bwProvisioner).setVmScheduler(vmScheduler).setPowerModel(powerModel);host.setId(id);host.enableUtilizationStats();return host;}private List<Vm> createVms() {final List<Vm> list = new ArrayList<>(VMS);for (int i = 0; i < VMS; i++) {Vm vm = new VmSimple(i, 1000, VM_PES);vm.setRam(512).setBw(1000).setSize(10000).setCloudletScheduler(new CloudletSchedulerSpaceShared());vm.enableUtilizationStats();list.add(vm);}return list;}private List<Cloudlet> createCloudlets() {final List<Cloudlet> list = new ArrayList<>(CLOUDLETS);final UtilizationModel utilization = new UtilizationModelDynamic(0.2);for (int i = 0; i < CLOUDLETS; i++) {// Sets half of the cloudlets with the defined length and the other half with the double of itfinal long length = i < CLOUDLETS / 2 ? CLOUDLET_LENGTH : CLOUDLET_LENGTH * 2;Cloudlet cloudlet =new CloudletSimple(i, length, CLOUDLET_PES).setFileSize(1024).setOutputSize(1024).setUtilizationModelCpu(new UtilizationModelFull()).setUtilizationModelRam(utilization).setUtilizationModelBw(utilization);list.add(cloudlet);}return list;}
}
仿真结果
------------------------------- SIMULATION FOR SCHEDULING INTERVAL = 10 -------------------------------SIMULATION RESULTSCloudlet|Status |DC|Host|Host PEs |VM|VM PEs |CloudletLen|CloudletPEs|StartTime|FinishTime|ExecTimeID| |ID| ID|CPU cores|ID|CPU cores| MI| CPU cores| Seconds| Seconds| Seconds
-----------------------------------------------------------------------------------------------------0|SUCCESS| 1| 0| 4| 0| 2| 50000| 2| 0| 50| 501|SUCCESS| 1| 0| 4| 0| 2| 50000| 2| 50| 100| 502|SUCCESS| 1| 0| 4| 0| 2| 50000| 2| 100| 150| 503|SUCCESS| 1| 0| 4| 0| 2| 50000| 2| 151| 200| 504|SUCCESS| 1| 0| 4| 0| 2| 50000| 2| 201| 250| 505|SUCCESS| 1| 0| 4| 0| 2| 100000| 2| 251| 351| 1006|SUCCESS| 1| 0| 4| 0| 2| 100000| 2| 351| 451| 1007|SUCCESS| 1| 0| 4| 0| 2| 100000| 2| 451| 551| 1008|SUCCESS| 1| 0| 4| 0| 2| 100000| 2| 552| 651| 1009|SUCCESS| 1| 0| 4| 0| 2| 100000| 2| 652| 751| 100
-----------------------------------------------------------------------------------------------------Host 0 CPU Usage mean: 45.5% | Power Consumption mean: 42 W
详解能耗模型
以PowerModelHostSimple
为例。
特点
这是一个线性的主机(Host
)能耗模型,该模型根据主机的平均CPU使用率来计算能耗。能耗分为两部分,待机能耗与最大能耗(staticPower
与maxPower
),
实现类
public class PowerModelHostSimple extends PowerModelHost {private double maxPower;private double staticPower;public PowerModelHostSimple(final double maxPower, final double staticPower) {if (maxPower < staticPower) {throw new IllegalArgumentException("maxPower has to be bigger than staticPower");}this.maxPower = validatePower(maxPower, "maxPower");this.staticPower = validatePower(staticPower, "staticPower");}@Overridepublic PowerMeasurement getPowerMeasurement() {if(!getHost().isActive()){return new PowerMeasurement();}final double utilizationFraction = getHost().getCpuMipsUtilization() / getHost().getTotalMipsCapacity();return new PowerMeasurement(staticPower, (maxPower - staticPower) * utilizationFraction);}public double getPower(final double utilizationFraction) throws IllegalArgumentException {if (utilizationFraction < 0 || utilizationFraction > 1) {throw new IllegalArgumentException("utilizationFraction has to be between [0 and 1]");}return staticPower + (maxPower - staticPower) * utilizationFraction;}private static double validatePower(final double power, final String fieldName) {if (power < 0) {throw new IllegalArgumentException(fieldName+" cannot be negative");}if(power < 1){throw new IllegalArgumentException(fieldName + " must be in watts. A value smaller than 1 may indicate you're trying to give a percentage value instead.");}return power;}public double getMaxPower() {return maxPower;}public double getStaticPower() {return staticPower;}
}
实现类解析
在PowerModelHostSimple
类中,主要有两个关键函数
getPower(final double utilizationFraction):
在一定的利用率下计算以瓦特 (W) 为单位的主机功率使用情况。public double getPower(final double utilizationFraction) throws IllegalArgumentException {if (utilizationFraction < 0 || utilizationFraction > 1) {throw new IllegalArgumentException("utilizationFraction has to be between [0 and 1]");}return staticPower + (maxPower - staticPower) * utilizationFraction;}
所以,案例中使用主机的平均CPU利用率来计算主机(Host)的能耗。
getPowerMeasurement():
以PowerMeasurement
的形式返回实体的当前用电量,它可以保存其他信息,例如用电量的静态和动态部分。@Overridepublic PowerMeasurement getPowerMeasurement() {if(!getHost().isActive()){return new PowerMeasurement();}final double utilizationFraction = getHost().getCpuMipsUtilization() / getHost().getTotalMipsCapacity();return new PowerMeasurement(staticPower, (maxPower - staticPower) * utilizationFraction);}
CloudSim Plus能耗仿真(一)相关推荐
- CloudSim Plus 能耗仿真(二)
CloudSim Plus 能耗仿真(二) 能耗仿真 主机需要定义PowerModel final PowerModelHost powerModel = new PowerModelHostSimp ...
- 云计算与大数据 第14章 云仿真平台CloudSim习题
第14章 云仿真平台CloudSim习题 14.1 选择题 1.仿真三要素为( B ).模型和计算机. A. 工具 B. 系统 C. 对象 ...
- Cloudsim和算法
Cloudsim和智能算法结合有什么优势? 智能算法和CloudSim结合有以下几个优势: 提高模拟精度:CloudSim本身是一个基于事件驱动的离散事件仿真框架,采用了模拟的方式来模拟云计算中的各个 ...
- 1、WorkflowSim 工作流仿真软件介绍
本文引用链接: 现在的大数据应用都非常复杂,并不仅仅能够通过一个或者几个MapReduce任务来描述.更加复杂的描述大数据应用的是工作流 (workflow).WorkflowSim (http:// ...
- 计算机科学 投稿 邮箱,《计算机时代》期刊投稿【编辑部_邮箱_地址_怎么样_版面费_代发表】...
<计算机时代>本刊是由浙江省计算技术研究所;浙江省计算机学会联合主办的计算机科技类期刊,创刊于1983年,国内外公开发行,月刊.是具有影响力的技术性刊物. 投稿基本信息: 刊名: 计算机时 ...
- 【元胞自动机】基于元胞自动机实现高速公路收费站交通流问题附matlab代码
1 简介 近年来,我国高等级公路发展迅速,截止到2012年底,我国高速公路的通车里程已达到97355公里,比2011年增长14.6%.而我国自1984年以来实行"贷款修路.收费还贷" ...
- TAElectronic-车辆电子电器模型库
随着汽车智能化的发展,汽车上的电子电器设备越来越多,同时也越来越复杂.汽车电子化程度的高低是衡量一辆汽车先进水平的重要标志.越来越多的功能集成到车辆这个整体中,以应对各种各样的出行状况,同时还要满足舒 ...
- 【Paper】A Review of Data-Driven Building Energy Consumption Prediction Studies
论文原文:https://www.sciencedirect.com/science/article/pii/S1364032117306093 论文年份:2018 论文被引:351(2020/08/ ...
- CloudSim云仿真的使用及论文阅读
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言:CloudSim介绍 CloudSim来源背景 CloudSim版本演变 一.CloudSim安装过程 运行环境配置 ...
最新文章
- C++ 容器1 vector
- 看看 Grunt 的源码(一):grunt-cli 源码解析
- python在读写文件之前需要创建文件对象-python基础教程:文件读写
- 配置文件加载位置||外部配置加载顺序||自动配置原理
- Qt中使用线程的几种方式及区别
- HTML 块标签,行内标签,行内块标签以及之间的相互转换
- 【牛客 - 315C】排列(思维,贪心,同优则立证明法)
- Spring整合Redis详解
- Oracle 密码过期问题
- java cpu_JAVA定位CPU占用率高
- [淘宝商城首页]-图片灯箱明暗遮罩效果之jquery版
- R语言单因素分析案例
- 鼠标离开 表格隐藏html,excel中滚动鼠标表格隐藏怎么取消
- Header Editor 插件下载、使用
- Egret MovieClip2
- POJ-2524 Ubiquitous Religions
- 剑网3官方(内置)宏语法说明---(转自令狐志超帖子)
- Android GPU呈现模式分析功能,手机流畅度。仅供参考
- 笔记:光场相机能否用于SLAM?
- Linux常用命令大全,一篇搞定
热门文章
- 如何用Robotics Toolbox 建模多自由度的机械手臂
- 【接口篇 / Lan】(5.6) ❀ 05. 与思科交换机三层链路聚合连接 ❀ FortiGate 防火墙
- 龙芯1c300b开发语言,龙芯 1C0300B 主控芯片已成功进入激光打印机市场
- 企业购买团体商业保险有助提升公司形象
- 什么是哲学?《哲学家们都干了些什么?》读后感
- “我数学太烂,但高考136分!”刷完上万道题后,我找到2个月多考58分的捷径…...
- 配置华为s系列交换机mode lacp
- JSP书香味道点餐系统课设
- 最全的Windows7 服务优化、详解。
- 人生感悟:欲望适度则为利,欲望过度则为害,高级java开发工程师简历