How to Handle Server Host Overload to Maintain Container Execution Performance and System Efficiency in ContainerCloudSim using Dynamic Scaling Strategies?
Share
Condition for Handle Server Host Overload to Maintain Container Execution Performance and System Efficiency in ContainerCloudSim
Description: In cloud data centers, resource overloading can lead to performance degradation, increased execution times, and resource contention, which negatively affect service quality and user experience. To investigate this, to design a severely overloaded scenario using ContainerCloudSim, where 3 physical hosts are allocated to 10 virtual machines and 40 containers, creating an intentional imbalance between workload demand and available resources. This setup simulates real-world situations such as peak traffic periods or insufficient provisioning. The simulation monitors system utilization, container execution times, and cloudlet completion rates, revealing performance bottlenecks, high wait times, and lower completion rates due to resource contention. To address these issues, dynamic scaling mechanisms, including adding new hosts and optimizing container placement, are applied to maintain performance under overload conditions. This experiment provides insights into how cloud providers can implement adaptive scaling and resource management policies to sustain service quality and system efficiency under heavy load scenarios.
/**
* Overloaded Scenario: Too many containers for too few hosts Demonstrates
* performance degradation and dynamic scaling
*/
public class ContainerCloudsimOverloaded {
private static List cloudletList;
private static List vmList;
private static List containerList;
private static List hostList;
private static ContainerDatacenterBroker broker;
private static PowerContainerDatacenter datacenter;
// Custom constants for overloaded scenario
private static class OverloadConstants {
// Creating severe overload: Few hosts, many containers
public static final int NUMBER_HOSTS = 3; // Very few hosts
public static final int NUMBER_VMS = 10; // More VMs than hosts
public static final int NUMBER_CONTAINERS = 40; // Many containers
public static final int NUMBER_CLOUDLETS = 40;
// Reduced host capacity to create overload faster
public static final int[] HOST_PES = {2, 4, 6}; // Reduced PEs
public static final int[] HOST_RAM = {4096, 8192, 16384}; // Reduced RAM
public static final double[] HOST_MIPS = {1000, 1500, 2000}; // Reduced MIPS
}
// Policies for overload scenario
ContainerAllocationPolicy containerAllocationPolicy = new PowerContainerAllocationPolicySimple();
PowerContainerVmSelectionPolicy vmSelectionPolicy = new PowerContainerVmSelectionPolicyMaximumUsage();
HostSelectionPolicy hostSelectionPolicy = new HostSelectionPolicyFirstFit();
} catch (Exception e) {
Log.printLine(" Failed to add new host: " + e.getMessage());
}
}
/**
* Create a new host for dynamic scaling
*/
private static ContainerHost createNewHost() {
ArrayList peList = new ArrayList();
int hostType = 2; // Use the most powerful host type for scaling
for (int j = 0; j < OverloadConstants.HOST_PES[hostType]; ++j) {
peList.add(new ContainerVmPe(j,
new ContainerVmPeProvisionerSimple(OverloadConstants.HOST_MIPS[hostType])));
}
return new PowerContainerHostUtilizationHistory(
IDs.pollId(ContainerHost.class),
new ContainerVmRamProvisionerSimple(OverloadConstants.HOST_RAM[hostType]),
new ContainerVmBwProvisionerSimple(1000000L),
1000000L,
peList,
new ContainerVmSchedulerTimeSharedOverSubscription(peList),
ConstantsExamples.HOST_POWER[hostType]);
}
/**
* Print performance metrics to show degradation
*/
private static void printPerformanceMetrics(List cloudlets) {
Log.printLine("\n========== PERFORMANCE METRICS ==========");
double totalExecutionTime = 0;
double totalWaitTime = 0;
int completedCloudlets = 0;
int failedCloudlets = 0;
private static ArrayList createVmList(int brokerId, int containerVmsNumber) {
ArrayList containerVms = new ArrayList();
for (int i = 0; i < containerVmsNumber; ++i) {
ArrayList peList = new ArrayList();
int vmType = i % 2; // Alternate between VM types
for (int j = 0; j < ConstantsExamples.VM_PES[vmType]; ++j) {
peList.add(new ContainerPe(j,
new ContainerPeProvisionerSimple((double) ConstantsExamples.VM_MIPS[vmType])));
}
containerVms.add(new PowerContainerVm(IDs.pollId(ContainerVm.class), brokerId,
(double) ConstantsExamples.VM_MIPS[vmType], (float) ConstantsExamples.VM_RAM[vmType],
ConstantsExamples.VM_BW, ConstantsExamples.VM_SIZE, "Xen",
new ContainerSchedulerTimeSharedOverSubscription(peList),
new ContainerRamProvisionerSimple(ConstantsExamples.VM_RAM[vmType]),
new ContainerBwProvisionerSimple(ConstantsExamples.VM_BW),
peList, ConstantsExamples.SCHEDULING_INTERVAL));
}
return containerVms;
}
public static List createHostList(int hostsNumber) {
ArrayList hostList = new ArrayList();
for (int i = 0; i < hostsNumber; ++i) {
int hostType = i % 3; // Use all host types
ArrayList peList = new ArrayList();
for (int j = 0; j < OverloadConstants.HOST_PES[hostType]; ++j) {
peList.add(new ContainerVmPe(j,
new ContainerVmPeProvisionerSimple(OverloadConstants.HOST_MIPS[hostType])));
}
hostList.add(new PowerContainerHostUtilizationHistory(IDs.pollId(ContainerHost.class),
new ContainerVmRamProvisionerSimple(OverloadConstants.HOST_RAM[hostType]),
new ContainerVmBwProvisionerSimple(1000000L), 1000000L, peList,
new ContainerVmSchedulerTimeSharedOverSubscription(peList),
ConstantsExamples.HOST_POWER[hostType]));
}
return hostList;
}
return new PowerContainerDatacenterCM(name, characteristics, vmAllocationPolicy,
containerAllocationPolicy, new LinkedList(), schedulingInterval,
experimentName, logAddress, VMStartupDelay, ContainerStartupDelay);
}
public static List createContainerList(int brokerId, int containersNumber) {
ArrayList containers = new ArrayList();
for (int i = 0; i < containersNumber; ++i) {
int containerType = i % 3; // Use all container types
public static List createContainerCloudletList(int brokerId, int numberOfCloudlets)
throws FileNotFoundException {
String inputFolderName = "/home/soft13/soft13/Project 2019/Cloudsim-4.0-examples/src/workload/planetlab";
ArrayList cloudletList = new ArrayList();
long fileSize = 300L;
long outputSize = 300L;
UtilizationModelNull utilizationModelNull = new UtilizationModelNull();
java.io.File inputFolder1 = new java.io.File(inputFolderName);
java.io.File[] files1 = inputFolder1.listFiles();
int createdCloudlets = 0;
for (java.io.File aFiles1 : files1) {
if (aFiles1.isDirectory()) {
java.io.File inputFolder = new java.io.File(aFiles1.toString());
java.io.File[] files = inputFolder.listFiles();
if (files != null) {
for (int i = 0; i < files.length; ++i) {
if (createdCloudlets < numberOfCloudlets) {
try {
ContainerCloudlet cloudlet = new ContainerCloudlet(
IDs.pollId(ContainerCloudlet.class),
ConstantsExamples.CLOUDLET_LENGTH, 1,
fileSize, outputSize,
new UtilizationModelPlanetLabInMemoryExtended(files[i].getAbsolutePath(), 300.0D),
utilizationModelNull, utilizationModelNull);