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