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

2023-10-27

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

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 解决mac osx下pip安装ipython权限的问题

    转自 http xiaorui cc p 3061 OSError Errno 1 Operation not permitted 各种的root都不可以 想到了一个粗暴的方式 直接针对share进行chmod的授权 结果 提示root也是
  • vue.js -- 样式绑定

    目录 class 字符串形式 对象形式 数组形式 style 字符串形式 对象形式 组件 默认继承父组件class 子组件内嵌式 子组件只有一个最外层节点 子组件有多个最外层节点 使用 attrs传参 class 字符串形式 代码演示
  • python不使用第三方库实现bmp图像处理

    python不使用第三方库实现bmp图像处理 一 背景 二 具体功能实现 2 1 读取bmp图像 2 2 resize功能 2 3 rotate功能 2 4 保存bmp图像 三 完整代码 B站 后续 bilibili CSDN python
  • vue 3.0项目标题icon根据域名动态修改显示不同favicon

    文章目录 前言 一 favicon 二 动态修改 1 域名动态判断 2 参考链接 总结 前言 本人项目是vue3 0 cli项目 是多域名公用的前台项目 所以一个icon不能支持很多域名的项目同时使用 提示 以下是本篇文章正文内容 下面案例
  • Qt 信号槽传递指针

    指针定义 ifndef DEFINE H define DEFINE H include
  • epoll的惊群效应

    1 epoll惊群效应产生的原因 很多朋友都在Linux下使用epoll编写过socket的服务端程序 在多线程环境下可能会遇到epoll的惊群效应 那么什么是惊群效应呢 其产生的原因是什么呢 在多线程或者多进程环境下 有些人为了提高程序的
  • css利用border-radius圆角来设置背景图片为圆角的

    例子
  • 【转】MySQL 的表锁和行锁

    转自 https mp weixin qq com s 8LrPHG7XtsvNJJs58yK 0g 锁是计算机协调多个进程或者纯线程并发访问某一资源的机制 相对于其他数据库而言 MySQL 的锁机制比较简单 其最显著的特点是不同的存储引擎
  • crout分解计算例题_如何计算有理函数的不定积分

    本文中所有不定积分都省略常数项 不同小节的相同字母没有关系 部分分式分解 一般微积分书上都会讲有理函数的部分分式分解 以及如何用这种方法算有理函数的不定积分 方法如下 假设 是给定的有理函数 其中 是多项式 先用多项式除法 令 其中 是多项
  • Django-Model层ORM(五)

    目录 一 数据库配置 setting py全局配置文件中 默认 sqlite3数据库 通过class创建一张表 二 使用mysql数据库 通过class创建数据库表 三 单表操作 添加操作一 实例化book对象调用save 函数 添加操作二
  • 操作系统期末总复习(题库)

    本文说明 本文以习题为主 每题标明对应的书本页面 并作出详细解析 大家可以对照复习 选择题章节并没按书本章节分 计算题和分析题无书本页面位置或详细解析 请大家自行找对应章节进行学习 祝大家都能通过考试 也希望大家点赞支持 操作系统期末总复习
  • Python中的 nonlocal 关键字

    在Python中 nonlocal 关键字用于在嵌套函数中引用外部 但不是全局 作用域的变量 nonlocal 可以使你在嵌套函数内部修改外层 非全局 作用域的变量 为了更好地理解 nonlocal 的作用 我们先看一个没有使用 nonlo
  • ELK6.8版本整合filebeat和kafka收集springboot日志

    一 系统流程图 二 统一springboot的日志格式 方便logstash 已中括号过滤用
  • FFmpeg学习笔记--FFplay播放控制、FFplay基本命令参数、FFplay高级命令参数

    目录 1 FFplay播放控制 2 FFplay命令参数 1 强制显示宽高 用于调整窗口大小 2 设置帧尺寸 仅适用于没有包含帧大小的视频 3 设置像素格式 4 以全屏模式启动 5 禁用音频 视频和字幕 6 设置开始播放的位置 7 设置播放
  • 本地离线安装node-sass

    在使用 vue admin template 作为模板进行项目开发时 其模板中自带的 node sass 版本不一定和我们本地的node 环境一致 且使用 npm i node sass s 重新安装 node sass 也会报各种莫名其妙
  • 【shell】shell之cut用法

    目录 即可即用 命令详细说明 即可即用 提取列的用awk命令更好用 示例1 截取pers文件内冒号分隔的字符串的第3列 命令 命令说明 d 使用冒号 作为域分隔符 f 3 取分隔后的第3列 示例2 取括号内的数值 you age is 19
  • Error:for nested data item, row-key is required.的解决方法

    一 问题描述 遇到这个问题 首先跟着网上的教程更改 去掉package json中的element ui 版本号前面 不行之后我以为是我的版本问题 换了版本之后 报的错误更多了 然后给

随机推荐