How to Allocate the Cloudlets Tasks in a Specific VM?
Share
Condition for Allocate the Cloudlets Tasks in a Specific VM
Description: To allocate cloudlets to specific virtual machines in CloudSim, you can assign the VM ID to each cloudlet using the setVmId method. This maps cloudlets to their designated VMs before submitting them to the broker. By setting the VM ID for each cloudlet, you ensure it runs on the specified VM. After mapping, submit the cloudlet list to the broker, and CloudSim will execute the cloudlets on the assigned VMs. This method provides precise control over cloudlet allocation, enabling the implementation of custom scheduling strategies and optimizing resource use.
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 CloudletAllocationSpecificVM {
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();
// 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");
}
}
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;
}
private static DatacenterBroker createBroker() {
DatacenterBroker broker = null;
try {
broker = new DatacenterBroker("Broker");
} catch (Exception e) {
e.printStackTrace();
}
return broker;
}
private static void printCloudletList(List list) {
String format = "%-15s%-10s%-10s%-15s%-15s%-15s%n";
System.out.printf(format, "Cloudlet ID", "Status", "VM ID", "Exec Time", "Start Time", "Finish Time");
DecimalFormat dft = new DecimalFormat("###.##");
for (Cloudlet cloudlet : list) {
String status = cloudlet.getStatus() == Cloudlet.SUCCESS ? "SUCCESS" : "FAILED";
System.out.printf(format,
cloudlet.getCloudletId(),
status,
cloudlet.getVmId(),
dft.format(cloudlet.getActualCPUTime()),
dft.format(cloudlet.getExecStartTime()),
dft.format(cloudlet.getFinishTime())
);
}
}
}