CloudSim仿真流程研究(二)[通俗易懂]

CloudSim仿真流程研究(二)[通俗易懂]org.cloudbus.cloudsim.examples.power.random里的例子IqrMc:publicclassIqrMc{ /** *Themainmethod. * *@paramargsthearguments *@throwsIOExceptionSignalsthatanI/Oexceptionhasocc…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

org.cloudbus.cloudsim.examples.power.random里的例子IqrMc

public class IqrMc {

	/**
	 * The main method.
	 * 
	 * @param args the arguments
	 * @throws IOException Signals that an I/O exception has occurred.
	 */
	public static void main(String[] args) throws IOException {
		boolean enableOutput = true;
		boolean outputToFile = true;
		String inputFolder = "";
		String outputFolder = "C:\\Users\\yangdi\\Desktop\\cloudsim_data";
		String workload = "random"; // Random workload
		String vmAllocationPolicy = "iqr"; // Inter Quartile Range (IQR) VM allocation policy
		String vmSelectionPolicy = "mc"; // Maximum Correlation (MC) VM selection policy
		String parameter = "1.5"; // the safety parameter of the IQR policy
		
		new RandomRunner(
				enableOutput,
				outputToFile,
				inputFolder,
				outputFolder,
				workload,
				vmAllocationPolicy,
				vmSelectionPolicy,
				parameter);
	}

}

运行类在类RandomRunner中,该类继承于RunnerAbstract类,并且直重写了一个方法:init()

protected void init(String inputFolder) {
		try {
			CloudSim.init(1, Calendar.getInstance(), false);

			broker = Helper.createBroker();
			int brokerId = broker.getId();

			cloudletList = RandomHelper.createCloudletList(brokerId, RandomConstants.NUMBER_OF_VMS);
			vmList = Helper.createVmList(brokerId, cloudletList.size());
			hostList = Helper.createHostList(RandomConstants.NUMBER_OF_HOSTS);
		} catch (Exception e) {
			e.printStackTrace();
			Log.printLine("The simulation has been terminated due to an unexpected error");
			System.exit(0);
		}
	}

该方法中Cloudlet是随即创建的,使用的是RandomHelper里的createCloudletList()方法,在里面创建Cloudlet:

cloudlet = new Cloudlet(
    i,
    Constants.CLOUDLET_LENGTH,
    Constants.CLOUDLET_PES,
    fileSize,
    outputSize,
    new UtilizationModelStochastic(),
    utilizationModelNull,  
    utilizationModelNull
    // new UtilizationModelStochastic(),
    // new UtilizationModelStochastic()
);

本来自带的Cloudlet中传入的CPU使用率模型,RAM使用率模型,和BW使用率模型,这个暂时不用去管,因为其本身自己就有简单的随机模型。之后的仿真流程跟前一篇一样。之后研究在Planetlab的工作流或者随机cloudlet的工作流之下其CPU利用率,RAM利用率,Bw利用率和Storage利用率。

利用率这一段日志的输出在powerDatacenter类中(节取):

protected double updateCloudetProcessingWithoutSchedulingFutureEventsForce() {
		double currentTime = CloudSim.clock();
		double minTime = Double.MAX_VALUE;
		double timeDiff = currentTime - getLastProcessTime();
		double timeFrameDatacenterEnergy = 0.0;

		Log.printLine("\n\n--------------------------------------------------------------\n\n");
		Log.formatLine("New resource usage for the time frame starting at %.2f:", currentTime);

		for (PowerHost host : this.<PowerHost> getHostList()) {
			Log.printLine();

			double time = host.updateVmsProcessing(currentTime); // inform VMs to update processing
			if (time < minTime) {
				minTime = time;
			}

			Log.formatLine(
					"%.2f: [Host #%d] utilization is %.2f%%",
					currentTime,
					host.getId(),
					host.getUtilizationOfCpu() * 100);

其本身自带的只有CPU的利用率,所以需要去添加其他的利用率输出代码:

Log.formatLine(
    "%.2f: [Host #%d] utilization of RAM is %.2f%%",
    currentTime,
    host.getId(),
    host.getUtilizationOfRam() * 100);
			
Log.formatLine(
    "%.2f: [Host #%d] utilization of bw is %.2f%%",
    currentTime,
    host.getId(),
    host.getUtilizationOfBw() * 100);
			
Log.formatLine(
    "%.2f: [Host #%d] utilization of storge is %.2f%%",
    currentTime,
    host.getId(),
    host.getUtilizationOfStorage() * 100);

这之中的getUtilizationOfRam()和getUtilizationOfBw()方法在类HostDynamicWorkload中。但其本身的代码有点错误,名字是获取Ram的使用率,但是代码却是:

public double getUtilizationOfRam() {
		return getRamProvisioner().getUsedRam();  //这里有点错误,这里返回的是使用的Ram,而不是
	}

之后我稍微改写了一下,改成了利用率:

public double getUtilizationOfRam() {
		// return getRamProvisioner().getUsedRam();  //这里有点错误,这里返回的是使用的Ram,而不是使用率
		double result = (double)getRamProvisioner().getUsedRam() / (double)getRamProvisioner().getRam();
		return result;
	}

Bw的利用率同理,但是这个类里没有storage的利用率,需要自己去写,所以我在这个类的父类Host里去写,因为HostDynamicWorkload类里面没有Host所带的vmlist,vmlist在Host类中是private修饰的成员变量,无法被子类调用,我也不敢把它改成publiic什么的,所以我把storage的利用率写在Host类中:

/**
	 * Gets the utilization of Storage(in absolute values).
	 * @return
	 */
	public double getUtilizationOfStorage() {
		double result = (double)getUsedStorage() / (double)getStorage();
		return result;
	}

	/**
	 * Gets the host Used stroge.
	 */
	public long getUsedStorage() {
		long usedStorage = 0;
		for(Vm vm : vmList) {
			usedStorage += vm.getSize();
		}
		return usedStorage;
	}

之后运行程序,但是发现只有在第一个时钟时间的时候正常显示了利用率,在之后的所有时钟时间内,Ram利用率跟Bw利用率的使用率都是0.0%,这个至今没搞清楚什么原因。之后我将HostDynamicWorkload中的Ram利用率跟Bw利用率注释掉,在Host类中重新写了一下代码,不从ramProvisioner中获取主机的已经使用的usedRam,而是通过Host类中的vmlist成员变量来获取已经被使用的usedRam,Bw同理:

/**
	 * Gets the utilization of ram (in absolute values).
	 * 
	 * @return the utilization of ram
	 */
	public double getUtilizationOfRam() {
		double result = (double)getUsedRam() / (double)getRam();
		return result;
	}
	
	/**
	 * Gets the host Used Bw.
	 */
	public long getUsedRam() {
		long usedRam = 0;
		for(Vm vm : vmList) {
			usedRam += vm.getRam();
		}
		return usedRam;
	}
/**
	 * Gets the utilization of bw (in absolute values).
	 * 
	 * @return the utilization of bw
	 */
	public double getUtilizationOfBw() {
		double result = (double)getUsedBw() / (double)getBw();
		return result;
	}
	
	/**
	 * Gets the host Used Bw.
	 */
	public long getUsedBw() {
		long usedBw = 0;
		for(Vm vm : vmList) {
			usedBw += vm.getBw();
		}
		return usedBw;
	}

之后运行程序,就能在每个时钟时间正确的打印出结果:

CloudSim仿真流程研究(二)[通俗易懂]

不同时钟时刻的例子:

CloudSim仿真流程研究(二)[通俗易懂]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/182478.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Docker技术( 容器虚拟化技术 )「建议收藏」

    Docker虚拟化容器技术第一章Docker简介诞生背景Docker介绍虚拟机技术容器虚拟化技术官方网址第二章Docker安装前提条件安装DockerDocker底层原理Docker结构图工作原理Docker为什么比VM快第三章Docker常用命令帮助命令镜像命令容器命令第一章Docker简介诞生背景一款产品从开发到上线,从操作系统,到运行环境,再到应用配置。作为开发…

  • 变异系数法matlab代码[通俗易懂]

    变异系数法matlab代码[通俗易懂]function[w,ave,score]=byxsf(A)[m,n]=size(A);%m:对象数,n:指标数v=zeros(1,n);w=zeros(1,n);fori=1:nv(i)=std(A(:,i))/mean(A(:,i));endfori=1:nw(i)=v(i)/sum(v);enddisp(‘权重为:’)wscore=w(…

  • 语音信号处理入门系列(1)—— 语音信号处理概念「建议收藏」

    语音信号处理入门系列(1)—— 语音信号处理概念「建议收藏」文章目录1.语音交互2.复杂的声学环境2.1声学回声消除2.2解混响2.3语音分离2.4波束形成2.5噪声抑制2.6幅度控制2.7前端信号处理的技术路线3.参考4.推荐开源项目原博客地址:https://www.cnblogs.com/LXP-Never/p/13620804.html1.语音交互你知道苹果手机有几个麦克风吗?语音交互(VUI)是指人与人/设备通过自然语音进行信息传递的过程。语音交互的优势:输入效率高。语音输入的速度是传统键盘输入方式的3倍以上。例如:语

  • nvicat15激活码_通用破解码

    nvicat15激活码_通用破解码,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • ubuntu18.04安装opencv教程_Ubuntu18安装opencv

    ubuntu18.04安装opencv教程_Ubuntu18安装opencv最近opencv3.4.1发布了,想换个新的试试鲜,于是把配置的过程通过博文的方式记录下来,方便查阅。本教程原为3.3.0,但经过博主亲测,3.4.0、3.4.1皆适用1.去官网下载opencv,在本教程中选用的时opencv3.4.1,其他版本的配置方法异曲同工。下载链接http://opencv.org/releases.html,选择sources版本2.解压下…

  • JAVA-FileInputStream之read方法「建议收藏」

    JAVA-FileInputStream之read方法「建议收藏」关于FileInputStream    它用于读取本地文件中的字节数据,继承自InputStream类,由于所有的文件都是以字节为向导,因此它适用于操作于任何形式的文件。     关于其最重要的两个方法Read()和Read(byteb)怎么使用呢?首先我们来查看API文档:  read()API文档:publicintread()th

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号