init
This commit is contained in:
304
src/org/cloudbus/cloudsim/HostDynamicWorkload.java
Normal file
304
src/org/cloudbus/cloudsim/HostDynamicWorkload.java
Normal file
@@ -0,0 +1,304 @@
|
||||
/*
|
||||
* 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);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user