实例1
以 NetworkExample1 为例,该例子展示了如何创建一个有网络拓扑的数据中心并且在其上运行一个云任务。例子通过读取topology.brite 文件来构造网络拓扑。网络拓扑的信息包括节点的位置,节点间的有向边,边时延,边带宽等信息。能够模拟基于网络位置,时延,带宽等的网络环境,有效地计算网络传输造成的花销。与前面例子不同的是,网络编程需要调用 org.cloudbus.cloudsim.NetworkTopology 构造网络拓扑图,然后把 CloudSim 实体与拓扑图的节点进行映射。
public class NetworkExample1 {
private static final String NETWORK_TOPOLOGY_FILE = "topology.brite";
private static final int VM_PES = 1;
private final Datacenter datacenter0;
private final DatacenterBroker broker;
private List<Cloudlet> cloudletList;
private List<Vm> vmlist;
private CloudSim simulation;
public static void main(String[] args) {
new NetworkExample1();
}
private NetworkExample1() {
System.out.println("Starting " + getClass().getSimpleName());
vmlist = new ArrayList<>();
cloudletList = new ArrayList<>();
simulation = new CloudSim();
datacenter0 = createDatacenter();
broker = createBroker();
configureNetwork();
createAndSubmitVms(broker);
createAndSubmitCloudlets(broker);
simulation.start();
List<Cloudlet> newList = broker.getCloudletFinishedList();
new CloudletsTableBuilder(newList).build();
System.out.println(getClass().getSimpleName() + " finished!");
}
private void configureNetwork() {
// load the network topology file
BriteNetworkTopology networkTopology = BriteNetworkTopology.getInstance(NETWORK_TOPOLOGY_FILE);
simulation.setNetworkTopology(networkTopology);
// maps CloudSim entities to BRITE entities
// Datacenter will correspond to BRITE node 0
int briteNode = 0;
networkTopology.mapNode(datacenter0, briteNode);
// Broker will correspond to BRITE node 3
briteNode = 3;
networkTopology.mapNode(broker, briteNode);
}
private void createAndSubmitCloudlets(DatacenterBroker broker) {
final long length = 40000;
final long fileSize = 300;
final long outputSize = 300;
// The RAM, CPU and Bandwidth UtilizationModel.
final UtilizationModel utilizationModel = new UtilizationModelFull();
Cloudlet cloudlet1 = new CloudletSimple(length, VM_PES)
.setFileSize(fileSize)
.setOutputSize(outputSize)
.setUtilizationModel(utilizationModel);
// add the cloudlet to the list
cloudletList.add(cloudlet1);
// submit cloudlet list to the broker
broker.submitCloudletList(cloudletList);
}
private void createAndSubmitVms(DatacenterBroker broker) {
final int mips = 250;
final long size = 10000; //image size (Megabyte)
final int ram = 512; //vm memory (Megabyte)
final long bw = 1000; //in Megabits/s
Vm vm1 = new VmSimple(mips, VM_PES)
.setRam(ram)
.setBw(bw)
.setSize(size)
.setCloudletScheduler(new CloudletSchedulerTimeShared());
vmlist.add(vm1);
broker.submitVmList(vmlist);
}
private Datacenter createDatacenter() {
List<Host> hostList = new ArrayList<>();
List<Pe> peList = new ArrayList<>();
final long mips = 1000;
peList.add(new PeSimple(mips, new PeProvisionerSimple()));
final long ram = 2048; // in Megabytes
final long storage = 1000000; // in Megabytes
final long bw = 10000; //in Megabits/s
Host host = new HostSimple(ram, bw, storage, peList);
hostList.add(host);
return new DatacenterSimple(simulation, hostList, new VmAllocationPolicySimple());
}
/**
* Creates a DatacenterBroker.
*/
private DatacenterBroker createBroker() {
return new DatacenterBrokerSimple(simulation);
}
}
网络拓扑
topology.brite 如下:
Topology: ( 5 Nodes, 8 Edges )
Model (1 - RTWaxman): 5 5 5 1 2 0.15000000596046448 0.20000000298023224 1 1
10.0 1024.0
Nodes: ( 5 )
0 1 3 3 3 -1 RT_NODE
1 0 3 3 3 -1 RT_NODE
2 4 3 3 3 -1 RT_NODE
3 3 1 3 3 -1 RT_NODE
4 3 3 4 4 -1 RT_NODE
Edges: ( 8 )
0 2 0 3.0 1.1 10.0 -1 -1 E_RT U
1 2 1 4.0 2.1 10.0 -1 -1 E_RT U
2 3 0 2.8284271247461903 3.9 10.0 -1 -1 E_RT U
3 3 1 3.605551275463989 4.1 10.0 -1 -1 E_RT U
4 4 3 2.0 5.0 10.0 -1 -1 E_RT U
5 4 2 1.0 4.0 10.0 -1 -1 E_RT U
6 0 4 2.0 3.0 10.0 -1 -1 E_RT U
7 1 4 3.0 4.1 10.0 -1 -1 E_RT U
程序会寻找标记“Nodes:”和“Edges:”
- “Nodes”是节点信息,其中第一列是节点序号,第二列是节点的横坐标,第三列是纵坐标。
- “Edges”是边信息,第一列是边序号,第二列是始节点序号,第三列是终节点序号,第四列是边长度,第五列是边时延,第六列是边带宽。CloudSim 中只用到了以上信息。如此,我们就能构造自己需要的网络拓扑了。
仿真结果
运行仿真样例的结果如下:
INFO ================== Starting CloudSim Plus 6.3.7 ==================
INFO 0.00: DatacenterSimple1 is starting…
INFO DatacenterBrokerSimple2 is starting…
INFO Entities started.
INFO 0.00: DatacenterBrokerSimple2: List of 1 datacenters(s) received.
INFO 0.00: DatacenterBrokerSimple2: Trying to create Vm 0 in DatacenterSimple1
INFO 3.90: VmAllocationPolicySimple: Vm 0 has been allocated to Host 0/DC 1
INFO 7.90: DatacenterBrokerSimple2: Sending Cloudlet 0 to Vm 0 in Host 0/DC 1.
INFO 7.90: DatacenterBrokerSimple2: All waiting Cloudlets submitted to some VM.
INFO 171.80: DatacenterBrokerSimple2: Cloudlet 0 finished in Vm 0 and returned to broker.
INFO 171.91: Processing last events before simulation shutdown.
INFO 171.91: DatacenterBrokerSimple2 is shutting down…
INFO 171.91: DatacenterBrokerSimple2: Requesting Vm 0 destruction.
INFO 175.81: DatacenterSimple: Vm 0 destroyed on Host 0/DC 1.
INFO Simulation: No more future events
INFO CloudInformationService0: Notify all CloudSim Plus entities to shutdown.
INFO ================== Simulation finished at time 175.81 ==================
SIMULATION RESULTS
Cloudlet|Status |DC|Host|Host PEs |VM|VM PEs |CloudletLen|CloudletPEs|StartTime|FinishTime|ExecTime
ID| |ID| ID|CPU cores|ID|CPU cores| MI| CPU cores| Seconds| Seconds| Seconds
-----------------------------------------------------------------------------------------------------
0|SUCCESS| 1| 0| 1| 0| 1| 40000| 1| 12| 171| 159
-----------------------------------------------------------------------------------------------------
结果分析
实体之间的通信延迟是如何影响到模拟程序的clock
推演的呢?答案是CloudSimEntity.sendsend(final SimEntity dest, double delay, final int cloudSimTag, final Object data)
函数中调用了delay += getNetworkDelay(this, dest);
。具体而言,所有实体(包括DatacenterSimple1, DatacenterBrokerSimple2
)在向其它实体发送事件时,delay
参数中包含了通信延迟。即schedule(dest, delay, cloudSimTag, data);
由拓扑图可知,节点0到节点3之间的通信时间为3.9秒。
- 在3.9秒,
Vm 0 has been allocated to Host 0/DC 1
。因为在0秒时,DatacenterBrokerSimple2
提交了虚拟机创建请求,经过3.9秒的通信才到达DatacenterSimple1
。 - minTimeBetweenEvents为0.1,所以在
DatacenterBrokerSimple2
收到DC列表之后,Sending Cloudlet 0 to Vm 0 in Host 0/DC 1.
的时间为:3.9*2+0.1 = 7.9s - 任务执行花费(40000/250)=160s, 当
DatacenterBrokerSimple2
收到执行结果时,时间为:7.9+160+3.9=171.8s - 后续的1.1秒暂时未搞清楚。
实例2
构造网络拓扑
- DC1: Node=0
- DC2: Node = 2
- Broker: Node=3
实例代码
public class NetworkExample2 {
private static final String NETWORK_TOPOLOGY_FILE = "topology.brite";
private static final int VM_PES = 1;
private final List<Datacenter> datacenterList;
private final List<Cloudlet> cloudletList;
private final List<Vm> vmlist;
private final CloudSim simulation;
private final DatacenterBroker broker;
public static void main(String[] args) {
new NetworkExample2();
}
private NetworkExample2() {
System.out.println("Starting " + getClass().getSimpleName());
vmlist = new ArrayList<>();
cloudletList = new ArrayList<>();
datacenterList = new ArrayList<>();
simulation = new CloudSim();
for (int i = 0; i < 2; i++) {
datacenterList.add(createDatacenter());
}
broker = createBroker();
configureNetwork();
createAndSubmitVms();
createAndSubmitCloudlets();
simulation.start();
new CloudletsTableBuilder(broker.getCloudletFinishedList()).build();
System.out.println(getClass().getSimpleName() + " finished!");
}
private void configureNetwork() {
// Configures network by loading the network topology file
BriteNetworkTopology networkTopology = BriteNetworkTopology.getInstance(NETWORK_TOPOLOGY_FILE);
simulation.setNetworkTopology(networkTopology);
// Maps CloudSim entities to BRITE entities
// Datacenter1 will correspond to BRITE node 0
int briteNode = 0;
networkTopology.mapNode(datacenterList.get(0), briteNode);
// Datacenter2 will correspond to BRITE node 2
briteNode = 2;
networkTopology.mapNode(datacenterList.get(1), briteNode);
// Broker will correspond to BRITE node 3
briteNode = 3;
networkTopology.mapNode(broker, briteNode);
}
private void createAndSubmitCloudlets() {
final long length = 40000;
final long fileSize = 300;
final long outputSize = 300;
final UtilizationModel utilizationModel = new UtilizationModelFull();
Cloudlet cloudlet1 =
new CloudletSimple(length, VM_PES)
.setFileSize(fileSize)
.setOutputSize(outputSize)
.setUtilizationModel(utilizationModel);
Cloudlet cloudlet2 =
new CloudletSimple(length, VM_PES)
.setFileSize(fileSize)
.setOutputSize(outputSize)
.setUtilizationModel(utilizationModel);
cloudletList.add(cloudlet1);
cloudletList.add(cloudlet2);
broker.bindCloudletToVm(cloudletList.get(0), vmlist.get(0));
broker.bindCloudletToVm(cloudletList.get(0), vmlist.get(1));
broker.submitCloudletList(cloudletList);
}
private void createAndSubmitVms() {
final int mips = 250;
final long size = 10000; //image size (Megabyte)
final int ram = 512; //vm memory (Megabyte)
final long bw = 1000;
Vm vm1 = new VmSimple(mips, VM_PES).setRam(ram).setBw(bw).setSize(size);
Vm vm2 = new VmSimple(mips, VM_PES).setRam(ram).setBw(bw).setSize(size);
vmlist.add(vm1);
vmlist.add(vm2);
broker.submitVmList(vmlist);
}
private Datacenter createDatacenter() {
List<Host> hostList = new ArrayList<>();
List<Pe> peList = new ArrayList<>();
final long mips = 1000;
peList.add(new PeSimple(mips, new PeProvisionerSimple()));
final int ram = 2048; //host memory (Megabyte)
final long storage = 1000000; //host storage
final long bw = 10000;
Host host = new HostSimple(ram, bw, storage, peList);
hostList.add(host);
return new DatacenterSimple(simulation, hostList, new VmAllocationPolicySimple());
}
private DatacenterBroker createBroker() {
return new DatacenterBrokerSimple(simulation);
}
}
仿真结果
INFO ================== Starting CloudSim Plus 6.3.7 ==================
INFO 0.00: DatacenterSimple1 is starting…
INFO 0.00: DatacenterSimple2 is starting…
INFO DatacenterBrokerSimple3 is starting…
INFO Entities started.
INFO 0.00: DatacenterBrokerSimple3: List of 2 datacenters(s) received.
INFO 0.00: DatacenterBrokerSimple3: Trying to create Vm 0 in DatacenterSimple1
INFO 0.00: DatacenterBrokerSimple3: Trying to create Vm 1 in DatacenterSimple1
INFO 3.90: VmAllocationPolicySimple: Vm 0 has been allocated to Host 0/DC 1
WARN 3.90: VmAllocationPolicySimple: No suitable host found for Vm 1 in Datacenter 1
INFO 7.90: DatacenterBrokerSimple3: Trying to create Vm 1 in DatacenterSimple2 (due to lack of a suitable Host in previous one)
INFO 12.90: VmAllocationPolicySimple: Vm 1 has been allocated to Host 0/DC 2
INFO 18.00: DatacenterBrokerSimple3: Sending Cloudlet 0 to Vm 0 in Host 0/DC 1.
INFO 18.00: DatacenterBrokerSimple3: Sending Cloudlet 1 to Vm 1 in Host 0/DC 2.
INFO 18.00: DatacenterBrokerSimple3: All waiting Cloudlets submitted to some VM.
INFO 181.90: DatacenterBrokerSimple3: Cloudlet 0 finished in Vm 0 and returned to broker.
INFO 183.00: DatacenterBrokerSimple3: Cloudlet 1 finished in Vm 1 and returned to broker.
INFO 183.11: Processing last events before simulation shutdown.
INFO 183.11: DatacenterBrokerSimple3 is shutting down…
INFO 183.11: DatacenterBrokerSimple3: Requesting Vm 1 destruction.
INFO 183.11: DatacenterBrokerSimple3: Requesting Vm 0 destruction.
INFO 187.01: DatacenterSimple: Vm 0 destroyed on Host 0/DC 1.
INFO 188.11: DatacenterSimple: Vm 1 destroyed on Host 0/DC 2.
INFO Simulation: No more future events
INFO CloudInformationService0: Notify all CloudSim Plus entities to shutdown.
INFO 188.11: DatacenterSimple2 is shutting down…
INFO ================== Simulation finished at time 188.11 ==================
SIMULATION RESULTS
Cloudlet|Status |DC|Host|Host PEs |VM|VM PEs |CloudletLen|CloudletPEs|StartTime|FinishTime|ExecTime
ID| |ID| ID|CPU cores|ID|CPU cores| MI| CPU cores| Seconds| Seconds| Seconds
-----------------------------------------------------------------------------------------------------
0|SUCCESS| 1| 0| 1| 0| 1| 40000| 1| 22| 181| 159
1|SUCCESS| 2| 0| 1| 1| 1| 40000| 1| 23| 183| 160
-----------------------------------------------------------------------------------------------------