image-20231011210335067

CloudSim安装与测试用例运行

0、CloudSim简介

  • CloudSim是由澳大利亚墨尔本大学的网格实验室和Gridbus项目共同推出的开源云计算仿真平台;
  • CloudSim是基于Java语言开发的,可实现跨平台运行;
  • CloudSim有助于加快面向云计算平台的算法设计与测试速度,可降低开发的成本;
  • 用户可以通过CloudSim提供的众多核心类来进行大规模的云计算基础设施的建模与仿真。

1、准备工作

  • 一台Windows操作系统的电脑

  • Java配置

  • Maven下载与配置

  • 工具下载(下面两个都可以,二选一即可)

    • Eclipse
    • IDEA(推荐)
  • CloudSim下载(本次实验使用CloudSim 5.0

注:以上所有软件的安装包均可在百度网盘中下载

链接:https://pan.baidu.com/s/12JT4gDKbOLvHIeqyGbgE6A
提取码:3fd5

1.1 Java配置

首先需要再本地配置好Java的环境,这里不过多赘述,可以参考下面的教程

注:本文中使用的是jdk8的版本

1.1.1 安装Java8

双击下载好百度网盘中的文件,选择你的安装路径即可

1.1.2 配置环境变量

在“计算机”图标上点击鼠标右键,点击“属性”命令,单击高级系统设置

注意 配置不要照抄,要按照你自己本地的文件夹路径来

img

img

在“系统变量”中找到Path变量,点击“编辑”,添加一个 你所安装的jdk/bin目录

image-20231025102917421

1.2.3 确认环境变量配置是否正确

安装完成后在本地cmd中输入java -version能够显示下面的内容即为安装成功

image-20231011210829423

1.2 Maven下载与配置

Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具 软件。 Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较 高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方 法,许多 Apache Jakarta 项目发文时使用 Maven,而且公司项目采用 Maven 的比例在持续增长。

1.2.1 下载

打开Maven官网下载界面,下载bin文件,该文件为编译后的Maven,无需在本地进行编译直接使用。

image-20231011211326482

下载完成后,保存到本地的一个可靠的路径。

然后在本地的环境变量中添加一个MAVEN_HOME

image-20231011212120543

同时在系统变量的Path中添加一行:

image-20231011212319179

1.2.2 配置本地仓库

注意下面开始修改settings.xml文件的时候,切记不要将你的内容添加在注释当中,xml是一种类似于html的标记语言,不要将其中的结尾标记给错误的删除了。

在Maven安装的同级目录下创建maven-repository文件夹,用作maven的本地库。

image-20231011212701529

在路径apache-maven-3.9.5/conf文件夹下找到settings.xml文件。

image-20231011213017409

在该文件中找到节点localRepository,在注释外添加。此处的路径需要修改为你自己创建的路径!!!切勿照抄复制

1
<localRepository>你自己创建的maven仓库路径</localRepository>

image-20231011212855325

localRepository节点用于配置本地仓库,本地仓库其实起到了一个缓存的作用,它的默认地址是 C:Users用户名.m2。
当我们从maven中获取jar包的时候,maven首先会在本地仓库中查找,如果本地仓库有则返回;如果没有则从远程仓库中获取包,并在本地库中保存。
此外,我们在maven项目中运行mvn install,项目将会自动打包并安装到本地仓库中。

1.2.3 配置镜像

  1. 在settings.xml配置文件中找到mirrors节点(XML文件的标签对要注意!!)
  2. 添加如下配置(注意要添加在和两个标签之间,其它配置同理)
1
2
3
4
5
6
7
   <!-- 阿里云仓库 -->
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>

image-20231011213207092

因为国外的服务器下载jar包很慢所以我们改为阿里云服务器

虽然mirrors可以配置多个子节点,但是它只会使用其中的一个节点,即默认情况下配置多个mirror的情况下,只有第一个生效,只有当前一个mirror无法连接的时候,才会去找后一个;而我们想要的效果是:当a.jar在第一个mirror中不存在的时候,maven会去第二个mirror中查询下载,但是maven不会这样做。

1.2.4 配置JDK

  1. 在settings.xml配置文件中找到profiles节点
  2. 添加如下配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- java版本 --> 
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>

<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>

image-20231011213444786

配置完成,win+R运行CMD,输入mvn help:system 命令进行测试,配置成功则本地仓库(maven-repository)中会出现一些文件。

image-20231011213655948

image-20231011213806766

输出以下内容即为Maven安装成功:

image-20231011213739689

首次执行 mvn help:system 命令,Maven相关工具自动帮我们到Maven中央仓库下载缺省的或者Maven中央仓库更新的各种配置文件和类库(jar包)到Maven本地仓库中。
下载完各种文件后, mvn help:system 命令会打印出所有的Java系统属性和环境变量,这些信息对我们日常的编程工作很有帮助。

1.3 集成开发环境安装

这里推荐使用IDEA,后续在工作中也多数会使用IDEA

安装教程参考:https://blog.csdn.net/rbx508780/article/details/126647849

注:可以直接从官网下载专业版IDEA,利用校园邮箱免费激活。

1.4 CloudSim下载

去github中下载CloudSim https://github.com/Cloudslab/cloudsim/releases

本实验中使用的是CloudSim5.0

image-20231011214208781

下载后解压缩,然后在IDEA中打开项目,Maven会自动根据pom.xml下载一些配置文件,等待下载完成后即可。

点击open project,选择解压缩的CloudSim文件夹

image-20231011214707810

在IDEA的设置中,设置之前的Maven仓库

image-20231018113050839

image-20231018113120241

然后找到example,右击运行,出现如下效果即为安装成功。

image-20231011214423011

CloudSim介绍

CloudSim仿真的核心类

CloudSim仿真的核心类如下

说明
DataCenter 数据中心,提供虚拟化网络资源
DataCenterBroker 代理,用于提交虚拟机的任务和云任务列表
Host 主机,扩展虚拟机的参数分配策略,一台Host可以对应多台VM
VM 虚拟机类,运行在Host上,与其他虚拟机共享资源
Cloudlet 云任务类,构建云环境任务

CloudSim仿真流程

  1. 初始化CloudSim
  2. 创建数据中心DataCenter
  3. 创建用户代理Broker
  4. 创建虚拟机VM,添加至Broker
  5. 创建应用Cloudlet,添加至Broker
  6. 开启仿真
  7. 结束模拟仿真
  8. 打印输出

CloudSim应用

CloudSim5.0安装包中提供了8个示例代码,后续的实验任务可以参考其中的部分。

CloudSimExample1:展示了如何通过一台主机创建一个云数据中心并在其上运行一个Cloudlet。

CloudSimExample2:展示了如何创建一个包含一个主机的数据中心,并在其上运行两个云任务。这些云任务在具有相同MIPS需求的虚拟机中运行。这些云任务将花费相同的时间来完成执行。

CloudSimExample3:展示了如何创建一个包含两个主机的数据中心,并在其上运行两个Cloudlet云任务。这些云任务在具有不同MIPS需求的虚拟机中运行。云任务将会根据所请求的虚拟机性能,花费不同的时间来完成执行。

CloudSimExample4:展示了如何创建两个包含一个主机的数据中心,并在它们上运行两个云任务。

CloudSimExample5:展示了如何如何创建两个数据中心,每个数据中心包含一个主机,并在它们上运行两个用户的云任务。

CloudSimExample6:展示了如何创建可伸缩的实例。

CloudSimExample7:展示了如何暂停和恢复模拟,以及动态地创建模拟实例(在这个例子中是一个 DatacenterBroker)。

CloudSimExample8:展示了。如何在运行时使用一个全局管理实体(GlobalBroker)创建模拟实体(在这个例子中是一个 DatacenterBroker)。

仿真步骤

进行CloudSim仿真前的准备工作包括:首先初始化CloudSim的工具包,创建云数据中心DataCenter和代理DataCenterBroker;然后创建虚拟机列表VmList,将虚拟机列表提交到云数据中心和代理;接着创建云任务列表CloudletList;最后将云任务列表提交给云数据中心和代理。

在进行CloudSim仿真时,首先需要对CloudSim的核心类参数进行初始化,主要有4个核心类,分别是主机类Host、云数据中心类DataCenter、虚拟机类VirtualMachine和云任务列表类Cloudlet。

Host参数包括ID、CPU、内存、带宽、外存等,Host参数的定义及初始化代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
int hostId = 0;
int ram = 2048; //Host memory (MB)
long storage = 1000000; //Host storage
int bw = 10000;
hostList.add( new Host(
hostId,
new RamProvisionerSimple(ram),
new BwProvisionerSimple(bw),
storage,
peList,
new VmSchedulerTimeShared(peList)));

DataCenter参数包括主机架构、操作系统、虚拟机监视器种类、时区、CPU的使用费用、内存的使用费用、外存的使用费用、带宽的使用费用等。DataCenter参数的定义及初始化代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
String arch = "x86";       		//system architecture
String os = "Linux"; //operating system
String vmm = "Xen";
double time_zone = 10.0; //time zone this resource located
double cost = 3.0; //the cost of using processing in this resource
double costPerMem = 0.05; //the cost of using memory in this resource
double costPerStorage = 0.001; //the cost of using storage in this
//resource
double costPerBw = 0.0; //the cost of using bw in this resource
LinkedList<Storage> storageList = new LinkedList<Storage>(); //we are not adding SAN
//devices by now

DatacenterCharacteristics characteristics = new DatacenterCharacteristics(
arch, os, vmm, hostList, time_zone, cost, costPerMem, costPerStorage, costPerBw);

//we need to create a PowerDatacenter object.
Datacenter datacenter = null;
try {
datacenter = new Datacenter(name, characteristics, new VmAllocationPolicySimple(hostList),
storageList, 0);
} catch (Exception e) {
e.printStackTrace();
}

VirtualMachine参数包括ID、MIPS、镜像大小、内存大小、带宽、CPU数、虚拟机命名等。VirtualMachine参数的定义及初始化代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//VirtualMachine properties
int vmid = 0;
int mips = 1000;
long size = 10000; //image size (MB)
int ram = 512; //vm memory (MB)
long bw = 1000;
int pesNumber = 1; //number of cpus
String vmm = "Xen"; //VMM name

//create VM
Vm vm = new Vm(vmid, brokerId, mips, pesNumber, ram, bw, size, vmm,
new CloudletSchedulerTimeShared());

//add the VM to the vmList
vmlist.add(vm);

//submit vm list to the broker
broker.submitVmList(vmlist);

Cloudlet参数包括编号、执行时的应用长度、用到的CPU数量、提交应用前的文件大小、应用执行完成后的文件大小、CPU和内存的使用模型/策略、网络带宽的使用模型/策略等。Cloudlet参数的定义及初始化代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//Cloudlet properties
int id = 0;
long length = 400000;
long fileSize = 300;
long outputSize = 300;
UtilizationModel utilizationModel = new UtilizationModelFull();

Cloudlet cloudlet = new Cloudlet(id, length, pesNumber, fileSize, outputSize,
utilizationModel, utilizationModel, utilizationModel);
cloudlet.setUserId(brokerId);
cloudlet.setVmId(vmid);

//add the cloudlet to the list
cloudletList.add(cloudlet);

//submit cloudlet list to the broker
broker.submitCloudletList(cloudletList);

实验任务

现在需要仿真:在2个云数据中心上分别各配置2台虚拟机,每台虚拟机运行1个用户的4个Cloudlet,总计4个用户16个Cloudlet,请进行实验,并给出实验结果截图附在实验报告中。

image-20231027220654889