繁体   English   中英

在 CloudSim 中打印迁移时间

[英]Print migration time in CloudSim

我想在cloud sim中实现虚拟机迁移时间公式,我做了一个简单的方法但是结果错误,问题是我需要模拟中迁移的虚拟机列表,以便我可以计算和打印最终的总迁移时间,如果您有任何想法,请帮助我!

public static double getTotalMigrationTime(List<Vm> vms){           
  double Tmigr = 0;
  for(Vm vm:vms){
    if(vm.isInMigration()){
      double Cj = vm.getRam();
      double BWj = vm.getBw();
      Tmigr += Cj/BWj;
    }
  }
  return Tmigr;
}

你必须在 PowerDatacenter 类中添加迁移和能量公式,更准确地说是在 updateCloudletProcessing 方法中,并且还要在类中添加 set 和 get 方法,而不会忘记类中的局部变量,以节省迁移时间和精力。

        // Migration Time
    public double Tmigr = 0;

    // Migration Energy
    public double Emigr;

@Override
protected void updateCloudletProcessing() {
    if (getCloudletSubmitted() == -1 || getCloudletSubmitted() == CloudSim.clock()) {
        CloudSim.cancelAll(getId(), new PredicateType(CloudSimTags.VM_DATACENTER_EVENT));
        schedule(getId(), getSchedulingInterval(), CloudSimTags.VM_DATACENTER_EVENT);
        return;
    }
    double currentTime = CloudSim.clock();
            double Pm = 4.5;
            double sum = 0;

    // if some time passed since last processing
    if (currentTime > getLastProcessTime()) {
        System.out.print(currentTime + " ");

        double minTime = updateCloudetProcessingWithoutSchedulingFutureEventsForce();

        if (!isDisableMigrations()) {
            List<Map<String, Object>> migrationMap = getVmAllocationPolicy().optimizeAllocation(
                    getVmList());

            if (migrationMap != null) {
                for (Map<String, Object> migrate : migrationMap) {
                    Vm vm = (Vm) migrate.get("vm");
                    PowerHost targetHost = (PowerHost) migrate.get("host");
                    PowerHost oldHost = (PowerHost) vm.getHost();

                                            // Calculates migration time and energy
                                            double Cj = vm.getRam();
                                            double BWj = (double)targetHost.getBw()/(2*8000);
                                            Tmigr = Tmigr + Cj/BWj; // Time
                                            sum = sum + Pm*(Cj/BWj);
                                            Emigr = 4*sum; //energy

                    if (oldHost == null) {
                        Log.formatLine(
                                "%.2f: Migration of VM #%d to Host #%d is started",
                                currentTime,
                                vm.getId(),
                                targetHost.getId());
                    } else {
                        Log.formatLine(
                                "%.2f: Migration of VM #%d from Host #%d to Host #%d is started",
                                currentTime,
                                vm.getId(),
                                oldHost.getId(),
                                targetHost.getId());
                    }

                    targetHost.addMigratingInVm(vm);
                    incrementMigrationCount();

                    /** VM migration delay = RAM / bandwidth **/
                    // we use BW / 2 to model BW available for migration purposes, the other
                    // half of BW is for VM communication
                    // around 16 seconds for 1024 MB using 1 Gbit/s network
                    send(
                            getId(),
                            vm.getRam() / ((double) targetHost.getBw() / (2 * 8000)),
                            CloudSimTags.VM_MIGRATE,
                            migrate);
                }
            }
        }

        // schedules an event to the next time
        if (minTime != Double.MAX_VALUE) {
            CloudSim.cancelAll(getId(), new PredicateType(CloudSimTags.VM_DATACENTER_EVENT));
            send(getId(), getSchedulingInterval(), CloudSimTags.VM_DATACENTER_EVENT);
        }

        setLastProcessTime(currentTime);
    }
            setMigrationTime(Tmigr); // Update Total Migration Time
            setMigrationEnergy(Emigr); // Update Total Migration Energy
}

// sets migration time
 public void setMigrationTime(double Tm){
     Tmigr = Tm;
 }
 //gets migration time
 public double getMigrationTime(){
     return Tmigr;
 }
 //sets migration Energy
 public void setMigrationEnergy(double Em){
     Emigr = Em;
 }
 //gets total migration energy
 public double getMigrationEnergy(){
     return Emigr;
 }

之后可以使用get方法获取迁移时间和能量,并打印到Helper类中,不用忘记将能量转换为KWh。

//get Migration Time and energy from PowerDatacenter class
    double Tmigr = datacenter.getMigrationTime();
    double Emigr = datacenter.getMigrationEnergy()/(3600*1000);

Log.printLine(String.format("Migration Time : %.2f sec",Tmigr));        
        Log.printLine(String.format("Migration Energy : %.5f kWh",Emigr));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM