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键值对集合
}