cloudsim
CloudSim simulation toolkit works on the basis of porgramatic models that are designed by carefully studying the behaviors of real world cloud system components. These are some of the models of CloudSim: Datacenter, Datacenterbroker, Host, Vm, VmScheduling, VMAllocation, Storage etc, few of these are abstract models and few are defined to its fullest. The abstract models are defined for enabling the extension of these models for user defined simulation scenarios.
配置 cloudsim
配置 cloudsim(Eclipse)
首先要下载 cloudsim 包,下载地址在这里:https://github.com/Cloudslab/cloudsim
下载后解压,把解压后的东西放到 eclipse 的 workspaces,方便使用,
- 用 eclipse 打开项目,在菜单栏上
File>import
导入为一个 maven 项目,它会自动下载 pom.xml 里面的包,大家一般的错误就是缺少相应的依赖包:
导入后就出现了项目,等下面的进度条走完就好了,
然后打开实例,直接运行即可
如果导入失败,可以尝试换一个工作区重新导入!
console
里面的就是输出结果
配置 cloudsim(idea)
这个比较好配置,直接导入即可
- 点击 open,打开我们的 cloudsim 文件夹即可
- 打开后同样需要添加依赖,import changes 就好了
添加好后,他已经是一个完整的项目了,可以直接运行
依据 CloudSim 源代码介绍几个核心类:
1 | (1)Cloudlet类:构建云环境下的任务。 |
1)CloudInformationService.java(org.cloudbus.cloudsim.core)
Cloudsim 中最重要的类之一,它在 CloudSim 的仿真过程中保存资源列表(在现实生活中作为数据库)。这个类实现了 processEvent(SimEvent)方法,在模拟过程中,它处理七个离散类别的事件。如果仔细分析所有基本示例,将调用 CloudSim.Init()方法,该方法将初始化 CloudInformationService 类的实例。这个类实例提供的基本服务将注册新的资源,索引和它们的发现。
2) DataCenter.java(org.cloudbus.cloudsim)
该类通过持有主机,处理元素(Pe)和存储为列表的实例来模仿真实数据中心的基础架构功能。同时,为了方便您的模型和地理位置的可用性,它将初始化 DataCenterCharacteristics。这个类还实现了自己的 processEvent(SimEvent)方法,在模拟过程中,它处理了二十七个默认离散事件类别,如资源信息收集,虚拟机生命周期,云端提交状态等。
3) DataCenterBroker.java(org.cloudbus.cloudsim)
4) CloudSimShutdown.java(org.cloudbus.cloudsim.core)
5) NetDatacenterBroker.java(org.cloudbus.cloudsim.network.datacenter)
6) Switch.java(org.cloudbus.cloudsim.network.datacenter)
在这里,在CloudSim文件夹中,有以下文件夹:
- 例子:这个文件夹还包含了各种基于场景的用例,这个基本上是一个非常简单的实现来演示如何使用这个模拟引擎。这些示例包含各种用例,从基于虚拟机的数据中心开始,模仿使用功耗感知模型有效处理其操作的真正数据中心的实际配置。所有这些例子都被归类为以下包/名称空间:
- org.cloudbus.cloudsim.examples:与生成基础级别基础结构实现有关的基本示例。
- org.cloudbus.cloudsim.examples.network:包含与基于拓扑的数据中心模拟相关的各种使用案例。
- org.cloudbus.cloudsim.examples.network.datacenter:这个包支持“org.cloudbus.cloudsim.examples.network”这个软件包,并附加了一些模仿网络支持云系统数据中心的类。
- org.cloudbus.cloudsim.examples.power:包含与功耗感知用例相关的实现,是cloudsim功耗感知模型实现最有趣的实现之一。
- org.cloudbus.cloudsim.examples.power.random:包含用于支持数据中心中的绿色计算概念的各种Power模型的实现。
- org.cloudbus.cloudsim.examples.power.planetlab:这也包含类似的功率模型实现,但是用来测试仿真的数据是从planetlab中获得的。这意味着这套示例可以处理真实的数据。
- workload.planetlab:这个软件包包含了来自地球实验室的所有数据,它是一个数据明智的数据。这进一步被’org.cloudbus.cloudsim.examples.power.planetlab’包中定义的例子所消耗。
- 来源:该文件夹包含所有的模型类,支持cloudsim的模拟过程。这些模型根据其属性和行为进一步在各种包/名称空间中进行结构化。以下是可用的软件包:
- org.cloudbus.cloudsim:包含与CPU,RAM,网络带宽等相关的DataCenter,Broker,Host,CPU,存储,资源,分配策略和利用模型相关的类的集合。
- org.cloudbus.cloudsim.core:包含云模拟引擎的支柱类,包括事件调度执行引擎,实体库定义,云信息服务等。
- org.cloudbus.cloudsim.core.predicates:这些类用于启用事件比较以及执行相应的事件。
- org.cloudbus.cloudsim.distributions:包含模拟过程中使用的各种标准数学分布的实现。
- org.cloudbus.cloudsim.lists:包含在主机,虚拟机,虚拟机等列表上执行的操作的实现。
- org.cloudbus.cloudsim.network:包含几个路由算法的实现,如:FloydWarshall,BRITE等
- org.cloudbus.cloudsim.network.datacenter:包含基于基于网络的数据中心模拟的与模型有关的类的实现。
- org.cloudbus.cloudsim.power:包含与功耗感知模型相关的数据中心,代理,主机,虚拟机和分配策略的扩展实现
- org.cloudbus.cloudsim.power.lists:仅包含启用了功耗感知数据中心模型的虚拟机的实现
- org.cloudbus.cloudsim.power.models:包含市场上可用的各种CPU模型的实现,并用于各种现实生活中的数据中心提供商。
- org.cloudbus.cloudsim.provisioners:包含CPU,RAM,带宽的供应程序的实施。
- org.cloudbus.cloudsim.util:包含在仿真过程中用于某些计算目的的一组类。
CloudSimExample1 包含以下属性的声明和定义:
CloudletList:
List类型的静态变量。通过仿真过程它将包含云类的所有实例的列表。该列表被提交给 DataCenterBroker 的实例,以便分配给特定的 VM 用于执行目的。 vmlist:一个 List
类型的静态变量,在模拟过程中,它将包含 Vm 类的所有实例的列表。该列表还将被提交给 DataCenterBroker 的实例以分配用于执行的云实例。云块到 Vm 的映射可以是随机的或特定的。这取决于用例实现。 createBroker():
此方法将创建并返回 DataCenterBroker 的实例。这个方法在 main 方法里面调用也是一个静态的方法。createDatacenter(String):
该方法包含定义 DataCenter 配置的实现,该配置将用于在仿真过程中处理云的执行。此方法将数据中心名称作为名称,仅用于识别目的。在这个方法中,只有 DataCenterCharateristics 被定义了哪个实例实例化主机列表以及处理元素列表。这些列表以及存储列表,分配策略和 DataCenterCharacteristics 的实例将创建 DataCenter 实例并返回到主方法调用。printCloudletList(List
):
一旦模拟结束,此方法用于打印模拟结果。main(string args[]):这个方法是一旦你点击运行按钮就被调用的第一个方法。此方法包含执行下面提到的所有步骤,并按顺序执行。此方法根据执行中的步骤在需要的时候向特定的方法发送一个调用。以下步骤解释了每个步骤及其代码:
第一步:
Cloudsim 仿真将被初始化以进行仿真,并且这个仿真需要下面的信息来启动:
- number of user,
- calendar instance
- traceflag value.
所有这些参数都需要初始化 Cloudsim 仿真过程,CloudSim.init()方法初始化并发送一个调用来创建一个 CloudInfromationService 实例(创建第一个实体)。下面的代码用于此:
1 | int num_user = 1; // number of cloud users defined statically |
第二步
一个数据中心实例将被创建,这是通过一个单独的CreateDataCenter
完成的,这个实例创建了处理元素,主机,存储,成本和数据中心特性的实例。
1 | Datacenter datacenter0 = createDatacenter("Datacenter_0"); |
这反过来将调用发送到 createDatacenter()
方法的以下定义:
1 | private static Datacenter createDatacenter(String name) { |
第三步
一个 Datacenterbroker 实例被创建,创建代理
1 | DatacenterBroker broker = createBroker(); |
这反过来将调用发送到 createBroker()方法的以下定义:
1 | private static DatacenterBroker createBroker() |
第四步
创建一个虚拟机列表,然后再创建一个虚拟机,并将虚拟机添加到虚拟机列表中,然后将虚拟机列表提交到数据中心代理中
1 | // Virtual Machine parameter description |
第五步
创建云任务列表,创建云任务,将云任务添加到列表中,将云任务列表提交给数据中心代理
1 | // Cloudlet properties |
第六步
开始模拟,结束模拟1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17/*
Simulation started here after all teh configurations are set.
The method calls initiate all the entities and their events
are started scheduling, then each event entity processes
its scheduled tasks. Once all the scheduled tasks are over
the call for this method is over.
*/
CloudSim.startSimulation();
/*
Once the startsimulation() method call is over and
it there is no error occured then immdeiatly after
that the stopsimulation() method is call.
This method is going to stop all the entities
and returns the control to main method.
*/
CloudSim.stopSimulation();
第七步
输出结果
1 | //Final step: Print results when simulation is over |
这反过来调用 printCloudletList 方法,如下所示:
1 | private static void printCloudletList(List<Cloudlet> list) |
这最终打印出云资源在其各自资源(即 DataCenter,Broker,虚拟机等)上的执行状态。在模拟过程中,状态日志会在各种情况下打印,完整的日志可能与“ CloudSimExample1.java ” 类似。
1 | Starting CloudSimExample1... |
CloudSim 的拓展
(ps:算法来自网络)
CloudSim 主要是对真实的云环境的一种模拟仿真,其各个类分别模拟了云计算的资源分配的各个过程,包括虚拟机向物理机的分配过程,计算任务向虚拟机的分配过程等等,这些分配策略分别在不同的 class 中进行了描述。由于 CloudSim 只是搭建了一个云数据中心的框架,因此具体的分配策略需要我们自己去实现,也就需要去在相应的 Class 中添加自己的策略函数。在 CloudSim 给的 examples 中,给运任务分配虚拟机的时候,使用的函数是broker.bindCloudletToVm(cloudlet1.getCloudletId(),vm1.getId());
,我们可以跟进去发现,该函数是在DatacenterBroker.java
中,该函数使用的是直接绑定的策略,即程序中指定了云任务和虚拟机的绑定方式,如果我们需要使用自己的分配策略,就得在 DatacenterBroker.java
中添加自己的分配策略函数。下面分别使用两种分配策略对云任务进行分配虚拟机,分别为顺序分配策略和贪心分配策略:
顺序分配策略
在 DatacenterBroker 类中实现方法 bindCloudletsToVmsSimple():用于把一组任务顺序分配给一组虚拟机,当所有的虚拟机都运行有任务后,再从第一个虚拟机开始重头分配任务。
1 | public void bindCloudletsToVmsSimple() { |
贪心策略
在DatacenterBroker
类中实现方法bindCloudletsToVmsTimeAwared()
:定义一个矩阵 time[i][j],表示任务 i 在虚拟机 j 上所需的执行时间。在初始化矩阵 time 前,首先将任务按 MI 的大小降序排序,将虚拟机按 MIPS 的大小升序排列。从矩阵中行号为 0 的任务开始,每次都尝试分配给最后一列对应的虚拟机,如果该选择相对于其他选择是最优的,就完成分配,否则将任务分配给使当前结果最优的虚拟机。同时,如果有多种分配方法都能使当前结果最优,则将任务分配给运行任务最少的虚拟机。
1 | public void bindCloudletsToVmsTimeAwared() { |
如果想实现自定义任务绑定,可以自行编写 CloudletList->VmList 的映射函数,以某种方式完成任务列表中的所有 Cloudlet 的绑定工作。然后在模拟程序中,vm 列表和 cloudlet 列表提交之后调用该自定义函数,即可完成所有任务的绑定(这样自然就不需要自带的轮转法代劳了)。下面采用一种改进型轮转法来绑定任务,长任务尽量优先分配到高性能 VM 上。
插入到 DatacenterBroker 类中
1 | import java.util.Collections; |
写完两个分配策略函数,后面可以写一个测试函数,分别对这两种分配策略进行仿真实验,并进行对比。在org.cloudbus.cloudsim.examples
中,写一个自己的MyAllocationTest
类,其源码为:
1 | public class MyAllocationTest { |
在主函数中,分别调用函数broker.bindCloudletsToVmsSimple()
和broker.bindCloudletsToVmsTimeAwared()
,表示分别启动顺序分配策略和贪心策略,其运行结果分别为:
贪心算法见下一篇博客