/*
* 注意:该方法中俩个变量:slaViolationTimePerHost表示所有活跃主机总共违反SLA的时间,totalTime表示所有活跃主机的总时间
* 但由于最后返回值为二者的比值,即得到违反SLA的比率。故单个活跃主机和所有活跃主机在此没有什么区别。
*/
protected static double getSlaTimePerActiveHost(List<Host> hosts) { //获取每个活跃主机的SLA时间。参数:主机列表。返回:每台活跃主机的SLA时间。
double slaViolationTimePerHost = 0; //每台主机违反SLA的时间
double totalTime = 0; //总时间
for (Host _host : hosts) { //第一层增强for循环遍历主机列表集合(依次遍历主机列表中的每个主机)
HostDynamicWorkload host = (HostDynamicWorkload) _host; //HostDynamicWorkload:支持动态工作负载和性能下降的主机
double previousTime = -1; //以前的时间
double previousAllocated = 0; //以前分配的指令数
double previousRequested = 0; //以前请求的指令数
boolean previousIsActive = true; //以前是否是活跃的
for (HostStateHistoryEntry entry : host.getStateHistory()) { //第二层增强for循环遍历主机状态历史记录集合(依次遍历主机状态历史记录列表中的每个历史状态)
if (previousTime != -1 && previousIsActive) { //判断以前的时间是否为-1并且以前是否是活跃的
double timeDiff = entry.getTime() - previousTime; //时间段为当前历史状态的时间-以前历史状态时间
totalTime += timeDiff; //累加计算总时间
if (previousAllocated < previousRequested) { //判断是否违反SLA,即:当分配的Mips小于请求的Mips时候,就违反SLA
slaViolationTimePerHost += timeDiff; //累加计算每台主机违反SLA的时间
}
}
previousAllocated = entry.getAllocatedMips(); //将历史状态记录表中的某个历史状态的分配的Mips赋值给previousAllocated
previousRequested = entry.getRequestedMips(); //将历史状态记录列表中的某个历史状态的请求的Mips赋值给previousRequested
previousTime = entry.getTime(); //将历史状态记录列表中的某个历史状态的时间赋值给previousTime
previousIsActive = entry.isActive(); //将历史状态记录表中的某个历史状态的是否活跃赋值给previousIsActive
}
}
return slaViolationTimePerHost / totalTime; //返回:每台活跃主机违反SLA比率===每台主机违反SLA时间/总时间
}