init
This commit is contained in:
@@ -0,0 +1,189 @@
|
||||
/*
|
||||
* 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.power;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.cloudbus.cloudsim.Host;
|
||||
import org.cloudbus.cloudsim.Vm;
|
||||
import org.cloudbus.cloudsim.util.MathUtil;
|
||||
|
||||
/**
|
||||
* The Local Regression (LR) VM allocation policy.
|
||||
*
|
||||
* If you are using any algorithms, policies or workload included in the power package, please cite
|
||||
* the following paper:
|
||||
*
|
||||
* Anton Beloglazov, and Rajkumar Buyya, "Optimal Online Deterministic Algorithms and Adaptive
|
||||
* Heuristics for Energy and Performance Efficient Dynamic Consolidation of Virtual Machines in
|
||||
* Cloud Data Centers", Concurrency and Computation: Practice and Experience (CCPE), Volume 24,
|
||||
* Issue 13, Pages: 1397-1420, John Wiley & Sons, Ltd, New York, USA, 2012
|
||||
*
|
||||
* @author Anton Beloglazov
|
||||
* @since CloudSim Toolkit 3.0
|
||||
*/
|
||||
public class PowerVmAllocationPolicyMigrationLocalRegression extends PowerVmAllocationPolicyMigrationAbstract {
|
||||
|
||||
/** The scheduling interval. */
|
||||
private double schedulingInterval;
|
||||
|
||||
/** The safety parameter. */
|
||||
private double safetyParameter;
|
||||
|
||||
/** The fallback vm allocation policy. */
|
||||
private PowerVmAllocationPolicyMigrationAbstract fallbackVmAllocationPolicy;
|
||||
|
||||
/**
|
||||
* Instantiates a new power vm allocation policy migration local regression.
|
||||
*
|
||||
* @param hostList the host list
|
||||
* @param vmSelectionPolicy the vm selection policy
|
||||
* @param schedulingInterval the scheduling interval
|
||||
* @param fallbackVmAllocationPolicy the fallback vm allocation policy
|
||||
* @param utilizationThreshold the utilization threshold
|
||||
*/
|
||||
public PowerVmAllocationPolicyMigrationLocalRegression(
|
||||
List<? extends Host> hostList,
|
||||
PowerVmSelectionPolicy vmSelectionPolicy,
|
||||
double safetyParameter,
|
||||
double schedulingInterval,
|
||||
PowerVmAllocationPolicyMigrationAbstract fallbackVmAllocationPolicy,
|
||||
double utilizationThreshold) {
|
||||
super(hostList, vmSelectionPolicy);
|
||||
setSafetyParameter(safetyParameter);
|
||||
setSchedulingInterval(schedulingInterval);
|
||||
setFallbackVmAllocationPolicy(fallbackVmAllocationPolicy);
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiates a new power vm allocation policy migration local regression.
|
||||
*
|
||||
* @param hostList the host list
|
||||
* @param vmSelectionPolicy the vm selection policy
|
||||
* @param schedulingInterval the scheduling interval
|
||||
* @param fallbackVmAllocationPolicy the fallback vm allocation policy
|
||||
*/
|
||||
public PowerVmAllocationPolicyMigrationLocalRegression(
|
||||
List<? extends Host> hostList,
|
||||
PowerVmSelectionPolicy vmSelectionPolicy,
|
||||
double safetyParameter,
|
||||
double schedulingInterval,
|
||||
PowerVmAllocationPolicyMigrationAbstract fallbackVmAllocationPolicy) {
|
||||
super(hostList, vmSelectionPolicy);
|
||||
setSafetyParameter(safetyParameter);
|
||||
setSchedulingInterval(schedulingInterval);
|
||||
setFallbackVmAllocationPolicy(fallbackVmAllocationPolicy);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if is host over utilized.
|
||||
*
|
||||
* @param host the host
|
||||
* @return true, if is host over utilized
|
||||
*/
|
||||
@Override
|
||||
protected boolean isHostOverUtilized(PowerHost host) {
|
||||
PowerHostUtilizationHistory _host = (PowerHostUtilizationHistory) host;
|
||||
double[] utilizationHistory = _host.getUtilizationHistory();
|
||||
int length = 10; // we use 10 to make the regression responsive enough to latest values
|
||||
if (utilizationHistory.length < length) {
|
||||
return getFallbackVmAllocationPolicy().isHostOverUtilized(host);
|
||||
}
|
||||
double[] utilizationHistoryReversed = new double[length];
|
||||
for (int i = 0; i < length; i++) {
|
||||
utilizationHistoryReversed[i] = utilizationHistory[length - i - 1];
|
||||
}
|
||||
double[] estimates = null;
|
||||
try {
|
||||
estimates = getParameterEstimates(utilizationHistoryReversed);
|
||||
} catch (IllegalArgumentException e) {
|
||||
return getFallbackVmAllocationPolicy().isHostOverUtilized(host);
|
||||
}
|
||||
double migrationIntervals = Math.ceil(getMaximumVmMigrationTime(_host) / getSchedulingInterval());
|
||||
double predictedUtilization = estimates[0] + estimates[1] * (length + migrationIntervals);
|
||||
predictedUtilization *= getSafetyParameter();
|
||||
|
||||
addHistoryEntry(host, predictedUtilization);
|
||||
|
||||
return predictedUtilization >= 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the parameter estimates.
|
||||
*
|
||||
* @param utilizationHistoryReversed the utilization history reversed
|
||||
* @return the parameter estimates
|
||||
*/
|
||||
protected double[] getParameterEstimates(double[] utilizationHistoryReversed) {
|
||||
return MathUtil.getLoessParameterEstimates(utilizationHistoryReversed);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the maximum vm migration time.
|
||||
*
|
||||
* @param host the host
|
||||
* @return the maximum vm migration time
|
||||
*/
|
||||
protected double getMaximumVmMigrationTime(PowerHost host) {
|
||||
int maxRam = Integer.MIN_VALUE;
|
||||
for (Vm vm : host.getVmList()) {
|
||||
int ram = vm.getRam();
|
||||
if (ram > maxRam) {
|
||||
maxRam = ram;
|
||||
}
|
||||
}
|
||||
return maxRam / ((double) host.getBw() / (2 * 8000));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the scheduling interval.
|
||||
*
|
||||
* @param schedulingInterval the new scheduling interval
|
||||
*/
|
||||
protected void setSchedulingInterval(double schedulingInterval) {
|
||||
this.schedulingInterval = schedulingInterval;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the scheduling interval.
|
||||
*
|
||||
* @return the scheduling interval
|
||||
*/
|
||||
protected double getSchedulingInterval() {
|
||||
return schedulingInterval;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the fallback vm allocation policy.
|
||||
*
|
||||
* @param fallbackVmAllocationPolicy the new fallback vm allocation policy
|
||||
*/
|
||||
public void setFallbackVmAllocationPolicy(
|
||||
PowerVmAllocationPolicyMigrationAbstract fallbackVmAllocationPolicy) {
|
||||
this.fallbackVmAllocationPolicy = fallbackVmAllocationPolicy;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the fallback vm allocation policy.
|
||||
*
|
||||
* @return the fallback vm allocation policy
|
||||
*/
|
||||
public PowerVmAllocationPolicyMigrationAbstract getFallbackVmAllocationPolicy() {
|
||||
return fallbackVmAllocationPolicy;
|
||||
}
|
||||
|
||||
public double getSafetyParameter() {
|
||||
return safetyParameter;
|
||||
}
|
||||
|
||||
public void setSafetyParameter(double safetyParameter) {
|
||||
this.safetyParameter = safetyParameter;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user