5、cloudsim基于CloudSimExample6建立自己云计算仿真平台

1、项目结构如下:

 2、构建MyCloudSim6.java

  1 package cloudsim;
  2 import java.text.DecimalFormat;
  3 import java.util.ArrayList;
  4 import java.util.Calendar;
  5 import java.util.LinkedList;
  6 import java.util.List;
  7 
  8 import org.cloudbus.cloudsim.Cloudlet;
  9 import org.cloudbus.cloudsim.CloudletSchedulerTimeShared;
 10 import org.cloudbus.cloudsim.Datacenter;
 11 import org.cloudbus.cloudsim.DatacenterBroker;
 12 import org.cloudbus.cloudsim.DatacenterCharacteristics;
 13 import org.cloudbus.cloudsim.Host;
 14 import org.cloudbus.cloudsim.Log;
 15 import org.cloudbus.cloudsim.Pe;
 16 import org.cloudbus.cloudsim.Storage;
 17 import org.cloudbus.cloudsim.UtilizationModel;
 18 import org.cloudbus.cloudsim.UtilizationModelFull;
 19 import org.cloudbus.cloudsim.Vm;
 20 import org.cloudbus.cloudsim.VmAllocationPolicySimple;
 21 import org.cloudbus.cloudsim.VmSchedulerTimeShared;
 22 import org.cloudbus.cloudsim.core.CloudSim;
 23 import org.cloudbus.cloudsim.provisioners.BwProvisionerSimple;
 24 import org.cloudbus.cloudsim.provisioners.PeProvisionerSimple;
 25 import org.cloudbus.cloudsim.provisioners.RamProvisionerSimple;
 26 
 27 
 28 public class MyCloudSim6 {
 29     //虚拟机列表
 30     private static List<Vm> vmlist;
 31     //云任务列表
 32     private static List<Cloudlet> cloudletList;
 33     public static void main(String[] args) {
 34         Log.printLine("Starting Mycloudsim6...");
 35         try{
 36             //云用户数量
 37             int num_user = 1;
 38             //日历的字段已使用当前日期和时间初始化。
 39             Calendar calendar = Calendar.getInstance();
 40             //跟踪事件
 41             boolean trace_flag = false;
 42             //初始化CloudSim库。
 43             CloudSim.init(num_user, calendar, trace_flag);
 44             //第二步:创建两个数据中心
 45             Datacenter datacenter0 = createDatacenter("Datacenter_0");
 46             Datacenter datacenter1 = createDatacenter("Datacenter_1");
 47             //第三步:创建代理
 48             DatacenterBroker broker = createBroker();
 49             int brokerId = broker.getId();
 50             //第四步:创建一个虚拟机
 51             vmlist = createVm(brokerId,2);
 52             //第五步:创建云任务,将云任务添加到列表中,将云任务列表提交给数据中心代理
 53             cloudletList = createCloudlet(brokerId,4);
 54             //将虚拟机提交给代理
 55             broker.submitVmList(vmlist);
 56             //将云任务列表提交给代理
 57             broker.submitCloudletList(cloudletList);
 58             //第六步:开始模拟
 59             CloudSim.startSimulation();
 60             //CloudSim.stopSimulation();
 61             //最后一步:模拟结束时打印结果
 62             List<Cloudlet> newList = broker.getCloudletReceivedList();
 63             printCloudletList(newList);
 64             Log.printLine("MyCloudSim finished!");
 65         }catch(Exception e){
 66             e.printStackTrace();
 67             Log.printLine("The simulation has been terminated due to an unexpected error");
 68         }
 69     }
 70     //创建云任务
 71     private static List<Cloudlet> createCloudlet(int brokerId, int cloudlets){
 72         LinkedList<Cloudlet> list = new LinkedList<Cloudlet>();
 73 
 74         long length = 1000;
 75         long fileSize = 300;
 76         long outputSize = 300;
 77         int pesNumber = 1;
 78         UtilizationModel utilizationModel = new UtilizationModelFull();
 79 
 80         Cloudlet[] cloudlet = new Cloudlet[cloudlets];
 81 
 82         for(int i=0;i<cloudlets;i++){
 83             cloudlet[i] = new Cloudlet(i, length, pesNumber, fileSize, outputSize, utilizationModel, utilizationModel, utilizationModel);
 84             cloudlet[i].setUserId(brokerId);
 85             list.add(cloudlet[i]);
 86         }
 87 
 88         return list;
 89     }
 90     //创建虚拟机
 91     private static List<Vm> createVm(int brokerId,int vms){
 92         LinkedList<Vm> list = new LinkedList<Vm>();
 93         //Vm 描述
 94         int mips = 1000;//速率
 95         long size = 10000; //  虚拟机的存储大小 (MB)
 96         int ram = 512; //  虚拟机内存 (MB)
 97         long bw = 1000;//虚拟机带宽
 98         int pesNumber = 1; // cpu核数
 99         String vmm = "Xen"; // //虚拟机监视器
100 
101         Vm[] vm = new Vm[vms];
102 
103         for(int i=0;i<vms;i++){
104             vm[i] = new Vm(i, brokerId, mips, pesNumber, ram, bw, size, vmm, new CloudletSchedulerTimeShared());
105             list.add(vm[i]);
106         }
107 
108         return list;
109     }
110     private static Datacenter createDatacenter(String name){
111         //1.定义主机列表
112         List<Host> hostList = new ArrayList<Host>();
113         //2.创建主机包含的PE或者CPU处理器列表,定义为MIPS速率
114         //定义了两个主机
115         List<Pe> peList1 = new ArrayList<Pe>();
116         List<Pe> peList2 = new ArrayList<Pe>();
117         int mips = 1000;
118         //3. 创建处理器,并添加到Pe列表中
119         peList1.add(new Pe(0, new PeProvisionerSimple(mips))); // 需要Pe id 和 MIPS 速率
120         peList1.add(new Pe(1, new PeProvisionerSimple(mips)));
121         peList1.add(new Pe(2, new PeProvisionerSimple(mips)));
122         peList1.add(new Pe(3, new PeProvisionerSimple(mips)));
123         peList2.add(new Pe(0, new PeProvisionerSimple(mips)));
124         peList2.add(new Pe(1, new PeProvisionerSimple(mips)));
125         // 4. 创建主机,并将其添加至主机列表
126         int hostId = 0;
127         int ram = 2048; // 主机内存 (MB)
128         long storage = 1000000; // 主机的存储空间
129         int bw = 10000;//主机带宽
130         //第一台机器//时间共享
131         hostList.add(
132                 new Host(
133                         hostId,
134                         new RamProvisionerSimple(ram),//内存提供者,为虚拟机提供内存
135                         new BwProvisionerSimple(bw),//带宽提供者
136                         storage,
137                         peList1,
138                         new VmSchedulerTimeShared(peList1)//时间共享的VM调度
139                 )
140         );
141         //第二台机器//时间共享
142         hostId++;
143         hostList.add(
144                 new Host(
145                         hostId,
146                         new RamProvisionerSimple(ram),
147                         new BwProvisionerSimple(bw),
148                         storage,
149                         peList2,
150                         new VmSchedulerTimeShared(peList2)
151                 )
152         );
153         String arch = "x86"; // 架构
154         String os = "Linux"; // 操作系统
155         String vmm = "Xen"; //虚拟机监视器
156         double time_zone = 10.0; // 此资源所在的时区
157         double cost = 3.0; // 处理器花费
158         double costPerMem = 0.05; // 内存花费
159         double costPerStorage = 0.001; // 存储花费
160         double costPerBw = 0.0; //带宽花费
161         LinkedList<Storage> storageList = new LinkedList<Storage>(); // 我们现在不添加SAN设备
162         DatacenterCharacteristics characteristics = new DatacenterCharacteristics(
163                 arch, os, vmm, hostList, time_zone, cost, costPerMem,
164                 costPerStorage, costPerBw);
165 
166         // 6. 最后,我们需要创建一个PowerDatacenter对象。
167         Datacenter datacenter = null;
168         try {
169             datacenter = new Datacenter(name, characteristics, new VmAllocationPolicySimple(hostList), storageList, 0);
170         } catch (Exception e) {
171             e.printStackTrace();
172         }
173 
174         return datacenter;
175     }
176     //创建代理
177     private static DatacenterBroker createBroker() {
178         DatacenterBroker broker = null;
179         try {
180             broker = new DatacenterBroker("Broker");
181         } catch (Exception e) {
182             e.printStackTrace();
183             return null;
184         }
185         return broker;
186     }
187     private static void printCloudletList(List<Cloudlet> list) {
188         int size = list.size();
189         Cloudlet cloudlet;
190 
191         String indent = "    ";
192         Log.printLine();
193         Log.printLine("========== OUTPUT ==========");
194         Log.printLine("Cloudlet ID" + indent + "STATUS" + indent
195                 + "Data center ID" + indent + "VM ID" + indent + "Time" + indent
196                 + "Start Time" + indent + "Finish Time");
197 
198         DecimalFormat dft = new DecimalFormat("###.##");
199         for (int i = 0; i < size; i++) {
200             cloudlet = list.get(i);
201             Log.print(indent + cloudlet.getCloudletId() + indent + indent);
202 
203             if (cloudlet.getCloudletStatus() == Cloudlet.SUCCESS) {
204                 Log.print("SUCCESS");
205 
206                 Log.printLine(indent + indent + cloudlet.getResourceId()
207                         + indent + indent + indent + cloudlet.getVmId()
208                         + indent + indent
209                         + dft.format(cloudlet.getActualCPUTime()) + indent
210                         + indent + dft.format(cloudlet.getExecStartTime())
211                         + indent + indent
212                         + dft.format(cloudlet.getFinishTime()));
213             }
214         }
215     }
216 }
MyCloudSim6.java

3、运行效果如下:

 

posted @ 2023-06-02 23:23  红酒人生  阅读(70)  评论(0编辑  收藏  举报