Class VerticalVmScalingSimple

java.lang.Object
org.cloudsimplus.autoscaling.VmScalingAbstract
org.cloudsimplus.autoscaling.VerticalVmScalingSimple
All Implemented Interfaces:
VerticalVmScaling, VmScaling

public class VerticalVmScalingSimple
extends VmScalingAbstract
implements VerticalVmScaling
A VerticalVmScaling implementation which allows a DatacenterBroker to perform on demand up or down scaling for some Vm resource, such as Ram, Pe or Bandwidth.

For each resource that is required to be scaled, a distinct VerticalVmScaling instance must be assigned to the VM to be scaled.

Since:
CloudSim Plus 1.1.0
Author:
Manoel Campos da Silva Filho
  • Constructor Details

    • VerticalVmScalingSimple

      public VerticalVmScalingSimple​(Class<? extends ResourceManageable> resourceClassToScale, double scalingFactor)
      Creates a VerticalVmScalingSimple with a ResourceScalingGradual scaling type.
      Parameters:
      resourceClassToScale - the class of Vm resource that this scaling object will request up or down scaling (such as Ram.class, Bandwidth.class or Processor.class).
      scalingFactor - the factor (a percentage value in scale from 0 to 1) that will be used to scale a Vm resource up or down, whether such a resource is over or underloaded, according to the defined predicates. In the case of up scaling, the value 1 will scale the resource in 100%, doubling its capacity.
      See Also:
      VerticalVmScaling.setResourceScaling(ResourceScaling)
  • Method Details

    • getUpperThresholdFunction

      public Function<Vm,​Double> getUpperThresholdFunction()
      Description copied from interface: VerticalVmScaling
      Gets a Function that defines the upper utilization threshold for a Vm which indicates if it is overloaded or not. If it is overloaded, the Vm's DatacenterBroker will request to up scale the VM. The up scaling is performed by increasing the amount of the resource the scaling is associated to.

      This function must receive a Vm and return the upper utilization threshold for it as a percentage value between 0 and 1 (where 1 is 100%). The VM will be defined as overloaded if the utilization of the Resource this scaling object is related to is higher than the value returned by the Function returned by this method.

      Specified by:
      getUpperThresholdFunction in interface VerticalVmScaling
      Returns:
      See Also:
      VerticalVmScaling.setUpperThresholdFunction(Function)
    • setUpperThresholdFunction

      public final VerticalVmScaling setUpperThresholdFunction​(Function<Vm,​Double> upperThresholdFunction)
      Description copied from interface: VerticalVmScaling
      Sets a Function that defines the upper utilization threshold for a Vm which indicates if it is overloaded or not. If it is overloaded, the Vm's DatacenterBroker will request to up scale the VM. The up scaling is performed by increasing the amount of the resource the scaling is associated to.

      This function must receive a Vm and return the upper utilization threshold for it as a percentage value between 0 and 1 (where 1 is 100%).

      By setting the upper threshold as a Function instead of a directly storing a Double value which represent the threshold, it is possible to define the threshold dynamically instead of using a static value. Furthermore, the threshold function can be reused for scaling objects of different VMs.

      Specified by:
      setUpperThresholdFunction in interface VerticalVmScaling
      Parameters:
      upperThresholdFunction - the upper utilization threshold function to set. The VM will be defined as overloaded if the utilization of the Resource this scaling object is related to is higher than the value returned by this Function.
      Returns:
    • getLowerThresholdFunction

      public Function<Vm,​Double> getLowerThresholdFunction()
      Description copied from interface: VerticalVmScaling
      Gets a Function that defines the lower utilization threshold for a Vm which indicates if it is underloaded or not. If it is underloaded, the Vm's DatacenterBroker will request to down scale the VM. The down scaling is performed by decreasing the amount of the resource the scaling is associated to.

      This function must receive a Vm and return the lower utilization threshold for it as a percentage value between 0 and 1 (where 1 is 100%). The VM will be defined as underloaded if the utilization of the Resource this scaling object is related to is lower than the value returned by the Function returned by this method.

      Specified by:
      getLowerThresholdFunction in interface VerticalVmScaling
      Returns:
      See Also:
      VerticalVmScaling.setLowerThresholdFunction(Function)
    • setLowerThresholdFunction

      public final VerticalVmScaling setLowerThresholdFunction​(Function<Vm,​Double> lowerThresholdFunction)
      Description copied from interface: VerticalVmScaling
      Sets a Function that defines the lower utilization threshold for a Vm which indicates if it is underloaded or not. If it is underloaded, the Vm's DatacenterBroker will request to down scale the VM. The down scaling is performed by decreasing the amount of the resource the scaling is associated to.

      This function must receive a Vm and return the lower utilization threshold for it as a percentage value between 0 and 1 (where 1 is 100%).

      By setting the lower threshold as a Function instead of a directly storing a Double value which represent the threshold, it is possible to define the threshold dynamically instead of using a static value. Furthermore, the threshold function can be reused for scaling objects of different VMs.

      Specified by:
      setLowerThresholdFunction in interface VerticalVmScaling
      Parameters:
      lowerThresholdFunction - the lower utilization threshold function to set. The VM will be defined as underloaded if the utilization of the Resource this scaling object is related to is lower than the value returned by this Function.
      Returns:
    • setResourceScaling

      public final VerticalVmScaling setResourceScaling​(ResourceScaling resourceScaling)
      Sets the ResourceScaling that defines how the resource has to be resized.

      This class's constructors define a ResourceScalingGradual as the default ResourceScaling.

      Specified by:
      setResourceScaling in interface VerticalVmScaling
      Parameters:
      resourceScaling - the ResourceScaling to set
      Returns:
    • getAllocatedResource

      public long getAllocatedResource()
      Description copied from interface: VerticalVmScaling
      Gets the current amount allocated to the resource managed by this scaling object. It is just a shortcut to getVmResourceToScale.getAllocatedResource().
      Specified by:
      getAllocatedResource in interface VerticalVmScaling
      Returns:
      the amount of allocated resource
    • getResourceClass

      public Class<? extends ResourceManageable> getResourceClass()
      Description copied from interface: VerticalVmScaling
      Gets the class of Vm resource this scaling object will request up or down scaling. Such a class can be Ram.class, Bandwidth.class or Pe.class.
      Specified by:
      getResourceClass in interface VerticalVmScaling
      Returns:
      See Also:
      VerticalVmScaling.getResource()
    • setResourceClass

      public final VerticalVmScaling setResourceClass​(Class<? extends ResourceManageable> resourceClass)
      Description copied from interface: VerticalVmScaling
      Sets the class of Vm resource that this scaling object will request up or down scaling. Such a class can be Ram.class, Bandwidth.class or Pe.class.
      Specified by:
      setResourceClass in interface VerticalVmScaling
      Parameters:
      resourceClass - the resource class to set
      Returns:
    • getScalingFactor

      public double getScalingFactor()
      Description copied from interface: VerticalVmScaling
      Gets the factor that will be used to scale a Vm resource up or down, whether such a resource is over or underloaded, according to the defined predicates.

      If the resource to scale is a Pe, this is the number of PEs to request adding or removing when the VM is over or underloaded, respectively. For any other kind of resource, this is a percentage value in scale from 0 to 1. Every time the VM needs to be scaled up or down, this factor will be applied to increase or reduce a specific VM allocated resource.

      Specified by:
      getScalingFactor in interface VerticalVmScaling
      Returns:
      the scaling factor to set which may be an absolute value (for Pe scaling) or percentage (for scaling other resources)
      See Also:
      VerticalVmScaling.getUpperThresholdFunction()
    • requestUpScalingIfPredicateMatches

      public final boolean requestUpScalingIfPredicateMatches​(VmHostEventInfo evt)
      Description copied from interface: VerticalVmScaling
      Performs the vertical scale if the Vm is overloaded, according to the VerticalVmScaling.getUpperThresholdFunction() predicate, increasing the Vm resource to which the scaling object is linked to (that may be RAM, CPU, BW, etc), by the factor defined a scaling factor.

      The time interval in which it will be checked if the Vm is overloaded depends on the Datacenter.getSchedulingInterval() value. Make sure to set such a value to enable the periodic overload verification.

      Specified by:
      requestUpScalingIfPredicateMatches in interface VerticalVmScaling
      Specified by:
      requestUpScalingIfPredicateMatches in interface VmScaling
      Parameters:
      evt - current simulation time
      Returns:
      true if the Vm is over or underloaded and up or down scaling request was sent to the broker, false otherwise
      See Also:
      VerticalVmScaling.getScalingFactor()
    • isVmUnderloaded

      public boolean isVmUnderloaded()
      Description copied from interface: VerticalVmScaling
      Checks if the Vm is underloaded or not, based on the VerticalVmScaling.getLowerThresholdFunction().
      Specified by:
      isVmUnderloaded in interface VerticalVmScaling
      Returns:
      true if the Vm is underloaded, false otherwise
    • isVmOverloaded

      public boolean isVmOverloaded()
      Description copied from interface: VerticalVmScaling
      Checks if the Vm is overloaded or not, based on the VerticalVmScaling.getUpperThresholdFunction().
      Specified by:
      isVmOverloaded in interface VerticalVmScaling
      Returns:
      true if the Vm is overloaded, false otherwise
    • getResource

      public Resource getResource()
      Description copied from interface: VerticalVmScaling
      Gets the actual Vm Resource this scaling object is in charge of scaling. This resource is defined after calling the VerticalVmScaling.setResourceClass(Class).
      Specified by:
      getResource in interface VerticalVmScaling
      Returns:
    • getResourceAmountToScale

      public double getResourceAmountToScale()
      Gets the absolute amount of the Vm resource which has to be scaled up or down, based on the scaling factor.

      If a ResourceScaling implementation such as ResourceScalingGradual or ResourceScalingInstantaneous are used, it will rely on the getScalingFactor() to compute the amount of resource to scale. Other implementations may use the scaling factor by it is up to them.

      NOTE:

      The return of this method is rounded up to avoid values between ]0 and 1[. For instance, up scaling the number of CPUs in 0.5 means that half of a CPU should be added to the VM. Since number of CPUs is an integer value, this 0.5 will be converted to zero, causing no effect. For other resources such as RAM, adding 0.5 MB has not practical advantages either. This way, the value is always rounded up.
      Specified by:
      getResourceAmountToScale in interface VerticalVmScaling
      Returns:
      the absolute amount of the Vm resource to scale
      See Also:
      VerticalVmScaling.getResourceClass()
    • getResourceUsageThresholdFunction

      public Function<Vm,​Double> getResourceUsageThresholdFunction()
      Description copied from interface: VerticalVmScaling
      Gets the lower or upper resource utilization threshold Function, depending if the Vm resource is under or overloaded, respectively.
      Specified by:
      getResourceUsageThresholdFunction in interface VerticalVmScaling
      Returns:
      the lower resource utilization threshold function if the Vm resource is underloaded, upper resource utilization threshold function if the Vm resource is overloaded, or a function that always returns 0 if the Vm isn't in any of these conditions.
      See Also:
      VerticalVmScaling.getLowerThresholdFunction(), VerticalVmScaling.getUpperThresholdFunction()
    • setScalingFactor

      public final VerticalVmScaling setScalingFactor​(double scalingFactor)
      Description copied from interface: VerticalVmScaling
      Sets the factor that will be used to scale a Vm resource up or down, whether such a resource is over or underloaded, according to the defined predicates.

      If the resource to scale is a Pe, this is the number of PEs to request adding or removing when the VM is over or underloaded, respectively. For any other kind of resource, this is a percentage value in scale from 0 to 1. Every time the VM needs to be scaled up or down, this factor will be applied to increase or reduce a specific VM allocated resource.

      Specified by:
      setScalingFactor in interface VerticalVmScaling
      Parameters:
      scalingFactor - the scaling factor to set which may be an absolute value (for Pe scaling) or percentage (for scaling other resources)
      See Also:
      VerticalVmScaling.getUpperThresholdFunction()
    • requestUpScaling

      protected boolean requestUpScaling​(double time)
      Description copied from class: VmScalingAbstract
      Performs the actual request to scale the Vm up or down, depending if it is over or underloaded, respectively. This method is automatically called by VmScaling.requestUpScalingIfPredicateMatches(org.cloudsimplus.listeners.VmHostEventInfo) when it is verified that the Vm is over or underloaded.
      Specified by:
      requestUpScaling in class VmScalingAbstract
      Parameters:
      time - current simulation time
      Returns:
      true if the request was actually sent, false otherwise