305 lines
7.8 KiB
Java
305 lines
7.8 KiB
Java
/*
|
|
* Title: CloudSim Toolkit
|
|
* Description: CloudSim (Cloud Simulation) Toolkit for Modeling and Simulation of Clouds
|
|
* Licence: GPL - http://www.gnu.org/copyleft/gpl.html
|
|
*
|
|
* Copyright (c) 2009-2012, The University of Melbourne, Australia
|
|
*/
|
|
|
|
package org.cloudbus.cloudsim;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.LinkedList;
|
|
import java.util.List;
|
|
|
|
import org.cloudbus.cloudsim.core.CloudSim;
|
|
import org.cloudbus.cloudsim.lists.PeList;
|
|
import org.cloudbus.cloudsim.provisioners.BwProvisioner;
|
|
import org.cloudbus.cloudsim.provisioners.RamProvisioner;
|
|
|
|
/**
|
|
* The class of a host supporting dynamic workloads and performance degradation.
|
|
*
|
|
* @author Anton Beloglazov
|
|
* @since CloudSim Toolkit 2.0
|
|
*/
|
|
public class HostDynamicWorkload extends Host {
|
|
|
|
/** The utilization mips. */
|
|
private double utilizationMips;
|
|
|
|
/** The previous utilization mips. */
|
|
private double previousUtilizationMips;
|
|
|
|
/** The state history. */
|
|
private final List<HostStateHistoryEntry> stateHistory = new LinkedList<HostStateHistoryEntry>();
|
|
|
|
/**
|
|
* Instantiates a new host.
|
|
*
|
|
* @param id the id
|
|
* @param ramProvisioner the ram provisioner
|
|
* @param bwProvisioner the bw provisioner
|
|
* @param storage the storage
|
|
* @param peList the pe list
|
|
* @param vmScheduler the VM scheduler
|
|
*/
|
|
public HostDynamicWorkload(
|
|
int id,
|
|
RamProvisioner ramProvisioner,
|
|
BwProvisioner bwProvisioner,
|
|
long storage,
|
|
List<? extends Pe> peList,
|
|
VmScheduler vmScheduler) {
|
|
super(id, ramProvisioner, bwProvisioner, storage, peList, vmScheduler);
|
|
setUtilizationMips(0);
|
|
setPreviousUtilizationMips(0);
|
|
}
|
|
|
|
/*
|
|
* (non-Javadoc)
|
|
* @see cloudsim.Host#updateVmsProcessing(double)
|
|
*/
|
|
@Override
|
|
public double updateVmsProcessing(double currentTime) {
|
|
double smallerTime = super.updateVmsProcessing(currentTime);
|
|
setPreviousUtilizationMips(getUtilizationMips());
|
|
setUtilizationMips(0);
|
|
double hostTotalRequestedMips = 0;
|
|
|
|
for (Vm vm : getVmList()) {
|
|
getVmScheduler().deallocatePesForVm(vm);
|
|
}
|
|
|
|
for (Vm vm : getVmList()) {
|
|
getVmScheduler().allocatePesForVm(vm, vm.getCurrentRequestedMips());
|
|
}
|
|
|
|
for (Vm vm : getVmList()) {
|
|
double totalRequestedMips = vm.getCurrentRequestedTotalMips();
|
|
double totalAllocatedMips = getVmScheduler().getTotalAllocatedMipsForVm(vm);
|
|
|
|
if (!Log.isDisabled()) {
|
|
Log.formatLine(
|
|
"%.2f: [Host #" + getId() + "] Total allocated MIPS for VM #" + vm.getId()
|
|
+ " (Host #" + vm.getHost().getId()
|
|
+ ") is %.2f, was requested %.2f out of total %.2f (%.2f%%)",
|
|
CloudSim.clock(),
|
|
totalAllocatedMips,
|
|
totalRequestedMips,
|
|
vm.getMips(),
|
|
totalRequestedMips / vm.getMips() * 100);
|
|
|
|
List<Pe> pes = getVmScheduler().getPesAllocatedForVM(vm);
|
|
StringBuilder pesString = new StringBuilder();
|
|
for (Pe pe : pes) {
|
|
pesString.append(String.format(" PE #" + pe.getId() + ": %.2f.", pe.getPeProvisioner()
|
|
.getTotalAllocatedMipsForVm(vm)));
|
|
}
|
|
Log.formatLine(
|
|
"%.2f: [Host #" + getId() + "] MIPS for VM #" + vm.getId() + " by PEs ("
|
|
+ getNumberOfPes() + " * " + getVmScheduler().getPeCapacity() + ")."
|
|
+ pesString,
|
|
CloudSim.clock());
|
|
}
|
|
|
|
if (getVmsMigratingIn().contains(vm)) {
|
|
Log.formatLine("%.2f: [Host #" + getId() + "] VM #" + vm.getId()
|
|
+ " is being migrated to Host #" + getId(), CloudSim.clock());
|
|
} else {
|
|
if (totalAllocatedMips + 0.1 < totalRequestedMips) {
|
|
Log.formatLine("%.2f: [Host #" + getId() + "] Under allocated MIPS for VM #" + vm.getId()
|
|
+ ": %.2f", CloudSim.clock(), totalRequestedMips - totalAllocatedMips);
|
|
}
|
|
|
|
vm.addStateHistoryEntry(
|
|
currentTime,
|
|
totalAllocatedMips,
|
|
totalRequestedMips,
|
|
(vm.isInMigration() && !getVmsMigratingIn().contains(vm)));
|
|
|
|
if (vm.isInMigration()) {
|
|
Log.formatLine(
|
|
"%.2f: [Host #" + getId() + "] VM #" + vm.getId() + " is in migration",
|
|
CloudSim.clock());
|
|
totalAllocatedMips /= 0.9; // performance degradation due to migration - 10%
|
|
}
|
|
}
|
|
|
|
setUtilizationMips(getUtilizationMips() + totalAllocatedMips);
|
|
hostTotalRequestedMips += totalRequestedMips;
|
|
}
|
|
|
|
addStateHistoryEntry(
|
|
currentTime,
|
|
getUtilizationMips(),
|
|
hostTotalRequestedMips,
|
|
(getUtilizationMips() > 0));
|
|
|
|
return smallerTime;
|
|
}
|
|
|
|
/**
|
|
* Gets the completed vms.
|
|
*
|
|
* @return the completed vms
|
|
*/
|
|
public List<Vm> getCompletedVms() {
|
|
List<Vm> vmsToRemove = new ArrayList<Vm>();
|
|
for (Vm vm : getVmList()) {
|
|
if (vm.isInMigration()) {
|
|
continue;
|
|
}
|
|
if (vm.getCurrentRequestedTotalMips() == 0) {
|
|
vmsToRemove.add(vm);
|
|
}
|
|
}
|
|
return vmsToRemove;
|
|
}
|
|
|
|
/**
|
|
* Gets the max utilization among by all PEs.
|
|
*
|
|
* @return the utilization
|
|
*/
|
|
public double getMaxUtilization() {
|
|
return PeList.getMaxUtilization(getPeList());
|
|
}
|
|
|
|
/**
|
|
* Gets the max utilization among by all PEs allocated to the VM.
|
|
*
|
|
* @param vm the vm
|
|
* @return the utilization
|
|
*/
|
|
public double getMaxUtilizationAmongVmsPes(Vm vm) {
|
|
return PeList.getMaxUtilizationAmongVmsPes(getPeList(), vm);
|
|
}
|
|
|
|
/**
|
|
* Gets the utilization of memory.
|
|
*
|
|
* @return the utilization of memory
|
|
*/
|
|
public double getUtilizationOfRam() {
|
|
return getRamProvisioner().getUsedRam();
|
|
}
|
|
|
|
/**
|
|
* Gets the utilization of bw.
|
|
*
|
|
* @return the utilization of bw
|
|
*/
|
|
public double getUtilizationOfBw() {
|
|
return getBwProvisioner().getUsedBw();
|
|
}
|
|
|
|
/**
|
|
* Get current utilization of CPU in percentage.
|
|
*
|
|
* @return current utilization of CPU in percents
|
|
*/
|
|
public double getUtilizationOfCpu() {
|
|
double utilization = getUtilizationMips() / getTotalMips();
|
|
if (utilization > 1 && utilization < 1.01) {
|
|
utilization = 1;
|
|
}
|
|
return utilization;
|
|
}
|
|
|
|
/**
|
|
* Gets the previous utilization of CPU in percentage.
|
|
*
|
|
* @return the previous utilization of cpu
|
|
*/
|
|
public double getPreviousUtilizationOfCpu() {
|
|
double utilization = getPreviousUtilizationMips() / getTotalMips();
|
|
if (utilization > 1 && utilization < 1.01) {
|
|
utilization = 1;
|
|
}
|
|
return utilization;
|
|
}
|
|
|
|
/**
|
|
* Get current utilization of CPU in MIPS.
|
|
*
|
|
* @return current utilization of CPU in MIPS
|
|
*/
|
|
public double getUtilizationOfCpuMips() {
|
|
return getUtilizationMips();
|
|
}
|
|
|
|
/**
|
|
* Gets the utilization mips.
|
|
*
|
|
* @return the utilization mips
|
|
*/
|
|
public double getUtilizationMips() {
|
|
return utilizationMips;
|
|
}
|
|
|
|
/**
|
|
* Sets the utilization mips.
|
|
*
|
|
* @param utilizationMips the new utilization mips
|
|
*/
|
|
protected void setUtilizationMips(double utilizationMips) {
|
|
this.utilizationMips = utilizationMips;
|
|
}
|
|
|
|
/**
|
|
* Gets the previous utilization mips.
|
|
*
|
|
* @return the previous utilization mips
|
|
*/
|
|
public double getPreviousUtilizationMips() {
|
|
return previousUtilizationMips;
|
|
}
|
|
|
|
/**
|
|
* Sets the previous utilization mips.
|
|
*
|
|
* @param previousUtilizationMips the new previous utilization mips
|
|
*/
|
|
protected void setPreviousUtilizationMips(double previousUtilizationMips) {
|
|
this.previousUtilizationMips = previousUtilizationMips;
|
|
}
|
|
|
|
/**
|
|
* Gets the state history.
|
|
*
|
|
* @return the state history
|
|
*/
|
|
public List<HostStateHistoryEntry> getStateHistory() {
|
|
return stateHistory;
|
|
}
|
|
|
|
/**
|
|
* Adds the state history entry.
|
|
*
|
|
* @param time the time
|
|
* @param allocatedMips the allocated mips
|
|
* @param requestedMips the requested mips
|
|
* @param isActive the is active
|
|
*/
|
|
public
|
|
void
|
|
addStateHistoryEntry(double time, double allocatedMips, double requestedMips, boolean isActive) {
|
|
|
|
HostStateHistoryEntry newState = new HostStateHistoryEntry(
|
|
time,
|
|
allocatedMips,
|
|
requestedMips,
|
|
isActive);
|
|
if (!getStateHistory().isEmpty()) {
|
|
HostStateHistoryEntry previousState = getStateHistory().get(getStateHistory().size() - 1);
|
|
if (previousState.getTime() == time) {
|
|
getStateHistory().set(getStateHistory().size() - 1, newState);
|
|
return;
|
|
}
|
|
}
|
|
getStateHistory().add(newState);
|
|
}
|
|
|
|
}
|