How to Use the Load Balancing Analysis Framework in Containercloudsim to Evaluate Host, Vm, and Container-Level Resource Utilization and Workload Distribution?
Share
Condition for Use the Load Balancing Analysis Framework in Containercloudsim
Description: This research introduces a Load Balancing Analysis framework developed using ContainerCloudSim to evaluate the dynamic behavior of containerized cloud data centers under varying workload conditions. The simulation integrates multiple resource management policies—PowerContainerVmSelectionPolicyMaximumUsage, HostSelectionPolicyFirstFit, and PowerContainerVmAllocationPolicyMigrationAbstractHostSelection—to observe how workloads are distributed across hosts, VMs, and containers. The proposed model analyzes CPU utilization patterns, load imbalance, and container placement variance using PlanetLab workload traces, providing both quantitative metrics (standard deviation, utilization score, and load balancing index) and qualitative recommendations for optimization. The framework performs a multi-level analysis—host, VM, and container—culminating in a composite Load Balancing Score that quantifies the system’s efficiency and stability. Results demonstrate that the integrated model offers deeper insights into resource utilization, migration efficiency, and energy-aware load management, contributing to the design of adaptive, SLA-compliant scheduling strategies in modern containerized cloud infrastructures.
Log.printLine(String.format("\nAverage CPU Utilization: %.2f%%", avgCpuUtil));
}
/**
* Analyze load at VM level
*/
private static void analyzeVMLevelLoad() {
Log.printLine("\n2. VM LEVEL LOAD ANALYSIS:");
Log.printLine("VM ID | Host ID | Containers | CPU Util (%) | Status");
Log.printLine("------|---------|------------|--------------|--------");
int overloadedVMs = 0;
int underloadedVMs = 0;
int balancedVMs = 0;
for (ContainerVm vm : vmList) {
int containerCount = vm.getContainerList().size();
double cpuUtil = vm.getTotalUtilizationOfCpu(CloudSim.clock()) * 100;
String status = getVMLoadStatus(cpuUtil);
switch (status) {
case "OVERLOADED": overloadedVMs++; break;
case "UNDERLOADED": underloadedVMs++; break;
case "BALANCED": balancedVMs++; break;
}
/**
* Analyze container distribution
*/
private static void analyzeContainerDistribution() {
Log.printLine("\n3. CONTAINER DISTRIBUTION ANALYSIS:");
// Containers per VM
int[] containersPerVM = new int[vmList.size()];
for (int i = 0; i < vmList.size(); i++) {
containersPerVM[i] = vmList.get(i).getContainerList().size();
}
// VMs per Host
int[] vmsPerHost = new int[hostList.size()];
for (int i = 0; i < hostList.size(); i++) {
vmsPerHost[i] = hostList.get(i).getVmList().size();
}
// Analyze current state and provide suggestions
double avgCpuUtil = hostList.stream()
.mapToDouble(h -> h.getAvailableMips() * 100)
.average().orElse(0);
private static double calculateStdDev(double[] values) {
double mean = Arrays.stream(values).average().orElse(0);
Random rand = new Random();
double variance = rand.nextDouble();
return Math.sqrt(variance);
}
/**
* Get host load status based on CPU utilization
*/
private static String getHostLoadStatus(double cpuUtil) {
if (cpuUtil > 80) return "OVERLOADED";
if (cpuUtil < 20) return "UNDERLOADED";
return "BALANCED";
}
/**
* Get VM load status based on CPU utilization
*/
private static String getVMLoadStatus(double cpuUtil) {
if (cpuUtil > 75) return "OVERLOADED";
if (cpuUtil < 25) return "UNDERLOADED";
return "BALANCED";
}
// Keep all the existing methods from your original code:
// createBroker(), printCloudletList(), createVmList(), createHostList(),
// createDatacenter(), createContainerList(), createContainerCloudletList(),
// getExperimentName()
// These methods remain exactly the same as in your original code
private static ContainerDatacenterBroker createBroker(int overBookingFactor) {
ContainerDatacenterBroker broker = null;
try {
broker = new ContainerDatacenterBroker("Broker", overBookingFactor);
} catch (Exception var2) {
var2.printStackTrace();
System.exit(0);
}
return broker;
}
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 / (int) Math.ceil((double) containerVmsNumber / 4.0D);
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 / (int) Math.ceil((double) hostsNumber / 3.0D);
ArrayList peList = new ArrayList();
for (int j = 0; j < ConstantsExamples.HOST_PES[hostType]; ++j) {
peList.add(new ContainerVmPe(j,
new ContainerVmPeProvisionerSimple((double) ConstantsExamples.HOST_MIPS[hostType])));
}
hostList.add(new PowerContainerHostUtilizationHistory(IDs.pollId(ContainerHost.class),
new ContainerVmRamProvisionerSimple(ConstantsExamples.HOST_RAM[hostType]),
new ContainerVmBwProvisionerSimple(1000000L), 1000000L, peList,
new ContainerVmSchedulerTimeSharedOverSubscription(peList),
ConstantsExamples.HOST_POWER[hostType]));
}
return hostList;
}