initial commit of EdgeCloudSim
EdgeCloudSim with default network model, mobility model, load generator model, edge orchestrator, and VM CPU utilization model
This commit is contained in:
@@ -0,0 +1,199 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Basic Edge Orchestrator implementation
|
||||
*
|
||||
* Description:
|
||||
* BasicEdgeOrchestrator implements basic algorithms which are
|
||||
* first/next/best/worst/random fit algorithms while assigning
|
||||
* requests to the edge devices.
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.edge_orchestrator;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.cloudbus.cloudsim.core.CloudSim;
|
||||
|
||||
import edu.boun.edgecloudsim.core.SimManager;
|
||||
import edu.boun.edgecloudsim.core.SimSettings;
|
||||
import edu.boun.edgecloudsim.core.SimSettings.SCENARIO_TYPES;
|
||||
import edu.boun.edgecloudsim.edge_server.EdgeVM;
|
||||
import edu.boun.edgecloudsim.edge_client.CpuUtilizationModel_Custom;
|
||||
import edu.boun.edgecloudsim.edge_client.Task;
|
||||
import edu.boun.edgecloudsim.utils.Location;
|
||||
import edu.boun.edgecloudsim.utils.SimUtils;
|
||||
|
||||
public class BasicEdgeOrchestrator extends EdgeOrchestrator {
|
||||
private int numberOfHost; //used by load balancer
|
||||
private int lastSelectedHostIndex; //used by load balancer
|
||||
private int[] lastSelectedVmIndexes; //used by each host individually
|
||||
|
||||
public BasicEdgeOrchestrator(String _policy,
|
||||
SCENARIO_TYPES _simScenario) {
|
||||
super(_policy, _simScenario);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
numberOfHost=SimSettings.getInstance().getNumOfEdgeHosts();
|
||||
|
||||
lastSelectedHostIndex = -1;
|
||||
lastSelectedVmIndexes = new int[numberOfHost];
|
||||
for(int i=0; i<numberOfHost; i++)
|
||||
lastSelectedVmIndexes[i] = -1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public EdgeVM selectVm(Task task) {
|
||||
if(simScenario == SimSettings.SCENARIO_TYPES.TWO_TIER_WITH_EO)
|
||||
return selectVmOnLoadBalancer(task);
|
||||
else
|
||||
return selectVmOnHost(task);
|
||||
}
|
||||
|
||||
public EdgeVM selectVmOnHost(Task task){
|
||||
EdgeVM selectedVM = null;
|
||||
|
||||
Location deviceLocation = SimManager.getInstance().getMobilityModel().getLocation(task.getMobileDeviceId(), CloudSim.clock());
|
||||
//in our scenasrio, serving wlan ID is equal to the host id
|
||||
//because there is only one host in one place
|
||||
int relatedHostId=deviceLocation.getServingWlanId();
|
||||
List<EdgeVM> vmArray = SimManager.getInstance().getLocalServerManager().getVmList(relatedHostId);
|
||||
|
||||
if(policy.equalsIgnoreCase("RANDOM_FIT")){
|
||||
int randomIndex = SimUtils.getRandomNumber(0, vmArray.size()-1);
|
||||
double requiredCapacity = ((CpuUtilizationModel_Custom)task.getUtilizationModelCpu()).predictUtilization(vmArray.get(randomIndex).getVmType());
|
||||
double targetVmCapacity = (double)100 - vmArray.get(randomIndex).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
|
||||
if(requiredCapacity <= targetVmCapacity)
|
||||
selectedVM = vmArray.get(randomIndex);
|
||||
}
|
||||
else if(policy.equalsIgnoreCase("WORST_FIT")){
|
||||
double selectedVmCapacity = 0; //start with min value
|
||||
for(int vmIndex=0; vmIndex<vmArray.size(); vmIndex++){
|
||||
double requiredCapacity = ((CpuUtilizationModel_Custom)task.getUtilizationModelCpu()).predictUtilization(vmArray.get(vmIndex).getVmType());
|
||||
double targetVmCapacity = (double)100 - vmArray.get(vmIndex).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
|
||||
if(requiredCapacity <= targetVmCapacity && targetVmCapacity > selectedVmCapacity){
|
||||
selectedVM = vmArray.get(vmIndex);
|
||||
selectedVmCapacity = targetVmCapacity;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(policy.equalsIgnoreCase("BEST_FIT")){
|
||||
double selectedVmCapacity = 101; //start with max value
|
||||
for(int vmIndex=0; vmIndex<vmArray.size(); vmIndex++){
|
||||
double requiredCapacity = ((CpuUtilizationModel_Custom)task.getUtilizationModelCpu()).predictUtilization(vmArray.get(vmIndex).getVmType());
|
||||
double targetVmCapacity = (double)100 - vmArray.get(vmIndex).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
|
||||
if(requiredCapacity <= targetVmCapacity && targetVmCapacity < selectedVmCapacity){
|
||||
selectedVM = vmArray.get(vmIndex);
|
||||
selectedVmCapacity = targetVmCapacity;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(policy.equalsIgnoreCase("FIRST_FIT")){
|
||||
for(int vmIndex=0; vmIndex<vmArray.size(); vmIndex++){
|
||||
double requiredCapacity = ((CpuUtilizationModel_Custom)task.getUtilizationModelCpu()).predictUtilization(vmArray.get(vmIndex).getVmType());
|
||||
double targetVmCapacity = (double)100 - vmArray.get(vmIndex).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
|
||||
if(requiredCapacity <= targetVmCapacity){
|
||||
selectedVM = vmArray.get(vmIndex);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(policy.equalsIgnoreCase("NEXT_FIT")){
|
||||
int tries = 0;
|
||||
while(tries < vmArray.size()){
|
||||
lastSelectedVmIndexes[relatedHostId] = (lastSelectedVmIndexes[relatedHostId]+1) % vmArray.size();
|
||||
double requiredCapacity = ((CpuUtilizationModel_Custom)task.getUtilizationModelCpu()).predictUtilization(vmArray.get(lastSelectedVmIndexes[relatedHostId]).getVmType());
|
||||
double targetVmCapacity = (double)100 - vmArray.get(lastSelectedVmIndexes[relatedHostId]).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
|
||||
if(requiredCapacity <= targetVmCapacity){
|
||||
selectedVM = vmArray.get(lastSelectedVmIndexes[relatedHostId]);
|
||||
break;
|
||||
}
|
||||
tries++;
|
||||
}
|
||||
}
|
||||
|
||||
return selectedVM;
|
||||
}
|
||||
|
||||
public EdgeVM selectVmOnLoadBalancer(Task task){
|
||||
EdgeVM selectedVM = null;
|
||||
|
||||
if(policy.equalsIgnoreCase("RANDOM_FIT")){
|
||||
int randomHostIndex = SimUtils.getRandomNumber(0, numberOfHost-1);
|
||||
List<EdgeVM> vmArray = SimManager.getInstance().getLocalServerManager().getVmList(randomHostIndex);
|
||||
int randomIndex = SimUtils.getRandomNumber(0, vmArray.size()-1);
|
||||
|
||||
double requiredCapacity = ((CpuUtilizationModel_Custom)task.getUtilizationModelCpu()).predictUtilization(vmArray.get(randomIndex).getVmType());
|
||||
double targetVmCapacity = (double)100 - vmArray.get(randomIndex).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
|
||||
if(requiredCapacity <= targetVmCapacity)
|
||||
selectedVM = vmArray.get(randomIndex);
|
||||
}
|
||||
else if(policy.equalsIgnoreCase("WORST_FIT")){
|
||||
double selectedVmCapacity = 0; //start with min value
|
||||
for(int hostIndex=0; hostIndex<numberOfHost; hostIndex++){
|
||||
List<EdgeVM> vmArray = SimManager.getInstance().getLocalServerManager().getVmList(hostIndex);
|
||||
for(int vmIndex=0; vmIndex<vmArray.size(); vmIndex++){
|
||||
double requiredCapacity = ((CpuUtilizationModel_Custom)task.getUtilizationModelCpu()).predictUtilization(vmArray.get(vmIndex).getVmType());
|
||||
double targetVmCapacity = (double)100 - vmArray.get(vmIndex).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
|
||||
if(requiredCapacity <= targetVmCapacity && targetVmCapacity > selectedVmCapacity){
|
||||
selectedVM = vmArray.get(vmIndex);
|
||||
selectedVmCapacity = targetVmCapacity;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(policy.equalsIgnoreCase("BEST_FIT")){
|
||||
double selectedVmCapacity = 101; //start with max value
|
||||
for(int hostIndex=0; hostIndex<numberOfHost; hostIndex++){
|
||||
List<EdgeVM> vmArray = SimManager.getInstance().getLocalServerManager().getVmList(hostIndex);
|
||||
for(int vmIndex=0; vmIndex<vmArray.size(); vmIndex++){
|
||||
double requiredCapacity = ((CpuUtilizationModel_Custom)task.getUtilizationModelCpu()).predictUtilization(vmArray.get(vmIndex).getVmType());
|
||||
double targetVmCapacity = (double)100 - vmArray.get(vmIndex).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
|
||||
if(requiredCapacity <= targetVmCapacity && targetVmCapacity < selectedVmCapacity){
|
||||
selectedVM = vmArray.get(vmIndex);
|
||||
selectedVmCapacity = targetVmCapacity;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(policy.equalsIgnoreCase("FIRST_FIT")){
|
||||
for(int hostIndex=0; hostIndex<numberOfHost; hostIndex++){
|
||||
List<EdgeVM> vmArray = SimManager.getInstance().getLocalServerManager().getVmList(hostIndex);
|
||||
for(int vmIndex=0; vmIndex<vmArray.size(); vmIndex++){
|
||||
double requiredCapacity = ((CpuUtilizationModel_Custom)task.getUtilizationModelCpu()).predictUtilization(vmArray.get(vmIndex).getVmType());
|
||||
double targetVmCapacity = (double)100 - vmArray.get(vmIndex).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
|
||||
if(requiredCapacity <= targetVmCapacity){
|
||||
selectedVM = vmArray.get(vmIndex);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(policy.equalsIgnoreCase("NEXT_FIT")){
|
||||
int hostCheckCounter = 0;
|
||||
while(selectedVM == null && hostCheckCounter < numberOfHost){
|
||||
int tries = 0;
|
||||
lastSelectedHostIndex = (lastSelectedHostIndex+1) % numberOfHost;
|
||||
|
||||
List<EdgeVM> vmArray = SimManager.getInstance().getLocalServerManager().getVmList(lastSelectedHostIndex);
|
||||
while(tries < vmArray.size()){
|
||||
lastSelectedVmIndexes[lastSelectedHostIndex] = (lastSelectedVmIndexes[lastSelectedHostIndex]+1) % vmArray.size();
|
||||
double requiredCapacity = ((CpuUtilizationModel_Custom)task.getUtilizationModelCpu()).predictUtilization(vmArray.get(lastSelectedVmIndexes[lastSelectedHostIndex]).getVmType());
|
||||
double targetVmCapacity = (double)100 - vmArray.get(lastSelectedVmIndexes[lastSelectedHostIndex]).getCloudletScheduler().getTotalUtilizationOfCpu(CloudSim.clock());
|
||||
if(requiredCapacity <= targetVmCapacity){
|
||||
selectedVM = vmArray.get(lastSelectedVmIndexes[lastSelectedHostIndex]);
|
||||
break;
|
||||
}
|
||||
tries++;
|
||||
}
|
||||
|
||||
hostCheckCounter++;
|
||||
}
|
||||
}
|
||||
|
||||
return selectedVM;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Title: EdgeCloudSim - Edge Orchestrator
|
||||
*
|
||||
* Description:
|
||||
* EdgeOrchestrator is an abstract class which is used for selecting VM
|
||||
* for each client requests. For those who wants to add a custom
|
||||
* Edge Orchestrator to EdgeCloudSim should extend this class and provide
|
||||
* a concreate instance via ScenarioFactory
|
||||
*
|
||||
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
||||
* Copyright (c) 2017, Bogazici University, Istanbul, Turkey
|
||||
*/
|
||||
|
||||
package edu.boun.edgecloudsim.edge_orchestrator;
|
||||
|
||||
import edu.boun.edgecloudsim.core.SimSettings;
|
||||
import edu.boun.edgecloudsim.edge_server.EdgeVM;
|
||||
import edu.boun.edgecloudsim.edge_client.Task;
|
||||
|
||||
public abstract class EdgeOrchestrator {
|
||||
protected String policy;
|
||||
protected SimSettings.SCENARIO_TYPES simScenario;
|
||||
|
||||
public EdgeOrchestrator(String _policy, SimSettings.SCENARIO_TYPES _simScenario){
|
||||
policy = _policy;
|
||||
simScenario = _simScenario;
|
||||
}
|
||||
|
||||
/*
|
||||
* initialize edge orchestrator if needed
|
||||
*/
|
||||
public abstract void initialize();
|
||||
|
||||
/*
|
||||
* returns proper VM from the related edge orchestrator point of view
|
||||
*/
|
||||
public abstract EdgeVM selectVm(Task task);
|
||||
}
|
||||
Reference in New Issue
Block a user