package org.cloudbus.cloudsim.container.core; import org.cloudbus.cloudsim.container.containerVmProvisioners.ContainerVmBwProvisioner; import org.cloudbus.cloudsim.container.containerVmProvisioners.ContainerVmPe; import org.cloudbus.cloudsim.container.lists.ContainerVmPeList; import org.cloudbus.cloudsim.container.containerVmProvisioners.ContainerVmRamProvisioner; import org.cloudbus.cloudsim.container.schedulers.ContainerVmScheduler; import org.cloudbus.cloudsim.HostStateHistoryEntry; import org.cloudbus.cloudsim.Log; import org.cloudbus.cloudsim.core.CloudSim; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; /** * Created by sareh on 14/07/15. */ public class ContainerHostDynamicWorkload extends ContainerHost{ /** 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 ContainerHostDynamicWorkload( int id, ContainerVmRamProvisioner ramProvisioner, ContainerVmBwProvisioner bwProvisioner, long storage, List<? extends ContainerVmPe> peList, ContainerVmScheduler vmScheduler) { super(id, ramProvisioner, bwProvisioner, storage, peList, vmScheduler); setUtilizationMips(0); setPreviousUtilizationMips(0); } /* * (non-Javadoc) * @see cloudsim.Host#updateVmsProcessing(double) */ @Override public double updateContainerVmsProcessing(double currentTime) { double smallerTime = super.updateContainerVmsProcessing(currentTime); setPreviousUtilizationMips(getUtilizationMips()); setUtilizationMips(0); double hostTotalRequestedMips = 0; for (ContainerVm containerVm : getVmList()) { getContainerVmScheduler().deallocatePesForVm(containerVm); } for (ContainerVm containerVm : getVmList()) { getContainerVmScheduler().allocatePesForVm(containerVm, containerVm.getCurrentRequestedMips()); } for (ContainerVm containerVm : getVmList()) { double totalRequestedMips = containerVm.getCurrentRequestedTotalMips(); double totalAllocatedMips = getContainerVmScheduler().getTotalAllocatedMipsForContainerVm(containerVm); if (!Log.isDisabled()) { Log.formatLine( "%.2f: [Host #" + getId() + "] Total allocated MIPS for VM #" + containerVm.getId() + " (Host #" + containerVm.getHost().getId() + ") is %.2f, was requested %.2f out of total %.2f (%.2f%%)", CloudSim.clock(), totalAllocatedMips, totalRequestedMips, containerVm.getMips(), totalRequestedMips / containerVm.getMips() * 100); List<ContainerVmPe> pes = getContainerVmScheduler().getPesAllocatedForContainerVM(containerVm); StringBuilder pesString = new StringBuilder(); for (ContainerVmPe pe : pes) { pesString.append(String.format(" PE #" + pe.getId() + ": %.2f.", pe.getContainerVmPeProvisioner() .getTotalAllocatedMipsForContainerVm(containerVm))); } Log.formatLine( "%.2f: [Host #" + getId() + "] MIPS for VM #" + containerVm.getId() + " by PEs (" + getNumberOfPes() + " * " + getContainerVmScheduler().getPeCapacity() + ")." + pesString, CloudSim.clock()); } if (getVmsMigratingIn().contains(containerVm)) { Log.formatLine("%.2f: [Host #" + getId() + "] VM #" + containerVm.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 #" + containerVm.getId() + ": %.2f", CloudSim.clock(), totalRequestedMips - totalAllocatedMips); } containerVm.addStateHistoryEntry( currentTime, totalAllocatedMips, totalRequestedMips, (containerVm.isInMigration() && !getVmsMigratingIn().contains(containerVm))); if (containerVm.isInMigration()) { Log.formatLine( "%.2f: [Host #" + getId() + "] VM #" + containerVm.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<ContainerVm> getCompletedVms() { List<ContainerVm> vmsToRemove = new ArrayList<>(); for (ContainerVm containerVm : getVmList()) { if (containerVm.isInMigration()) { continue; } // if the vm is in waiting state then dont kill it just waite !!!!!!!!! if(containerVm.isInWaiting()){ continue; } // if (containerVm.getCurrentRequestedTotalMips() == 0) { // vmsToRemove.add(containerVm); // } if(containerVm.getNumberOfContainers()==0 ){ vmsToRemove.add(containerVm); } } return vmsToRemove; } /** * Gets the completed vms. * * @return the completed vms */ public int getNumberofContainers() { int numberofContainers = 0; for (ContainerVm containerVm : getVmList()) { numberofContainers += containerVm.getNumberOfContainers(); Log.print("The number of containers in VM# " + containerVm.getId()+"is: "+ containerVm.getNumberOfContainers()); Log.printLine(); } return numberofContainers; } /** * Gets the max utilization among by all PEs. * * @return the utilization */ public double getMaxUtilization() { return ContainerVmPeList.getMaxUtilization(getPeList()); } /** * Gets the max utilization among by all PEs allocated to the VM. * * @param vm the vm * @return the utilization */ public double getMaxUtilizationAmongVmsPes(ContainerVm vm) { return ContainerVmPeList.getMaxUtilizationAmongVmsPes(getPeList(), vm); } /** * Gets the utilization of memory. * * @return the utilization of memory */ public double getUtilizationOfRam() { return getContainerVmRamProvisioner().getUsedVmRam(); } /** * Gets the utilization of bw. * * @return the utilization of bw */ public double getUtilizationOfBw() { return getContainerVmBwProvisioner().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); } }