第九章 云计算模拟编程实践
CloudSim对云系统中的各种组件进行模拟
云数据中心(Datacenter)
物理机(Host)
虚拟机(VM)
服务代理商(DatacenterBroker)
任务单元(Cloudlet):构建云环境下的任务
云信息服务(CIS)
学习CloudSim源码我是按照包和功能划分
CloudSim分为core,distributions,lists,network,power,provisioners,util和一些核心类
core中还有个子包predicates,里面是选择延时队列事件的一些操作
PredicateAny.java,是一个将匹配延迟事件队列上的任何事件的predicate,在Simulation中有一个可公开访问的predicate实例,名为Simulation.SIM_ANY,因此不需要创建新的实例。
PredicateFrom:用于选择特定实体(提供实体Id)已经发送的事件。
PredicateNone:是一个predicate不会匹配延迟事件队列上的任何事件
PredicateNotFrom:用于选择特定实体(提供实体Id)尚未发送的事件。
PredicateType用于选择有特定标签(提供一组标签)的事件
PredicateNotType用于选择不匹配特定标签(提供一组标签)的事件
延时队列,第一他是个队列,所以具有对列功能第二就是延时,这就是延时对列,功能也就是将任务放在该延时对列中,只有到了延时时刻才能从该延时对列中获取任务否则获取不到……
core中的其余类:
CloudInformationService.java,云信息服务(CIS,Cloud Information Service )是一个可以对网格资源提供注册、检索、探测服务的实体。云主机列表通过使用该实体将自身进行登记来通知就绪状态来处理 Cloudlets,具体是通过startEntity() 方法。其他实体可以联系这个类用于资源发现服务
CloudSimShutdown.java,用于阶树所有终端用户和代理实体,然后向CIS发送仿真结束信号
CloudSimTags.java,包含多个静态的时间或命令标签,CloudSim实体在接收和发送事件时使用这些标签决定要采取的操作类型
SimEntity.java,代表一个仿真实体,该实体既能向其他实体发送消息,也能处理接收到的消息。所有的实体必须扩展该类并重写其中的三个核心方法:startEntity(),ProcessEvent()和shutdownEntity(),它们分别定义了实体初始化、事件处理和实体销毁的行为
SimEvent.java,给出了在两个或多个实体间传递仿事件的过程。SimEvent存储了关于事件的信息,包括事件的类型、初始化事件、事件发生的事件、结束事件、事件转法到目标实体的事件、资源标识、目标实体、事件标签及需要传输到目标实体的数据
DeferredQueue.java,实现了延时事件队列增加,移除事件等
FutureQueue.java,实现了未来事件队列的增加,移除事件等
distributions包——————不知道
network包不去解读
power包,整个数据中心各种能耗的统计,因为毕设涉及混合供电,整个包都会重写,就不想仔细研究了
provisioners包,主要是指主机处理能力、带宽和内存,在CloudSim中,如何分配这些资源给虚拟机是由类PeProvisioner、BwProvisioner和RamProvisioner分别定义的。这三个类都是抽象类,只定义了需要的方法接口,研究人员可以通过继承这些类实现自定义的分配策
util包,ExecutionTimeMeasurer.java,衡量任务执行时间
WorkLoadModel.java,产生一系列的任务
WorkloadFileReader.java,从文件中读取并产生任务。这两个类对我来说用不上,因为最后要做基于人口密度的请求
Cloudlet.java
userId//用户ID
cloudletLength//云任务长度
cloudletFileSize//字节=程序+输入数据大小
cloudletoutputSize//云任务输出文件大小
pesNumber//执行任务请求的PE数(cpu数)
cloudletId//云任务ID
status//云任务状态
num//十进制格式
finishTime//云任务完成时间
execStartTime//执行仿真开始时间
reservationID//云任务预约ID
record//是否记录
history//历史
resList//资源列表 (Resource是Cloudlet的一个内部类,包含任务提交时间,云任务从到达到离开时间,云任务执行时间,云资源每秒费用,已完成云任务长度,云资源名,该类的作用是等级云任务的动向)
index//索引
classType//云任务类别(优先级)
Cloudsim模拟CPU资源的调度在两个层次上:主机和VM
在主机层,主机分享每一个处理器单元的片给运行在其上的每一个虚拟机。由于资源被分享在虚拟机之间,这种调度称作VmScheduler。一个主机的这种调度是这个主机构造函数的一个参数
在虚拟机层,每一个虚拟机在其实运行的云任务之间划分从主机接收的资源。由于在这一层资源被云任务共享,这种调度称为CloudScheduler。一个虚拟机的这种调度室它的构造函数的参数
一个是物理机的资源如何分配给虚拟机
另一个是虚拟机的资源如何分配给每一个任务
CloudletScheduler.java,云任务调度策略
CloudletSchedulerSpaceShared,云任务调度空间共享,这意味着如果有比可用的处理单元多的运行单元(VMS或者Cloudlets),后几个单元到达等待队列,直到有足够的资源可用,即独自占用处理单元
CloudletSchedulerTimeShared,云任务调度时间共享,所有任务同时运行,即可用处理单元片是共享想在所有任务之间
VMScheduler.java,虚拟机调度策略
VmSchedulerSpaceShared,虚拟机要求处理单元独自占用
VmSchedulerTimeShared,可用处理单元片是共享的在运行单元之间,所有单元同时运行
Datacenter.java,包含数据中心特性,虚拟机到哪个物理机的分配策略,存储列表,虚拟机列表,调度间隔等
DatacenterBroker.java,与云用户直接交互,充当用户与数据中心的中间人,屏蔽了云数据中心的内部操作(如虚拟机的创建、管理、任务单元在虚拟机上的分配),用户只需要提交自己的服务请求即可。DatacenterBroker定义了一组操作,用于和用户与数据中心的交互。
bindCloudletToVm(int cloudletId, int vmId):明确指定一个给定的云任务必须运行在一个特定的虚拟机上。
processEvent(SimEvent ev):处理这个broker可以获得的事件。
processResourceCharacteristicsRequest(SimEvent ev):处理数据中心特征请求。
processResourceCharacteristics(SimEvent ev):处理数据中心特征响应。
processVmCreate(SimEvent ev):处理虚拟机创建请求的响应。
processCloudletReturn(SimEvent ev):云任务完成后返回。
createVmsInDatacenter(int datacenterId):在某个数据中心中创建虚拟机,但是没有找到具体创建的代码???
submitCloudlets():提交云任务集给已创建的虚拟机。
DatacenterBroker的创建主要是初始化了许多在后续管理调度中会用到的列表。
vmList:待创建的虚拟机列表(VM参数已经设置好,并且new出了VM对象,但是还没有具体创建到数据中心)。
vmsCreatedList:真正创建的虚拟机列表。
cloudletList:用户提交给broker的任务列表。
cloudletSubmittedList:broker提交给数据中心的任务列表。
DatacenterCharacteristics.java,代表数据中心一些静态属性,如操作系统等
DataCloudTags.java,数据云标签,主要为文件服务
File.java,程序外带的文件处理,有时候处理任务,任务需要某些文件中的数据
UtilizationModel.java,返回CPU利用率??
VmAllocationPolicy.java,虚拟机分配是指根据特定的分配策略在满足一定条件的物理机上创建虚拟机。CloudSim只是实现了简单的虚拟机分配策略,默认情况下直接使用FCFS策略为主机分配虚拟机。VmAllocationPolicy是虚拟机分配策略的抽象类,目前CloudSim通过VmAllocationPolicySimple类实现虚拟机分配, 方法allocateHostForVm(Vm vm)是该类的核心,它实现了从主机列表中选择一台物理机,并在其上创建虚拟机vm。主要实现过程的描述如下:(1) 记录下所有物理机可用的处理器核心数。(2) 从中选出可用处理器核心数最多的第一台物理机,并尝试在其上创建虚拟机。(3) 如果(2)失败了且还有物理机没有尝试过,就排除当前选择的这台物理机,重做(2)。(4) 根据虚拟机是否创建成功,返回true或false。