List of Topics:
Location Research Breakthrough Possible @S-Logix pro@slogix.in

Office Address

Social List

How to Use the Load Balancing Analysis Framework in Containercloudsim to Evaluate Host, Vm, and Container-Level Resource Utilization and Workload Distribution?

Host-Level Power Consumption Using Planetlab

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.
Sample Code
  • package containercloudsim;

    import org.cloudbus.cloudsim.Log;
    import org.cloudbus.cloudsim.Storage;
    import org.cloudbus.cloudsim.UtilizationModelNull;
    import org.cloudbus.cloudsim.container.containerProvisioners.ContainerBwProvisionerSimple;
    import org.cloudbus.cloudsim.container.containerProvisioners.ContainerPe;
    import org.cloudbus.cloudsim.container.containerProvisioners.ContainerRamProvisionerSimple;
    import org.cloudbus.cloudsim.container.containerProvisioners.ContainerPeProvisionerSimple;
    import org.cloudbus.cloudsim.container.containerVmProvisioners.ContainerVmBwProvisionerSimple;
    import org.cloudbus.cloudsim.container.containerVmProvisioners.ContainerVmPe;
    import org.cloudbus.cloudsim.container.containerVmProvisioners.ContainerVmPeProvisionerSimple;
    import org.cloudbus.cloudsim.container.containerVmProvisioners.ContainerVmRamProvisionerSimple;
    import org.cloudbus.cloudsim.container.core.*;
    import org.cloudbus.cloudsim.container.hostSelectionPolicies.HostSelectionPolicy;
    import org.cloudbus.cloudsim.container.hostSelectionPolicies.HostSelectionPolicyFirstFit;
    import org.cloudbus.cloudsim.container.resourceAllocatorMigrationEnabled
    .PowerContainerVmAllocationPolicyMigrationAbstractHostSelection;
    import org.cloudbus.cloudsim.container.resourceAllocators.ContainerAllocationPolicy;
    import org.cloudbus.cloudsim.container.resourceAllocators.ContainerVmAllocationPolicy;
    import org.cloudbus.cloudsim.container.resourceAllocators.PowerContainerAllocationPolicySimple;
    import org.cloudbus.cloudsim.container.schedulers.ContainerCloudletSchedulerDynamicWorkload;
    import org.cloudbus.cloudsim.container.schedulers.ContainerSchedulerTimeSharedOverSubscription;
    import org.cloudbus.cloudsim.container.schedulers.ContainerVmSchedulerTimeSharedOverSubscription;
    import org.cloudbus.cloudsim.container.utils.IDs;
    import org.cloudbus.cloudsim.container.vmSelectionPolicies.PowerContainerVmSelectionPolicy;
    import org.cloudbus.cloudsim.container.vmSelectionPolicies
    .PowerContainerVmSelectionPolicyMaximumUsage;
    import org.cloudbus.cloudsim.core.CloudSim;
    import org.cloudbus.cloudsim.container.core.PowerContainer;
    import org.cloudbus.cloudsim.container.core.Container;

    import java.io.FileNotFoundException;
    import java.text.DecimalFormat;
    import java.util.*;
    import org.cloudbus.cloudsim.examples.container.ConstantsExamples;
    import org.cloudbus.cloudsim.examples.container.UtilizationModelPlanetLabInMemoryExtended;

    /**
    * Simple Load Balancing Analysis for ContainerCloudSim
    */
    public class LoadBalancing {

    private static List cloudletList;
    private static List vmList;
    private static List containerList;
    private static List hostList;

    public static void main(String[] args) {
    Log.printLine("Starting ContainerCloudSim with Load Balancing Analysis...");

    try {
    int num_user = 1;
    Calendar calendar = Calendar.getInstance();
    boolean trace_flag = false;

    CloudSim.init(num_user, calendar, trace_flag);

    // Setup policies
    ContainerAllocationPolicy containerAllocationPolicy = new PowerContainerAllocationPolicySimple();
    PowerContainerVmSelectionPolicy vmSelectionPolicy = new PowerContainerVmSelectionPolicyMaximumUsage();
    HostSelectionPolicy hostSelectionPolicy = new HostSelectionPolicyFirstFit();

    double overUtilizationThreshold = 0.80;
    double underUtilizationThreshold = 0.70;

    hostList = createHostList(ConstantsExamples.NUMBER_HOSTS);
    cloudletList = new ArrayList<>();
    vmList = new ArrayList<>();

    ContainerVmAllocationPolicy vmAllocationPolicy =
    new PowerContainerVmAllocationPolicyMigrationAbstractHostSelection(
    hostList, vmSelectionPolicy, hostSelectionPolicy,
    overUtilizationThreshold, underUtilizationThreshold);

    int overBookingFactor = 80;
    ContainerDatacenterBroker broker = createBroker(overBookingFactor);
    int brokerId = broker.getId();

    cloudletList = createContainerCloudletList(brokerId, ConstantsExamples.NUMBER_CLOUDLETS);
    containerList = createContainerList(brokerId, ConstantsExamples.NUMBER_CLOUDLETS);
    vmList = createVmList(brokerId, ConstantsExamples.NUMBER_VMS);

    String logAddress = "~/Results/LoadBalancing";

    PowerContainerDatacenter datacenter = (PowerContainerDatacenter) createDatacenter("datacenter",
    PowerContainerDatacenterCM.class, hostList, vmAllocationPolicy, containerAllocationPolicy,
    getExperimentName("LoadBalancing", String.valueOf(overBookingFactor)),
    ConstantsExamples.SCHEDULING_INTERVAL, logAddress,
    ConstantsExamples.VM_STARTTUP_DELAY, ConstantsExamples.CONTAINER_STARTTUP_DELAY);

    // Submit workloads
    broker.submitCloudletList(cloudletList.subList(0, containerList.size()));
    broker.submitContainerList(containerList);
    broker.submitVmList(vmList);

    CloudSim.terminateSimulation(86400.00);
    CloudSim.startSimulation();
    CloudSim.stopSimulation();

    List newList = broker.getCloudletReceivedList();
    printCloudletList(newList);

    // Perform load balancing analysis
    performLoadBalancingAnalysis(datacenter, broker);

    Log.printLine("ContainerCloudSim Load Balancing Analysis finished!");

    } catch (Exception e) {
    e.printStackTrace();
    Log.printLine("Unwanted errors happen");
    }
    }

    /**
    * Simple Load Balancing Analysis
    */
    private static void performLoadBalancingAnalysis(PowerContainerDatacenter datacenter, ContainerDatacenterBroker broker) {
    Log.printLine("\n" + "=".repeat(60));
    Log.printLine(" LOAD BALANCING ANALYSIS");
    Log.printLine("=".repeat(60));

    // 1. Host Level Load Analysis
    analyzeHostLevelLoad();

    // 2. VM Level Load Analysis
    analyzeVMLevelLoad();

    // 3. Container Distribution Analysis
    analyzeContainerDistribution();

    // 4. Load Balancing Score
    calculateLoadBalancingScore();

    // 5. Recommendations
    provideLoadBalancingRecommendations();
    }

    /**
    * Analyze load at host level
    */
    private static void analyzeHostLevelLoad() {
    Log.printLine("\n1. HOST LEVEL LOAD ANALYSIS:");
    Log.printLine("Host ID | VMs | CPU Util (%) | Status");
    Log.printLine("--------|-----|--------------|--------");

    double totalCpuUtil = 0;
    double totalRamUtil = 0;

    for (ContainerHost host : hostList) {
    int vmCount = host.getVmList().size();
    double cpuUtil = host.getTotalMips() * 100;
    double ramUtil = (host.getContainerVmRamProvisioner().getUsedVmRam() /
    (double) host.getContainerVmRamProvisioner().getAvailableRam()) * 100;
    String status = getHostLoadStatus(cpuUtil);

    totalCpuUtil += cpuUtil;
    totalRamUtil += ramUtil;

    Log.printLine(String.format("%7d | %3d | %12.2f | %s",
    host.getId(), vmCount, cpuUtil, status));
    }

    double avgCpuUtil = totalCpuUtil / hostList.size();
    double avgRamUtil = totalRamUtil / hostList.size();

    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;
    }

    Log.printLine(String.format("%5d | %7d | %10d | %12.2f | %s",
    vm.getId(), vm.getHost().getId(), containerCount, cpuUtil, status));
    }

    Log.printLine(String.format("\nVM Load Distribution:"));
    Log.printLine(String.format(" Balanced VMs: %d (%.1f%%)", balancedVMs,
    (double) balancedVMs / vmList.size() * 100));
    Log.printLine(String.format(" Overloaded VMs: %d (%.1f%%)", overloadedVMs,
    (double) overloadedVMs / vmList.size() * 100));
    Log.printLine(String.format(" Underloaded VMs: %d (%.1f%%)", underloadedVMs,
    (double) underloadedVMs / vmList.size() * 100));
    }

    /**
    * 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();
    }

    double containerStdDev = calculateStdDev(containersPerVM);
    double vmStdDev = calculateStdDev(vmsPerHost);

    Log.printLine(String.format("Container distribution std dev: %.2f", containerStdDev));
    Log.printLine(String.format("VM distribution std dev: %.2f", vmStdDev));
    Log.printLine("Lower standard deviation indicates better load balancing");

    // Show distribution
    Log.printLine("\nContainers per VM range: " +
    Arrays.stream(containersPerVM).min().getAsInt() + " - " +
    Arrays.stream(containersPerVM).max().getAsInt());
    Log.printLine("VMs per Host range: " +
    Arrays.stream(vmsPerHost).min().getAsInt() + " - " +
    Arrays.stream(vmsPerHost).max().getAsInt());
    }

    /**
    * Calculate overall load balancing score
    */
    private static void calculateLoadBalancingScore() {
    Log.printLine("\n4. LOAD BALANCING SCORE:");

    // Calculate CPU utilization balance
    double[] hostCpuUtils = new double[hostList.size()];
    for (int i = 0; i < hostList.size(); i++) {
    hostCpuUtils[i] = hostList.get(i).getAvailableMips() * 100;
    }
    double cpuBalanceScore = 100 - calculateStdDev(hostCpuUtils);

    // Calculate container distribution balance
    int[] containersPerVM = new int[vmList.size()];
    for (int i = 0; i < vmList.size(); i++) {
    containersPerVM[i] = vmList.get(i).getContainerList().size();
    }
    double containerBalanceScore = 100 - calculateStdDev(containersPerVM) * 10;

    // Overall score (average of both)
    double overallScore = (cpuBalanceScore + containerBalanceScore) / 2;

    Log.printLine(String.format("CPU Utilization Balance: %.1f/100", Math.max(0, cpuBalanceScore)));
    Log.printLine(String.format("Container Distribution Balance: %.1f/100", Math.max(0, containerBalanceScore)));
    Log.printLine(String.format("OVERALL LOAD BALANCING SCORE: %.1f/100", Math.max(0, overallScore)));

    // Interpretation
    if (overallScore >= 80) {
    Log.printLine("✓ EXCELLENT load balancing achieved!");
    } else if (overallScore >= 60) {
    Log.printLine("○ GOOD load balancing, minor improvements possible");
    } else if (overallScore >= 40) {
    Log.printLine(" FAIR load balancing, consider optimization");
    } else {
    Log.printLine(" POOR load balancing, significant improvements needed");
    }
    }

    /**
    * Provide load balancing recommendations
    */
    private static void provideLoadBalancingRecommendations() {
    Log.printLine("\n5. LOAD BALANCING RECOMMENDATIONS:");

    // Analyze current state and provide suggestions
    double avgCpuUtil = hostList.stream()
    .mapToDouble(h -> h.getAvailableMips() * 100)
    .average().orElse(0);

    double cpuStdDev = calculateStdDev(hostList.stream()
    .mapToDouble(h -> h.getAvailableMips() * 100)
    .toArray());

    if (cpuStdDev > 25) {
    Log.printLine(" High load imbalance detected!");
    Log.printLine(" - Consider using Round Robin host selection policy");
    Log.printLine(" - Implement VM migration for load balancing");
    Log.printLine(" - Review container placement algorithm");
    } else if (cpuStdDev > 15) {
    Log.printLine(" Moderate load imbalance detected");
    Log.printLine(" - Monitor host utilization patterns");
    Log.printLine(" - Consider dynamic resource allocation");
    } else {
    Log.printLine(" Load is well balanced across hosts");
    }

    // Check for overloaded hosts
    long overloadedHosts = hostList.stream()
    .filter(h -> h.getAvailableMips() > 0.8)
    .count();

    if (overloadedHosts > 0) {
    Log.printLine(String.format(" %d hosts are overloaded (>80%% CPU)", overloadedHosts));
    Log.printLine(" - Migrate VMs from overloaded hosts");
    Log.printLine(" - Consider adding more hosts");
    }

    // Check for underloaded hosts
    long underloadedHosts = hostList.stream()
    .filter(h -> h.getAvailableMips() < 0.3)
    .count();

    if (underloadedHosts > 0) {
    Log.printLine(String.format(" %d hosts are underloaded (<30%% CPU)", underloadedHosts));
    Log.printLine(" - Consolidate workloads to fewer hosts");
    Log.printLine(" - Consider powering down underutilized hosts");
    }
    }

    /**
    * Helper method to calculate standard deviation
    */
    private static double calculateStdDev(int[] values) {
    double mean = Arrays.stream(values).average().orElse(0);
    double variance = Arrays.stream(values)
    .mapToDouble(v -> Math.pow(v - mean, 2))
    .average().orElse(0);
    return Math.sqrt(variance);
    }

    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 void printCloudletList(List list) {
    int size = list.size();
    ContainerCloudlet cloudlet;
    String indent = " ";
    Log.printLine();
    Log.printLine("========== OUTPUT ==========");
    Log.printLine("Cloudlet ID" + indent + "Container ID" + indent + "STATUS" + indent
    + "Data center ID" + indent + "VM ID" + indent + "Time" + indent
    + "Start Time" + indent + "Finish Time");

    DecimalFormat dft = new DecimalFormat("###.##");
    for (int i = 0; i < size; i++) {
    cloudlet = list.get(i);
    Log.print(indent + cloudlet.getCloudletId() + indent);
    Log.print(cloudlet.getContainerId() + indent);

    if (cloudlet.getCloudletStatusString().equals("Success")) {
    Log.print("SUCCESS");
    Log.printLine(indent + indent + cloudlet.getResourceId()
    + indent + indent + indent + cloudlet.getVmId()
    + indent + indent
    + dft.format(cloudlet.getActualCPUTime()) + indent
    + indent + dft.format(cloudlet.getExecStartTime())
    + indent + indent
    + dft.format(cloudlet.getFinishTime()));
    }
    }
    }

    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;
    }

    public static ContainerDatacenter createDatacenter(String name, Class< extends ContainerDatacenter> datacenterClass,
    List hostList, ContainerVmAllocationPolicy vmAllocationPolicy,
    ContainerAllocationPolicy containerAllocationPolicy, String experimentName,
    double schedulingInterval, String logAddress, double VMStartupDelay, double ContainerStartupDelay) throws Exception {
    String arch = "x86";
    String os = "Linux";
    String vmm = "Xen";
    double time_zone = 10.0D;
    double cost = 3.0D;
    double costPerMem = 0.05D;
    double costPerStorage = 0.001D;
    double costPerBw = 0.0D;
    ContainerDatacenterCharacteristics characteristics = new ContainerDatacenterCharacteristics(arch, os, vmm, hostList, time_zone, cost, costPerMem, costPerStorage, costPerBw);
    ContainerDatacenter datacenter = new PowerContainerDatacenterCM(name, characteristics, vmAllocationPolicy,
    containerAllocationPolicy, new LinkedList(), schedulingInterval, experimentName, logAddress,
    VMStartupDelay, ContainerStartupDelay);
    return datacenter;
    }

    public static List createContainerList(int brokerId, int containersNumber) {
    ArrayList containers = new ArrayList();
    for (int i = 0; i < containersNumber; ++i) {
    int containerType = i / (int) Math.ceil((double) containersNumber / 3.0D);
    containers.add(new PowerContainer(IDs.pollId(Container.class), brokerId, (double) ConstantsExamples.CONTAINER_MIPS[containerType], ConstantsExamples.CONTAINER_PES[containerType], ConstantsExamples.CONTAINER_RAM[containerType], ConstantsExamples.CONTAINER_BW, 0L, "Xen",
    new ContainerCloudletSchedulerDynamicWorkload(ConstantsExamples.CONTAINER_MIPS[containerType], ConstantsExamples.CONTAINER_PES[containerType]), ConstantsExamples.SCHEDULING_INTERVAL));
    }
    return containers;
    }

    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) {
    java.io.File inputFolder = new java.io.File(aFiles1.toString());
    java.io.File[] files = inputFolder.listFiles();
    for (int i = 0; i < files.length; ++i) {
    if (createdCloudlets < numberOfCloudlets) {
    ContainerCloudlet cloudlet = null;
    try {
    cloudlet = new ContainerCloudlet(IDs.pollId(ContainerCloudlet.class), ConstantsExamples.CLOUDLET_LENGTH, 1,
    fileSize, outputSize,
    new UtilizationModelPlanetLabInMemoryExtended(files[i].getAbsolutePath(), 300.0D),
    utilizationModelNull, utilizationModelNull);
    } catch (Exception var13) {
    var13.printStackTrace();
    System.exit(0);
    }
    cloudlet.setUserId(brokerId);
    cloudletList.add(cloudlet);
    createdCloudlets += 1;
    } else {
    return cloudletList;
    }
    }
    }
    return cloudletList;
    }

    private static String getExperimentName(String... args) {
    StringBuilder experimentName = new StringBuilder();
    for (int i = 0; i < args.length; ++i) {
    if (!args[i].isEmpty()) {
    if (i != 0) {
    experimentName.append("_");
    }
    experimentName.append(args[i]);
    }
    }
    return experimentName.toString();
    }
    }
Screenshots
  • 124
  • 125
  • 126
  • 127