能耗编程

如何使用CloudSimPlus进行能耗仿真呢?下面通过简单案例进行学习。

主要步骤

  • 设置数据中心的更新间隔。

    定义更新的时间间隔以保留主机 CPU 利用率历史记录。间隔越大,准确性越低。

    使用函数:setSchedulingInterval()

    Datacenter.setSchedulingInterval(SCHEDULING_INTERVAL).

  • 设置能耗模型。

    基类PowerModel是一个接口类。其下有许多子类,例如:PowerModelHostPowerModelDatacenter等。

    此外,还提供了实现类:PowerModelHostSimple等。可以使用默认实现或者自定义。

  • 设置可以记录CPU状态。

    因为需要根据CPU的利用率来计算能耗。

    host.enableUtilizationStats():它迭代所有现有的虚拟机,启用对每个虚拟机的统计计算。但请记住,当创建主机时,它没有虚拟机。因此,如果您在模拟之前启用计算,则需要为每个虚拟机调用此方法 启动并执行 VM 放置。

    vm.enableUtilizationStats():如果为放置 VM 的主机启用统计信息,则会自动为该主机上的每个 VM 启用统计信息。

实例

  1. 设置间隔

        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;}
    
  2. 设置能耗模型与记录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;}
    
  3. 输出结果

        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使用率来计算能耗。能耗分为两部分,待机能耗最大能耗staticPowermaxPower),

实现类

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能耗仿真(一)相关推荐

  1. CloudSim Plus 能耗仿真(二)

    CloudSim Plus 能耗仿真(二) 能耗仿真 主机需要定义PowerModel final PowerModelHost powerModel = new PowerModelHostSimp ...

  2. 云计算与大数据 第14章 云仿真平台CloudSim习题

    第14章 云仿真平台CloudSim习题 14.1 选择题 1.仿真三要素为(  B  ).模型和计算机. A. 工具        B. 系统              C. 对象          ...

  3. Cloudsim和算法

    Cloudsim和智能算法结合有什么优势? 智能算法和CloudSim结合有以下几个优势: 提高模拟精度:CloudSim本身是一个基于事件驱动的离散事件仿真框架,采用了模拟的方式来模拟云计算中的各个 ...

  4. 1、WorkflowSim 工作流仿真软件介绍

    本文引用链接: 现在的大数据应用都非常复杂,并不仅仅能够通过一个或者几个MapReduce任务来描述.更加复杂的描述大数据应用的是工作流 (workflow).WorkflowSim (http:// ...

  5. 计算机科学 投稿 邮箱,《计算机时代》期刊投稿【编辑部_邮箱_地址_怎么样_版面费_代发表】...

    <计算机时代>本刊是由浙江省计算技术研究所;浙江省计算机学会联合主办的计算机科技类期刊,创刊于1983年,国内外公开发行,月刊.是具有影响力的技术性刊物. 投稿基本信息: 刊名: 计算机时 ...

  6. 【元胞自动机】基于元胞自动机实现高速公路收费站交通流问题附matlab代码

    1 简介 近年来,我国高等级公路发展迅速,截止到2012年底,我国高速公路的通车里程已达到97355公里,比2011年增长14.6%.而我国自1984年以来实行"贷款修路.收费还贷" ...

  7. TAElectronic-车辆电子电器模型库

    随着汽车智能化的发展,汽车上的电子电器设备越来越多,同时也越来越复杂.汽车电子化程度的高低是衡量一辆汽车先进水平的重要标志.越来越多的功能集成到车辆这个整体中,以应对各种各样的出行状况,同时还要满足舒 ...

  8. 【Paper】A Review of Data-Driven Building Energy Consumption Prediction Studies

    论文原文:https://www.sciencedirect.com/science/article/pii/S1364032117306093 论文年份:2018 论文被引:351(2020/08/ ...

  9. CloudSim云仿真的使用及论文阅读

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言:CloudSim介绍 CloudSim来源背景 CloudSim版本演变 一.CloudSim安装过程 运行环境配置 ...

最新文章

  1. C++ 容器1 vector
  2. 看看 Grunt 的源码(一):grunt-cli 源码解析
  3. python在读写文件之前需要创建文件对象-python基础教程:文件读写
  4. 配置文件加载位置||外部配置加载顺序||自动配置原理
  5. Qt中使用线程的几种方式及区别
  6. HTML 块标签,行内标签,行内块标签以及之间的相互转换
  7. 【牛客 - 315C】排列(思维,贪心,同优则立证明法)
  8. Spring整合Redis详解
  9. Oracle 密码过期问题
  10. java cpu_JAVA定位CPU占用率高
  11. [淘宝商城首页]-图片灯箱明暗遮罩效果之jquery版
  12. R语言单因素分析案例
  13. 鼠标离开 表格隐藏html,excel中滚动鼠标表格隐藏怎么取消
  14. Header Editor 插件下载、使用
  15. Egret MovieClip2
  16. POJ-2524 Ubiquitous Religions
  17. 剑网3官方(内置)宏语法说明---(转自令狐志超帖子)
  18. Android GPU呈现模式分析功能,手机流畅度。仅供参考
  19. 笔记:光场相机能否用于SLAM?
  20. Linux常用命令大全,一篇搞定

热门文章

  1. 如何用Robotics Toolbox 建模多自由度的机械手臂
  2. 【接口篇 / Lan】(5.6) ❀ 05. 与思科交换机三层链路聚合连接 ❀ FortiGate 防火墙
  3. 龙芯1c300b开发语言,龙芯 1C0300B 主控芯片已成功进入激光打印机市场
  4. 企业购买团体商业保险有助提升公司形象
  5. 什么是哲学?《哲学家们都干了些什么?》读后感
  6. “我数学太烂,但高考136分!”刷完上万道题后,我找到2个月多考58分的捷径…...
  7. 配置华为s系列交换机mode lacp
  8. JSP书香味道点餐系统课设
  9. 最全的Windows7 服务优化、详解。
  10. 人生感悟:欲望适度则为利,欲望过度则为害,高级java开发工程师简历