CloudSim Plus 能耗仿真(二)

能耗仿真

  1. 主机需要定义PowerModel

    final PowerModelHost powerModel = new PowerModelHostSimple(145,15);
    host.setPowerModel(powerModel)
    
  2. 启用CPU历史数据(CPU Utilization History)

    Realize that the Host CPU Utilization History is only stored if VMs utilization history is enabled by calling {@code vm.enableUtilizationStats()}

    虚拟机利用率数据统计

    vm.enableUtilizationStats()
    

    主机利用率数据统计

    host.enableUtilizationStats();
    
  3. 在数据中心实体内部统计数据

    package test;import org.cloudbus.cloudsim.core.CloudSim;
    import org.cloudbus.cloudsim.core.events.SimEvent;
    import org.cloudbus.cloudsim.datacenters.DatacenterSimple;
    import org.cloudbus.cloudsim.hosts.Host;import java.util.ArrayList;
    import java.util.List;/*** @Author: mhh* @Date: 2022/5/30* @Description: 数据中心实体*/
    public class DataCenter extends DatacenterSimple {// 设置的仿真时间,默认60秒private int SIMULATION_TIME = 60;protected CloudSim simulationManager;// 记录CPU利用率变化protected List<Double> utilizationStats;// 记录能耗消耗变化protected List<Double> energyConsumptionStats;private static final int BASE_TAG = 1000;private static final int UPDATE_STATUS = BASE_TAG + 1;public DataCenter(CloudSim simulation, List<? extends Host> hostList) {super(simulation, hostList);this.simulationManager = simulation;this.utilizationStats = new ArrayList<>();this.energyConsumptionStats = new ArrayList<>();}@Overrideprotected void startInternal() {super.startInternal();schedule(this, 1, UPDATE_STATUS);}@Overridepublic void processEvent(SimEvent evt) {switch (evt.getTag()) {case UPDATE_STATUS:// 根据更新间隔更新状态if (getSimulation().clock() < SIMULATION_TIME) {utilizationStats.add(getCurrentUtilization());energyConsumptionStats.add(getCurrentEnergyCompustion());schedule(this, getSchedulingInterval(), UPDATE_STATUS);}break;default:super.processEvent(evt);break;}}private double getCurrentEnergyCompustion() {double energyCompustion = 0;for (Host host : getHostList()) {double hostCpuPercentUtilization = host.getCpuPercentUtilization();double power = host.getPowerModel().getPower(hostCpuPercentUtilization) * getSchedulingInterval();energyCompustion += power;}return energyCompustion;}private double getCurrentUtilization() {double totalUtilization = getHostList().stream().mapToDouble(Host::getCpuPercentUtilization).sum();return totalUtilization / getHostList().size() * 100.0;}public void setSimulationTime(int simulationTime) {SIMULATION_TIME = simulationTime;}public List<Double> getUtilizationStats() {return utilizationStats;}public List<Double> getEnergyConsumptionStats() {return energyConsumptionStats;}
    }

实例代码

public class PowerModelTest {private static final int SCHEDULING_INTERVAL = 1;private static final int SIMULATION_TIME = 600;private static final int WAIT_TASK_TIME = 5;private static final int HOSTS = 2;private static final int HOST_PES = 10;private static final int VMS = 20;private static final int VM_PES = 1;private final CloudSim simulation;private final List<Host> hostList;public static void main(String[] args) {new PowerModelTest();}private PowerModelTest() {Log.setLevel(Level.INFO);simulation = new CloudSim(0.001);hostList = new ArrayList<>(HOSTS);DataCenter dataCenter = (DataCenter) createDatacenter();DatacenterBroker broker0 = new DatacenterBrokerSimple(simulation);List<Vm> vmList = createVms();List<Cloudlet> cloudletList = createCloudletList(SIMULATION_TIME);broker0.submitVmList(vmList);broker0.submitCloudletList(cloudletList);simulation.terminateAt(SIMULATION_TIME + WAIT_TASK_TIME);simulation.start();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();// 绘制图像(本人写的工具类)XYChartGenerate chartGenarete = new XYChartGenerate();chartGenarete.setSize(1600,400).setAxisTitle("Time(s)","energy(W·s)").initChart().addSeriesData("energy",null, dataCenter.getEnergyConsumptionStats().stream().mapToDouble(t -> t).toArray()).saveChart("energy");chartGenarete.setSize(1600,400).setAxisTitle("Time(s)","Utilization(%)").initChart().addSeriesData("utilization",null, dataCenter.getUtilizationStats().stream().mapToDouble(t -> t).toArray()).saveChart("utilization");}private Datacenter createDatacenter() {for(int i = 0; i < HOSTS; i++) {final Host host = createPowerHost(i);hostList.add(host);}DataCenter dataCenter = new DataCenter(simulation, hostList);// 设置更新的时间间隔dataCenter.setSchedulingInterval(SCHEDULING_INTERVAL);// 设置仿真时间dataCenter.setSimulationTime(SIMULATION_TIME);return dataCenter;}private Host createPowerHost(final int id) {final List<Pe> peList = new ArrayList<>(HOST_PES);for (int i = 0; i < HOST_PES; i++) {peList.add(new PeSimple(3500));}final long ram = 20480;final long bw = 100000;final long storage = 1000000;final VmSchedulerTimeShared vmScheduler = new VmSchedulerTimeShared();final Host host = new HostSimple(ram, bw, storage, peList);final PowerModelHost powerModel = new PowerModelHostSimple(145,15);host.setId(id);host.setVmScheduler(vmScheduler);host.setPowerModel(powerModel);host.enableUtilizationStats();return host;}private List<Vm> createVms() {final var list = new ArrayList<Vm>(VMS);for (int i = 0; i < VMS; i++) {final var vm = new VmSimple(i, 3500, VM_PES);vm.setRam(1024).setBw(1000).setSize(10000).enableUtilizationStats();list.add(vm);}return list;}/*** 根据泊松分布来创建任务* 产生时间:泊松分布* 任务长度:指数分布* @param simulationTime 仿真时间* @return 任务列表*/public static List<Cloudlet> createCloudletList(double simulationTime) {final List<Cloudlet> list = new ArrayList<>();for (int currentTime = 5; currentTime < simulationTime; currentTime++) {List<Cloudlet> cloudlets = createCloudlets(currentTime);list.addAll(cloudlets);}return list;}/*** 根据泊松分布来创建任务* 产生时间:泊松分布* 任务长度:指数分布* @param currentTime 当前时间* @return 任务列表*/private static List<Cloudlet> createCloudlets(double currentTime){final int CLOUDLET_PES = 1;                    // 任务要求的 CPU 核final double TASK_POISSON_LAMBDA = 3;         // 任务到达时服从泊松分布 (平均3个/每秒)final double TASK_EXPONENTIAL_MEAN = 10000;   // 任务长度服从指数分布(20000)List<Cloudlet> list = new ArrayList<>();PoissonDistribution distribution = new PoissonDistribution(TASK_POISSON_LAMBDA);ExponentialDistr taskDistr = new ExponentialDistr(TASK_EXPONENTIAL_MEAN);// 每秒钟产生的任务数服从泊松分布int taskNumber = distribution.sample();for (int i = 0; i < taskNumber; i++) {final UtilizationModelFull utilizationModel = new UtilizationModelFull();long taskLength = (long) taskDistr.sample() + 500;Cloudlet cloudlet = new CloudletSimple(taskLength, CLOUDLET_PES);cloudlet.setUtilizationModel(utilizationModel).setUtilizationModelRam(new UtilizationModelDynamic()).setUtilizationModelBw(new UtilizationModelDynamic()).setSubmissionDelay(currentTime);  // 设置任务到达时间list.add(cloudlet);}return  list;}
}

仿真结果

  • CPU利用率变化

  • 能量消耗变化

  • 结果分析

    由于主机功耗与CPU利用率成线性关系,所以能量消耗曲线与CPU利用率曲线大体一致。

CloudSim Plus 能耗仿真(二)相关推荐

  1. CloudSim Plus能耗仿真(一)

    能耗编程 如何使用CloudSimPlus进行能耗仿真呢?下面通过简单案例进行学习. 主要步骤 设置数据中心的更新间隔. 定义更新的时间间隔以保留主机 CPU 利用率历史记录.间隔越大,准确性越低. ...

  2. 51单片机AD转换pcf8591+数码管显示+Proteus仿真二

    51单片机AD转换pcf8591+数码管显示+Proteus仿真二

  3. zemax仿真二向色镜

    二向色镜通过镀膜来实现,膜的特性根据荧光特性进行选择,可以在zemax的coating.dat文件里进行修改,如下图所示:必须按照如下格式进行编写,第一行是定义膜的名字,第二行定义入射的角度,第三行是 ...

  4. vivado与modelsim的联合仿真(二)

           最近在做Zynq的项目,曾经尝试使用ISE+PlanAhead+XPS+SDK组合和Vivado+SDK来搭建工程,使用中发现前者及其不方便后者有诸多不稳定.近期得闻Xilinx退出Vi ...

  5. 机器人导航(仿真)(二)——amcl定位

    导航实现02_amcl定位 参考视频:[奥特学园]ROS机器人入门课程<ROS理论与实践>零基础教程_哔哩哔哩_bilibili 参考文档:http://www.autolabor.com ...

  6. 控制系统仿真技术(二)-连续系统的数字仿真二

    太原理工大学控制系统仿真技术实验报告 连续系统的数字仿真 1.分别利用欧拉法和预估-校正法求下图所示系统的阶跃响应,并对其结果进行比较. %欧拉法求阶跃响应 r=2;num0=8;den0=[1 3 ...

  7. python实现飞行控制仿真(二)——三自由度仿真

    一.问题:利用python实现三自由度 [总结不对的地方请评论或私信我,谢谢!] 三自由度中简化的几个问题 1.3个控制量,(相比较6自由度中会使用4个控制量),三自由度中一般使用推力.升力和滚转角来 ...

  8. 基于转子磁链定向的异步电机矢量控制仿真(二)

    在完成了矢量控制的基本仿真后,我却发现仿真中Isd励磁电流的波形仍然存在一些问题,因此我去掉磁链环直接通过给定励磁电流的方式进行仿真,仿真运行后先给定额定isd电流建立磁场,在0.5s后给定转速250 ...

  9. SUMO仿真(二)--sumo工程例子

    1.sumo的工程结构 sumo解压之后可以得到四个文件夹(bin.data.docs和tools),bin文件夹下大部分为可执行文件,不同之处在于部分可执行文件并未封装,因此需要用命令行打开:doc ...

最新文章

  1. 2021牛客暑期多校训练营3 I-Kuriyama Mirai and Exclusive Or (差分+位运算)
  2. 【Python】 linecache模块读取文件
  3. 001-SDK框架之Unity游戏调用SDK
  4. OC:数组排序、时间格式化字符串
  5. 完整的由客户端登录(注册)思路
  6. Java 多线程 并发编程
  7. C语言编译和链接详解(通俗易懂,深入本质)
  8. 迟到的tkinter---学校选课刷屏器
  9. win10玩cf不能全屏_游戏莫名卡顿三招搞定!Win10游戏优化教程
  10. linux服务器之间做ssh,Linux 服务器之间怎么样 SSH 不需密码
  11. 垃圾回收算法_Java 垃圾回收算法与几种垃圾回收器
  12. 大数据开发工具hive内部常用函数都有哪些?
  13. 辩证的看DIV+CSS与TABLE
  14. Excel中使用条件格式(比较两列将内容不同用颜色标识)
  15. android 侧滑删除方法,Android recyclerview实现拖拽排序和侧滑删除
  16. uiautomator测试中scrollForward方法使用失灵
  17. [iOS UI设计笔记整理汇总]
  18. Java问题集锦--org.apache.maven.archiver.MavenArchiver.getManifest错误
  19. vue16 自定义键盘属性
  20. java非主流火星文输入法_火星文转换器,火星文转换器在线转换

热门文章

  1. 高德地图API获取地理信息
  2. 直流电机PWM(单极,双极,受限单级)几种驱动驱动模式H桥驱动
  3. CDM—码分复用(简单易懂)
  4. 诺基亚拟1.53亿美元收购软件公司Trolltech
  5. 清华大学霸榜计算机学科第一!2022世界大学计算机科学排名公布!USNews
  6. github删除某个项目流程
  7. 阻挡***狙击攻略 配置安全的路由器
  8. Linux shell for 循环
  9. 新华三鹰视方案荣登IT风云榜 守护视频终端安全得认可
  10. Windows下CertUtil校验和编码文件