How to Create Multiple Brokers in Single Datacenter using Cloudsim?
Share
Condition for Multiple Brokers in Single Datacenter using Cloudsim
Description: In CloudSim, creating multiple brokers in a single data center involves setting up several DatacenterBroker instances, each managing its own VMs and cloudlets. After defining the data center with its characteristics, multiple brokers are instantiated to handle the scheduling of tasks. Each broker is assigned a specific set of VMs, and the brokers independently manage task execution. The VMs are submitted to the brokers, enabling parallel execution. When the simulation runs, each broker schedules tasks on its VMs, allowing for efficient workload distribution and resource management within the data center.
Sample Code
package multibroker;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;
import org.cloudbus.cloudsim.Cloudlet;
import org.cloudbus.cloudsim.CloudletSchedulerTimeShared;
import org.cloudbus.cloudsim.Datacenter;
import org.cloudbus.cloudsim.DatacenterBroker;
import org.cloudbus.cloudsim.DatacenterCharacteristics;
import org.cloudbus.cloudsim.Host;
import org.cloudbus.cloudsim.Log;
import org.cloudbus.cloudsim.Pe;
import org.cloudbus.cloudsim.Storage;
import org.cloudbus.cloudsim.UtilizationModel;
import org.cloudbus.cloudsim.UtilizationModelFull;
import org.cloudbus.cloudsim.Vm;
import org.cloudbus.cloudsim.VmAllocationPolicySimple;
import org.cloudbus.cloudsim.VmSchedulerTimeShared;
import org.cloudbus.cloudsim.core.CloudSim;
import org.cloudbus.cloudsim.provisioners.BwProvisionerSimple;
import org.cloudbus.cloudsim.provisioners.PeProvisionerSimple;
import org.cloudbus.cloudsim.provisioners.RamProvisionerSimple;
import java.util.*;
import org.cloudbus.cloudsim.VmSchedulerSpaceShared;
import org.cloudbus.cloudsim.examples.NewJFrame;
public class Multibroker {
/**
* The cloudlet list.
*/
private static List cloudletList;
static Random t = new Random();
static DatacenterBroker broker = null;
/**
* The vmlist.
*/
private static List vmlist;
/**
* Creates main() to run this example
* @param args
*/
public static void main(String[] args) {
Log.printLine("Starting CloudSimExample2...");
try {
// First step: Initialize the CloudSim package. It should be called
// before creating any entities.
int num_user = 1; // number of cloud users
Calendar calendar = Calendar.getInstance();
boolean trace_flag = false; // mean trace events
// Initialize the CloudSim library
CloudSim.init(num_user, calendar, trace_flag);
// Second step: Create Datacenters
//Datacenters are the resource providers in CloudSim. We need at list one of them to run a CloudSim simulation
@SuppressWarnings("unused")
Datacenter datacenter;
datacenter = createDatacenter("Datacenter_0");
int brokerId[] = new int[10];
//Third step: Create Broker
for (int i = 1; i <= 3; i++) {
broker = createBroker();
brokerId[i] = broker.getId();
System.out.println("broker id :" + brokerId[i]);
}
System.out.println("Start");
//Fourth step: Create one virtual machine
vmlist = new ArrayList();
//VM description
int vmid = 0;
double mips = 500;//BrokerConfiguration.Vmmips1;
long size = 1000;//BrokerConfiguration.storagesize1; //image size (MB)
int ram = 512;//BrokerConfiguration.VMram1; //vm memory (MB)
long bw = 1000;//BrokerConfiguration.VMBandwidth1;
int pesNumber = 1; //number of cpus
String vmm = "Xen"; //VMM name
int a[] = new int[5];
Vm vm1 = null, vm2 = null;
//create two VMs
// Random t = new Random();
for (int i = 1; i < 10; i++) {
// int j = t.nextInt(500);
vm1 = new Vm(i, brokerId[i], mips, pesNumber, ram, bw, size, vmm, new CloudletSchedulerTimeShared());
vmlist.add(vm1);
// System.out.println("random values are:" + j);
}
// vm2 = new Vm(2, brokerId, a[2], pesNumber, ram, bw, size, vmm, new CloudletSchedulerTimeShared());
//add the VMs to the vmList
// vmlist.add(vm2);
//submit vm list to the broker
//Fifth step: Create two Cloudlets
cloudletList = new ArrayList();
//Cloudlet properties
int id = 0;
pesNumber = 1;
long length =100000;// BrokerConfiguration.Cloudletlength1;
long fileSize = 300;//BrokerConfiguration.Cloudletfilesize1;
long outputSize = 300;//BrokerConfiguration.Cloudletoutputsize1;
UtilizationModel utilizationModel = new UtilizationModelFull();
for (int i = 0,j=0; i < 30&&j<3; i++,j++) {
Cloudlet cloudlet = new Cloudlet(i, length, pesNumber, fileSize, outputSize, utilizationModel, utilizationModel, utilizationModel);
cloudlet.setUserId(brokerId[j]);
cloudletList.add(cloudlet);
}
//add the cloudlets to the list
//submit cloudlet list to the broker
broker.submitVmList(vmlist);
broker.submitCloudletList(cloudletList);
//bind the cloudlets to the vms. This way, the broker
// will submit the bound cloudlets only to the specific VM
// for(int i=1,j=1;i<=10&&j<=30;i++,j++)
// {
// broker.bindCloudletToVm(cloudlet.getCloudletId(), vm1.getId());
// }
// broker.bindCloudletToVm(cloudlet2.getCloudletId(), vm2.getId());
// Sixth step: Starts the simulation
CloudSim.startSimulation();
// Final step: Print results when simulation is over
List newList = broker.getCloudletReceivedList();
CloudSim.stopSimulation();
printCloudletList(newList);
Log.printLine("CloudSimExample2 finished!");
} catch (Exception e) {
Log.printLine("The simulation has been terminated due to an unexpected error");
}
}
private static Datacenter createDatacenter(String name) {
// Here are the steps needed to create a PowerDatacenter:
// 1. We need to create a list to store
// our machine
List hostList = new ArrayList();
// 2. A Machine contains one or more PEs or CPUs/Cores.
// In this example, it will have only one core.
List peList = new ArrayList();
int mips = 30000;
// for (int i = 1; i < BrokerConfiguration.HostPes1; i++) {
// int k = t.nextInt(BrokerConfiguration.Hostmips1);
// System.out.println("host mips random values are" + k);
peList.add(new Pe(0, new PeProvisionerSimple(mips))); // need to store Pe id and MIPS Rating
// }
// 3. Create PEs and add these into a list.
// peList.add(new Pe(0, new PeProvisionerSimple((mips)))); // need to store Pe id and MIPS Rating
//4. Create Host with its id and list of PEs and add them to the list of machines
int hostId = 0;
int ram = 10000;//BrokerConfiguration.Hostram1; //host memory (MB)
long storage = 100000;//BrokerConfiguration.Hoststorage1; //host storage
int bw =20480;// BrokerConfiguration.Hostbandwidth1;
for (int i = 1; i <= 3; i++) {
hostList.add(
new Host(
i,
new RamProvisionerSimple(ram),
new BwProvisionerSimple(bw),
storage,
peList,
new VmSchedulerSpaceShared(peList)
)
);
}
// System.out.println("*************host configuration***************:");
// System.out.println("host id:" + i);
// System.out.println("host Mips:" + mips);
// System.out.println("host ram:" + ram);
// System.out.println("host bandwidth:" + bw);
// System.out.println("host storage:" + storage);
// }
// 5. Create a DatacenterCharacteristics object that stores the
// properties of a data center: architecture, OS, list of
// Machines, allocation policy: time- or space-shared, time zone
// and its price (G$/Pe time unit).
String arch = "x86"; // system architecture
String os = "Linux"; // operating system
String vmm = "Xen";
double time_zone = 10.0; // time zone this resource located
double cost = 3.0; // the cost of using processing in this resource
double costPerMem = 0.05; // the cost of using memory in this resource
double costPerStorage = 0.001; // the cost of using storage in this resource
double costPerBw = 0.0; // the cost of using bw in this resource
LinkedList storageList = new LinkedList<>(); //we are not adding SAN devices by now
DatacenterCharacteristics characteristics = new DatacenterCharacteristics(
arch, os, vmm, hostList, time_zone, cost, costPerMem, costPerStorage, costPerBw);
// 6. Finally, we need to create a PowerDatacenter object.
Datacenter datacenter = null;
try {
datacenter = new Datacenter(name, characteristics, new VmAllocationPolicySimple(hostList), storageList, 0);
} catch (Exception e) {
}
return datacenter;
}
//We strongly encourage users to develop their own broker policies, to submit vms and cloudlets according
//to the specific rules of the simulated scenario
private static DatacenterBroker createBroker() {
DatacenterBroker broker = null;
try {
broker = new DatacenterBroker("Broker");
} catch (Exception e) {
return null;
}
return broker;
}
/**
* Prints the Cloudlet objects
*
* @param list list of Cloudlets
*/
private static void printCloudletList(List list) {
int size = list.size();
Cloudlet cloudlet;
String indent = " ";
Log.printLine();
Log.printLine("========== OUTPUT ==========");
Log.printLine("Cloudlet ID" + indent + "STATUS" + indent
+ "Data center ID" + indent + "VM ID" + indent + "Time" + indent + "Start Time" + indent + "Finish Time");
DecimalFormat dft = new DecimalFormat("###.##");
for (int i = 0; i < size; i++) {
cloudlet = list.get(i);
Log.print(indent + cloudlet.getCloudletId() + indent + indent);
if (cloudlet.getCloudletStatus() == Cloudlet.SUCCESS) {
Log.print("SUCCESS");
Log.printLine(indent + indent + cloudlet.getResourceId() + indent + indent + indent + cloudlet.getVmId()
+ indent + indent + dft.format(cloudlet.getActualCPUTime()) + indent + indent + dft.format(cloudlet.getExecStartTime())
+ indent + indent + dft.format(cloudlet.getFinishTime()));
}
}
}
}
Step 1
To set the environment for multiple broker creation.
Step 2
To put the Host, Virtual machine, cloudlet and broker configurations.
Step 3
To simulate the broker configurations.
Step 4
To set the broker number, number of virtual machines and number of cloudlets.
Step 5
To create a datacenter for multiple broker.
Step 6
To simulate the result of multiple broker.
Step 7
To get the results for Host and virtual machines.
Step 8
To get the cloudlet results of creating multiple brokers.