Description: In CloudSim, cloudlet/task allocation to VMs is managed by the DatacenterBroker, which decides which cloudlet is allocated to which VM based on factors like VM capacity and cloudlet requirements. To customize this process, you can extend the DatacenterBroker class and override the submitCloudlets() method. In this method, you can calculate the expected execution time of each cloudlet on all VMs, considering factors like cloudlet length, input size, and VM processing power. The broker then selects the VM with the minimum execution time, ensuring efficient allocation and optimal resource usage.
Sample Code
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.core.CloudSim;
import org.cloudbus.cloudsim.provisioners.BwProvisionerSimple;
import org.cloudbus.cloudsim.provisioners.PeProvisionerSimple;
import org.cloudbus.cloudsim.provisioners.RamProvisionerSimple;
import org.cloudbus.cloudsim.VmSchedulerTimeShared;
import org.cloudbus.cloudsim.VmAllocationPolicySimple;
/**
* A simple example showing how to allocate cloudlets to VMs and run a
* simulation.
*/
public class CloudletAllocationExample {
private static List cloudletList;
private static List vmlist;
public static void main(String[] args) {
Log.printLine("Starting Cloudlet Allocation Example...");
try {
// Initialize CloudSim
int num_user = 1; // number of cloud users
Calendar calendar = Calendar.getInstance(); // Current date and time
boolean trace_flag = false; // trace events
CloudSim.init(num_user, calendar, trace_flag);
// Create Datacenter
Datacenter datacenter0 = createDatacenter("Datacenter_0");
// Create Broker
DatacenterBroker broker = createBroker();
int brokerId = broker.getId();
// Create Virtual Machines (VMs)
vmlist = new ArrayList();
int vmid = 0;
int mips = 1000;
long size = 10000; // image size (MB)
int ram = 512; // VM memory (MB)
long bw = 1000; // bandwidth (Mbps)
int pesNumber = 1; // number of CPUs
String vmm = "Xen"; // Virtual Machine Monitor name
// Create 2 VMs
Vm vm1 = new Vm(vmid++, brokerId, mips, pesNumber, ram, bw, size, vmm, new CloudletSchedulerTimeShared());
Vm vm2 = new Vm(vmid++, brokerId, mips, pesNumber, ram, bw, size, vmm, new CloudletSchedulerTimeShared());
vmlist.add(vm1);
vmlist.add(vm2);
// Submit VMs to the broker
broker.submitVmList(vmlist);
// Create Cloudlets (Tasks)
cloudletList = new ArrayList();
int cloudletId = 0;
long length = 400000;
long fileSize = 300;
long outputSize = 300;
UtilizationModel utilizationModel = new UtilizationModelFull();
// Create 3 cloudlets
Cloudlet cloudlet1 = new Cloudlet(cloudletId++, length, pesNumber, fileSize, outputSize, utilizationModel, utilizationModel, utilizationModel);
Cloudlet cloudlet2 = new Cloudlet(cloudletId++, length, pesNumber, fileSize, outputSize, utilizationModel, utilizationModel, utilizationModel);
Cloudlet cloudlet3 = new Cloudlet(cloudletId++, length, pesNumber, fileSize, outputSize, utilizationModel, utilizationModel, utilizationModel);
cloudlet1.setUserId(brokerId);
cloudlet2.setUserId(brokerId);
cloudlet3.setUserId(brokerId);
cloudlet1.setVmId(vm1.getId()); // Assign to VM1
cloudlet2.setVmId(vm1.getId()); // Assign to VM1
cloudlet3.setVmId(vm2.getId()); // Assign to VM2
cloudletList.add(cloudlet1);
cloudletList.add(cloudlet2);
cloudletList.add(cloudlet3);
// Submit cloudlets to the broker
broker.submitCloudletList(cloudletList);
// Start the simulation
CloudSim.startSimulation();
Log.printLine(" ");
// Retrieve results
List newList = broker.getCloudletReceivedList();
printCloudletList(newList);
CloudSim.stopSimulation();
Log.printLine("Cloudlet Allocation Example finished!");
} catch (Exception e) {
e.printStackTrace();
Log.printLine("Unwanted errors happen");
}
}
/**
* Creates the datacenter.
*
* @param name the name of the datacenter
* @return the created datacenter
*/
private static Datacenter createDatacenter(String name) {
List hostList = new ArrayList();
List peList = new ArrayList();
int mips = 1000;
peList.add(new Pe(0, new PeProvisionerSimple(mips)));
int hostId = 0;
int ram = 2048;
long storage = 1000000;
int bw = 10000;
hostList.add(new Host(hostId, new RamProvisionerSimple(ram), new BwProvisionerSimple(bw),
storage, peList, new VmSchedulerTimeShared(peList)));
String arch = "x86";
String os = "Linux";
String vmm = "Xen";
double timeZone = 10.0;
double cost = 3.0;
double costPerMem = 0.05;
double costPerStorage = 0.001;
double costPerBw = 0.0;
LinkedList storageList = new LinkedList();
DatacenterCharacteristics characteristics = new DatacenterCharacteristics(arch, os, vmm, hostList, timeZone, cost, costPerMem, costPerStorage, costPerBw);
Datacenter datacenter = null;
try {
datacenter = new Datacenter(name, characteristics, new VmAllocationPolicySimple(hostList), storageList, 0);
} catch (Exception e) {
e.printStackTrace();
}
return datacenter;
}
/**
* Creates the broker.
*
* @return the broker
*/
private static DatacenterBroker createBroker() {
DatacenterBroker broker = null;
try {
broker = new DatacenterBroker("Broker");
} catch (Exception e) {
e.printStackTrace();
}
return broker;
}
/**
* Prints the cloudlet list.
*
* @param list the list of cloudlets
*/
private static void printCloudletList(List list) {
int size = list.size();
Cloudlet cloudlet;
String indent = " ";
Log.printLine();
Log.printLine("Cloudlet ID" + indent + "Status" + 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 + cloudlet.getStatus() + indent + cloudlet.getVmId() + indent
+ dft.format(cloudlet.getActualCPUTime()) + indent + dft.format(cloudlet.getExecStartTime()) + indent
+ dft.format(cloudlet.getFinishTime()));
}
}
}