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

Office Address

Social List

How to Evaluate the Impact of the First Fit Container Placement Policy on Resource Utilization, Load Balancing, and Performance in Containercloudsim?

Host-Level Power Consumption Using Planetlab

Condition for Evaluate the Impact of the First Fit Container Placement Policy on Resource Utilization

  • Description:
    This research focuses on the performance evaluation of the First Fit container placement policy within a containerized cloud data center environment, simulated using ContainerCloudSim. The study aims to analyze how First Fit placement influences resource utilization efficiency, load balancing, and execution time of workloads under various hosting and scheduling configurations. The system models a dynamic multi-host cloud infrastructure that provisions virtual machines (VMs), containers, and workloads (cloudlets) based on realistic PlanetLab workload traces. By integrating VM allocation, container allocation, and host selection policies with a First Fit placement mechanism, the simulation identifies patterns of CPU and memory utilization across multiple VMs. The analysis captures both pre-simulation placement efficiency and post-simulation performance metrics, including success rate, execution time variance, and load imbalance score. The results contribute to understanding how simple heuristic policies like First Fit perform in energy-aware, resource-constrained cloud environments, providing a foundation for improving future adaptive placement and migration strategies in container-based cloud systems.
Sample Code
  • package containercloudsim;

    import org.cloudbus.cloudsim.Log;
    import org.cloudbus.cloudsim.Storage;
    import org.cloudbus.cloudsim.UtilizationModelNull;
    import org.cloudbus.cloudsim.container.containerPlacementPolicies.ContainerPlacementPolicy;
    import org.cloudbus.cloudsim.container.containerPlacementPolicies.ContainerPlacementPolicyFirstFit;
    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;

    /**
    * Comprehensive analysis of First Fit Container Placement Policy
    */
    public class PlacementPolicyFirstFit {

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

    // Statistics for First Fit analysis
    private static FirstFitStats firstFitStats;

    public static void main(String[] args) {
    Log.printLine("Starting First Fit Container Placement Policy Analysis...");
    firstFitStats = new FirstFitStats();

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

    // Initialize CloudSim
    CloudSim.init(num_user, calendar, trace_flag);

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

    double overUtilizationThreshold = 0.80;
    double underUtilizationThreshold = 0.70;

    // Create infrastructure
    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();

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

    String logAddress = "~/Results/FirstFitAnalysis";

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

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

    // Analyze First Fit placement before simulation
    analyzeFirstFitPlacement(containerList, vmList);

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

    // Get results and analyze
    List completedCloudlets = broker.getCloudletReceivedList();
    printCloudletList(completedCloudlets);
    analyzeFirstFitResults(completedCloudlets, containerList, vmList);
    printFirstFitStatistics();

    Log.printLine("First Fit Container Placement Analysis finished!");

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

    /**
    * Analyze First Fit placement pattern
    */
    private static void analyzeFirstFitPlacement(List containers, List vms) {
    Log.printLine("\n=== FIRST FIT PLACEMENT ANALYSIS ===");

    // Simulate First Fit placement
    ContainerPlacementPolicy firstFitPolicy = new ContainerPlacementPolicyFirstFit();
    Map vmContainerCount = new HashMap<>();
    Map vmCpuUtilization = new HashMap<>();
    Map vmRamUtilization = new HashMap<>();

    // Initialize maps
    for (ContainerVm vm : vms) {
    vmContainerCount.put(vm.getId(), 0);
    vmCpuUtilization.put(vm.getId(), 0.0);
    vmRamUtilization.put(vm.getId(), 0.0);
    }

    // Simulate placement for each container
    for (Container container : containers) {
    ContainerVm selectedVm = firstFitPolicy.getContainerVm(vmList, container, new HashSet());

    if (selectedVm != null) {
    // Update statistics
    int vmId = selectedVm.getId();
    vmContainerCount.put(vmId, vmContainerCount.get(vmId) + 1);

    // Calculate utilization (simplified)
    double cpuUtil = vmCpuUtilization.get(vmId) +
    (container.getMips() / selectedVm.getMips());
    double ramUtil = vmRamUtilization.get(vmId) +
    (container.getRam() / (double) selectedVm.getRam());

    vmCpuUtilization.put(vmId, cpuUtil);
    vmRamUtilization.put(vmId, ramUtil);

    firstFitStats.totalPlacements++;
    firstFitStats.placementSequence.add(new Placement(container.getId(), vmId));
    }
    }


    for (ContainerVm vm : vms) {
    int vmId = vm.getId();
    int containerCount = vmContainerCount.get(vmId);
    double cpuUtilPercent = Math.min(vmCpuUtilization.get(vmId) * 100, 100);
    double ramUtilPercent = Math.min(vmRamUtilization.get(vmId) * 100, 100);



    // Update statistics
    firstFitStats.vmUtilization.add(cpuUtilPercent);
    if (cpuUtilPercent > firstFitStats.maxVmUtilization) {
    firstFitStats.maxVmUtilization = cpuUtilPercent;
    }
    if (cpuUtilPercent < firstFitStats.minVmUtilization || firstFitStats.minVmUtilization == -1) {
    firstFitStats.minVmUtilization = cpuUtilPercent;
    }
    }
    }

    /**
    * Analyze First Fit results after simulation
    */
    private static void analyzeFirstFitResults(List completedCloudlets,
    List containers, List vms) {
    Log.printLine("\n=== FIRST FIT PERFORMANCE RESULTS ===");

    Map> vmExecutionTimes = new HashMap<>();
    Map vmSuccessCount = new HashMap<>();

    // Initialize maps
    for (ContainerVm vm : vms) {
    vmExecutionTimes.put(vm.getId(), new ArrayList());
    vmSuccessCount.put(vm.getId(), 0);
    }

    // Analyze completed cloudlets
    for (ContainerCloudlet cloudlet : completedCloudlets) {
    if (cloudlet.getCloudletStatusString().equals("Success")) {
    int vmId = cloudlet.getVmId();
    double executionTime = cloudlet.getActualCPUTime();

    vmExecutionTimes.get(vmId).add(executionTime);
    vmSuccessCount.put(vmId, vmSuccessCount.get(vmId) + 1);
    firstFitStats.successfulCloudlets++;

    firstFitStats.totalExecutionTime += executionTime;
    if (executionTime > firstFitStats.maxExecutionTime) {
    firstFitStats.maxExecutionTime = executionTime;
    }
    if (executionTime < firstFitStats.minExecutionTime || firstFitStats.minExecutionTime == -1) {
    firstFitStats.minExecutionTime = executionTime;
    }
    }
    }

    // Calculate average execution times per VM
    Log.printLine("\nVM ID | Success Count | Avg Time (s) | Std Dev");
    Log.printLine("------|--------------|--------------|---------");

    for (ContainerVm vm : vms) {
    int vmId = vm.getId();
    List times = vmExecutionTimes.get(vmId);
    int successCount = vmSuccessCount.get(vmId);

    if (successCount > 0) {
    double avgTime = times.stream().mapToDouble(Double::doubleValue).average().orElse(0);
    double stdDev = calculateStdDev(times, avgTime);

    Log.printLine(String.format("%5d | %12d | %12.2f | %7.2f",
    vmId, successCount, avgTime, stdDev));

    firstFitStats.vmAvgTimes.put(vmId, avgTime);
    }
    }
    }

    /**
    * Calculate standard deviation
    */
    private static double calculateStdDev(List values, double mean) {
    double sum = 0;
    for (double value : values) {
    sum += Math.pow(value - mean, 2);
    }
    return Math.sqrt(sum / values.size());
    }

    /**
    * Print comprehensive First Fit statistics
    */
    private static void printFirstFitStatistics() {
    Log.printLine("\n=== FIRST FIT STATISTICS SUMMARY ===");

    double avgExecutionTime = firstFitStats.successfulCloudlets > 0 ?
    firstFitStats.totalExecutionTime / firstFitStats.successfulCloudlets : 0;
    double successRate = (double) firstFitStats.successfulCloudlets / firstFitStats.totalPlacements * 100;
    double utilizationStdDev = calculateStdDev(firstFitStats.vmUtilization,
    firstFitStats.vmUtilization.stream().mapToDouble(Double::doubleValue).average().orElse(0));

    Log.printLine("Total Placements: " + firstFitStats.totalPlacements);
    Log.printLine("Successful Cloudlets: " + firstFitStats.successfulCloudlets);
    Log.printLine("Success Rate: " + String.format("%.2f%%", successRate));
    Log.printLine("Average Execution Time: " + String.format("%.2f seconds", avgExecutionTime));
    Log.printLine("Min Execution Time: " + String.format("%.2f seconds", firstFitStats.minExecutionTime));
    Log.printLine("Max Execution Time: " + String.format("%.2f seconds", firstFitStats.maxExecutionTime));
    Log.printLine("Min VM Utilization: " + String.format("%.2f%%", firstFitStats.minVmUtilization));
    Log.printLine("Max VM Utilization: " + String.format("%.2f%%", firstFitStats.maxVmUtilization));
    Log.printLine("VM Utilization Std Dev: " + String.format("%.2f%%", utilizationStdDev));

    // Analyze placement patterns
    analyzePlacementPatterns();

    }

    /**
    * Analyze placement patterns for First Fit
    */
    private static void analyzePlacementPatterns() {
    Log.printLine("\n=== PLACEMENT PATTERN ANALYSIS ===");

    // Count containers per VM in placement sequence
    Map placementDistribution = new HashMap<>();
    for (Placement placement : firstFitStats.placementSequence) {
    placementDistribution.put(placement.vmId,
    placementDistribution.getOrDefault(placement.vmId, 0) + 1);
    }

    Log.printLine("Placement Distribution:");
    for (Map.Entry entry : placementDistribution.entrySet()) {
    double percentage = (double) entry.getValue() / firstFitStats.totalPlacements * 100;
    Log.printLine(String.format(" VM %d: %d containers (%.1f%%)",
    entry.getKey(), entry.getValue(), percentage));
    }

    // Check for load imbalance
    double avgContainersPerVm = (double) firstFitStats.totalPlacements / placementDistribution.size();
    double imbalanceScore = 0;
    for (int count : placementDistribution.values()) {
    imbalanceScore += Math.abs(count - avgContainersPerVm);
    }
    imbalanceScore /= firstFitStats.totalPlacements;

    Log.printLine(String.format("Load Imbalance Score: %.3f (0 = perfect balance, 1 = maximum imbalance)", imbalanceScore));
    }

    // Existing utility methods (unchanged from your original code)
    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();
    }

    private static ContainerDatacenterBroker createBroker(int overBookingFactor) {
    try {
    return new ContainerDatacenterBroker("Broker", overBookingFactor);
    } catch (Exception e) {
    e.printStackTrace();
    System.exit(0);
    return null;
    }
    }

    private static void printCloudletList(List list) {
    int size = list.size();
    ContainerCloudlet cloudlet;
    String indent = " ";

    Log.printLine("\n========== CLOUDLET EXECUTION RESULTS ==========");
    Log.printLine("Cloudlet ID" + indent + "VM ID" + indent + "Container ID" + indent + "STATUS" + 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 + indent);
    Log.print(cloudlet.getVmId() + indent + indent);
    Log.print(cloudlet.getContainerId() + indent + indent);

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

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

    /**
    * Statistics class for First Fit analysis
    */
    static class FirstFitStats {
    int totalPlacements = 0;
    int successfulCloudlets = 0;
    double totalExecutionTime = 0;
    double minExecutionTime = -1;
    double maxExecutionTime = 0;
    double minVmUtilization = -1;
    double maxVmUtilization = 0;
    List vmUtilization = new ArrayList<>();
    List placementSequence = new ArrayList<>();
    Map vmAvgTimes = new HashMap<>();
    }

    /**
    * Placement record class
    */
    static class Placement {
    int containerId;
    int vmId;

    Placement(int containerId, int vmId) {
    this.containerId = containerId;
    this.vmId = vmId;
    }
    }
    }
Screenshots
  • 112
  • 113
  • 114