解析Cloudsim中,获取SLA指标的函数:getSlaMetrics()

protected static Map<String, Double> getSlaMetrics(List<Vm> vms) {                    //获取SLA指标,参数:虚拟机列表。返回:SLA指标的Map集合
		Map<String, Double> metrics = new HashMap<String, Double>();                      //实例化Map类型的对象:metrics。
		List<Double> slaViolation = new LinkedList<Double>();                             //实例化List类型的对象:slaViolation。表示违反SLA的double数据。
		double totalAllocated = 0;                                                        //总共分配的指令数
		double totalRequested = 0;                                                        //总共请求的指令数
		double totalUnderAllocatedDueToMigration = 0;                                     //总共(因为迁移导致)的未分配的指令数

		for (Vm vm : vms) {                                      //第一层增强for循环遍历虚拟机列表集合(依次遍历虚拟机列表中的每个虚拟机)
			double vmTotalAllocated = 0;                         //虚拟机总共分配的指令数
			double vmTotalRequested = 0;                         //虚拟机总共请求的指令数
			double vmUnderAllocatedDueToMigration = 0;           //虚拟机总共(因为迁移导致)的未分配的指令数
			double previousTime = -1;                             //以前的时间
			double previousAllocated = 0;                         //以前分配的指令数
			double previousRequested = 0;                         //以前请求的指令数
			boolean previousIsInMigration = false;                //以前是否在迁移

			for (VmStateHistoryEntry entry : vm.getStateHistory()) {        //第二层增强for循环遍历虚拟机状态历史记录集合(依次遍历虚拟机状态历史记录列表中的每个历史状态)
				                                                            //getStateHistory():获取状态历史记录,包括time,allocatedMips,requestedMips,isInMigration
				
				
				if (previousTime != -1) {                                             //判断以前的时间是否为-1,即判断是否为初始历史状态
					double timeDiff = entry.getTime() - previousTime;                 //时间段为当前历史状态的时间-以前历史状态时间  
					vmTotalAllocated += previousAllocated * timeDiff;                 //累加计算虚拟机总共分配的指令数
					vmTotalRequested += previousRequested * timeDiff;                 //累加计算虚拟机总共请求的指令数

					if (previousAllocated < previousRequested) {                           //判断是否违反SLA,即:当分配的Mips小于请求的Mips时候,就违反SLA
						slaViolation.add((previousRequested - previousAllocated) / previousRequested);         //若违反SLA,则计算违反SLA的指标并添加到slaViolation集合中
						if (previousIsInMigration) {                                        //在违反SLA的基础上,判断是否进行虚拟机迁移
							vmUnderAllocatedDueToMigration += (previousRequested - previousAllocated)          //若违反SLA的基础上,进行了虚拟机迁移,则累加计算虚拟机总共(因为迁移导致)的未分配指令数
									* timeDiff;
						}
					}
				}

				previousAllocated = entry.getAllocatedMips();                 //将历史状态记录列表中的某个历史状态的分配的Mips赋值给previousAllocated
				previousRequested = entry.getRequestedMips();                 //将历史状态记录列表中的某个历史状态的请求的Mips赋值给previousRequested
				previousTime = entry.getTime();                               //将历史状态记录列表中的某个历史状态的时间赋值给previousTime
				previousIsInMigration = entry.isInMigration();                //将历史状态记录列表中的某个历史状态的是否在迁移的状态赋值赋值给previousIsMigration
			}

			totalAllocated += vmTotalAllocated;
			totalRequested += vmTotalRequested;
			totalUnderAllocatedDueToMigration += vmUnderAllocatedDueToMigration;
		}
    //双层加强for循环结束,得到三个值:totalAllocated,totalRequested,totalUnderAllocatedDueToMigration
		
		
		
		
		
		
		metrics.put("overall", (totalRequested - totalAllocated) / totalRequested);        //计算总体违反SLA指标的值,并把键值对添加到metrics集合中
		
		if (slaViolation.isEmpty()) {                                                      //判断是否存在违反SLA,如果没有,则平均违反SLA指标的值为0,并把键值对添加到metrics集合中。
			metrics.put("average", 0.);                                                                  //isEmpty():判断表中是否包含元素
		} else {                                                                           //如果存在违反SLA,则计算平均违反SLA指标的值,并把键值对添加到metrics集合中。
			metrics.put("average", MathUtil.mean(slaViolation));                                          
		}
		metrics.put("underallocated_migration", totalUnderAllocatedDueToMigration / totalRequested);    //计算因迁移导致的未分配,违反SLA指标的值,并把键值对添加到metrics集合中。
		// metrics.put("sla_time_per_vm_with_migration", slaViolationTimePerVmWithMigration /
		// totalTime);
		// metrics.put("sla_time_per_vm_without_migration", slaViolationTimePerVmWithoutMigration /
		// totalTime);

		return metrics;         //返回metrics键值对集合
	}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值