前言
CloudSim是一款在学术界常见的用于云计算仿真的工具包。其设计架构和常用的使用方法已经可见于论文和GitHub源码中的example案例。本文默认阅读者已经具备了一些相关的背景知识,比如具备一定Java编程基础、已经能自己使用Maven构建项目并解决依赖问题,以及对CloudSim的基本概念有初步了解并有过基本实践。另外,本文基于的CloudSim版本是3.0.3。本文将介绍的核心内容是一款基于CloudSim拓展出来的仿真平台。拓展部分完全由华南理工大学林伟伟教授的相关团队开发。
本文的研究动机
- CloudSim的原作者在设计之初,对多种资源的考虑其实都只停留在很浅的层面上。在CloudSim中,一共出现了三种资源,分别是CPU、内存和带宽(bandwidth)。之所以说停留在很浅的层面,是因为在任务提交(submit)和后面调度的过程中都没有考虑过内存和带宽的约束。此外,在PowerDatacenter统计能耗的时候,也没有把内存和带宽的资源能耗考虑进去。
- 日志输出繁杂的,不方便定位bug。CloudSim专门提供了一个Log类用于全局的日志记录或者输出到控制台。然而,需要输出的地方太多,而对输出到控制台的开关控制的粒度也不够细,只有一个全局的Log.enable()可用。如果只想知道Datacenter类的updateCloudletProcessing,则还需往相应模块的代码专门添加enable和disable代码。此外,日志输出的代码位置也不容易定位。如果能对日志输出代码的行数和类文件名一目了然,对于debug有很大帮助。
- CloudSim对于虚拟机资源请求量的统计方式不够通用。如下图所示,CloudSim是直接将虚拟机上所有的Cloudlet的CPU利用率线性相加起来作为虚拟机的总CPU利用率,然后乘以总MIPS作为虚拟机的总MIPS请求量。这显然不合理。
- CloudSim为了能够仿真负载变动这一过程,实现了UtilizationModelPlanetLabInMemory。但是这个类的使用局限性很大,完全是为了使用PlanetLab数据而量身定制的。首先UtilizationModelPlanetLabInMemory不能根据使用者想法决定是否模拟负载变动,其次可运行的数据总量被限制在了288个(因为PlanetLab的每个数据文件就是每隔5分钟,记录了一天内负载利用率,一共刚好288行数据)。
本文的解决方案与贡献
- 针对提交任务未考虑资源限制这一点,我们拓展了Broker提交任务部分的代码,并实现了一些任务与虚拟机的绑定策略(CloudletAssignmentPolicy)。同时为了配合多资源维度的调度,还拓展了CloudSim的其他功能。比如对内存、I/O等资源的资源分配和历史利用率统计。
- 对于日志输出繁杂这一问题,为了方便定位bug,首先需要知道日志输出的类文件名以及行号,为此我们改写了CloudSim的Log类的相关打印函数。
- CS的资源请求量统计方式其实是CS中众多逻辑不严谨地方的其中一处。除了完善原CS的资源请求量统计方式,还修补了很多地方的代码。比如vCPU超分、VM可以被关闭的状态判定等等。
- 为了更好地模拟负载变动,弥补原CS的设计缺陷,我们拓展了一个新的资源模型来模拟资源变动。
综上,我们提出了MultiRECloudSim来进一步完善CS。代码可见于此,相关论文见于此。
关于一些符号和术语
本文中的一些术语或符号会交替使用,以下术语或符号在本文中的含义其实是一样的。
云任务 | Cloudlet |
主机/服务器/物理机 | Host |
CS | CloudSim |
虚拟机 | VM |
MCS | MultiRECloudSim |
PE | 主机的处理单元(核数) |
vCPU | 虚拟机的核(通常支持超分) |
broker/datacenterbroker | 数据中心代理 |
CloudletScheduler | 任务调度器 |
XXXProvisioner | 资源供应器 |
CloudletXXXAllocator | 资源分配器 |
MCS架构介绍
下图所示为MCS的完整类架构,由于篇幅限制,本文只讨论针对研究动机提出的解决方案。
调度实体的拓展:
SimCloudlet:此类拓展了原CS的Cloudlet对多种类型资源的需求,包括CPU,内存,IO和带宽。 CS中,CPU支持静态和动态变化的资源需求(动态依靠UtilizationModelPlanetLabInMemory)。现在,依靠UtilizationModelByFile,内存、IO和带宽也支持动态需求。
SimPowerHost:此类对需要CPU、内存、IO和带宽资源的主机进行建模,并在每个更新时间点将资源分配和附加到VM上。该类也增加了内存、IO和带宽等能耗模型作为新增字段。在SimPowerDatacenter中,这些字段被调用以统计能耗。
SimPowerHostMultiR:此类继承了SimPowerHost,未在上图中列出。该类主要拓展的功能是增加对主机和虚拟机中多种资源利用率变动的记录。
SimPowerHost还会记录不同时间所有资源的利用率。这些记录的不同种类资源的利用率数据,会结合对应的能耗模型被用于计算主机功耗。
SimPowerVm:除了新添加的IO资源外,与PowerVm没有其他区别。
围绕调度实体周边的拓展——资源分配
CloudletCpuA