CloudSim资源调度「建议收藏」

2022-11-08 15:04:41 浏览数 (2)

大家好,又见面了,我是你们的朋友全栈君。

本菜鸡的毕业设计选择的就是面向数据中心能耗优化的粒子群算法的设计与实现,别问我为啥选这个,我也不知道,在网上查询了很多之后发现也就GitHub上面就4个项目,好像也就第四能用。然后就是YouTube上面有一个印度小哥的视频,做了一个高大上的界面,用的Internet Topology Zoo做了一个界面,非常酷眩,然而没有源代码,全程是成果展示,心痛的要死。但是仅仅是云任务调度,而这种仿真题目,按照老师给的要求应该是虚拟机到物理机的映射的优化以及在这个基础上扩展,网上资料很少,这里我用了一点笨办法狗出来了,希望能帮到其他人(这也是我第一次写博客0.o,错误的地方大佬请指正)。

1.环境的准备

这里讲的是用JAVA及Eclipse进行仿真,JAVA环境变量就不提了,这个肯定都会,然后从网上下载一个CloudSim的包,之后啊,就直接用Eclipse进行Import->Maven->Existing Maven Project导入,等它自动配置下好需要的一些jar包,第一步就搞定了。

2.云环境的准备

这里说的云环境其实也就是物理机,虚拟机以及云任务的参数,这里说的是能耗优化问题,所以物理机和虚拟机的主要参数是MIPS,也就是CPU的计算能力,其次则是内存RAM,处理器核数目PES,带宽BW以及存储空间大小几个参数,如下图:

这个是CloudSim中的示例,我貌似修改了一些参数,记不太清了,但是无所谓,因为一般来说你都需要根据自己要做的东西进行这些参数的设计,你可以以根据这些参数进行自己参数的生成,最简单的方法就是生成多级文件,第一级命名为物理机和虚拟机的数目,如20-60等等,第二级则是可以命名为“PM-CPU”“PM-RAM””VM-CPU”等等的方法,之后再规定其参数的范围,写成几种规格的对应第一级命名个数的数据,直接写成TXT文件即可;又或者规定一定范围直接写随机数,根据自己的目的进行场景的生成(读写文件还是很简单的对吧,毕竟我这菜鸡都会)。云任务的主要参数则是长度,如果你对云任务没什么特定要求的话,你其实可以不用生成云任务的,因为它自带0.0,比如下图:

这个自带的dvfs的例子当中用的是它2110303的云任务,其中又1052个云任务,一般来说没有什么特定要求,那么它是完全足够了的。之后的仿真也是模仿这个例子完成的。

3.读取并处理数据

现在则是要对之前生成的数据进行一个读取了,根据上面的那个图片,在那个例子的包当中新建一个你喜欢的名字的类,如pso,首先直接复制dvfs中的内容进去,类名自己记得修改。之后进入PlanetLabRunner这个类,暴力一点方法是直接在里面写代码,不过如果之后还要进行别的操作的时候就比较麻烦,也可以新建一个你喜欢的名字的类,如Pla,同样继承自RunnerAbstract,然后在pso中把PlanetLabRunner的调用替换为Pla。之后则是对Pla编程,这里主要就是创建了hostList,vmList和cloudletList。如果你什么都不修改的话它就是用的就是Constants类中的参数和201110303中的云任务参数,这里我们要做的则是读取我们之前生成好的数据,然后带入到创建这三个列表的方法中,这是CloudSim自带的0.0,如下图。

具体的参数和涵义我就不细说了。

4.虚拟机映射至物理的调度方法实现

把数据都读出来了之后就要实现自己的调度方法,这里首先进入RunnerAbstract类,这里面有一个名为getVmAllocationPolicy()的方法,这个方法中有很多选择分支语句,对应了dvfs或者说pso,也就是程序入口类中字符串vmAllocationPolicy的内容,比如dvfs类对应的就是dvfs,这里首先你可以修改一下vmAllocationPolicy中的内容,之后在getVmAllocationPolicy()方法中添加一条选择语句。

之后进入PowerVmAllocationPolicySimple类中,你会发现其实它空空如也,真正的调度方案的实现在它的父类

PowerVmAllocationPolicyAbstract类中,这里你可以找到一个findHostForVm()的方法,这里也就是为虚拟机选择物理机的地方啦(故名思意?emmmm)。

在这里本来采用的是FF的法子,我对它进行了一点点修改。不过这里实际上是每个虚拟机创建的时候都会为它寻找一次合适的映射方法,如果把算法写在这里,如果是FF,FFD什么的倒是还行,(原谅我狭隘的只考虑做毕业设计的选择,毕竟大佬看这也没啥帮助)但是毕业设计在这方面大多数都是蚁群/粒子群/遗传等等的群智能算法,那如果虚拟机多的时候,仿真一次要跑好多次算法,每次结果还都不大一样,这就很头疼,所以应当只跑一次。我直接用的最偷懒的方法,在PlanetLabRunner类读取数据的时候就直接跑算法,然后把映射方案写到文本文件当中,然后在findHostForVm()当中读取,然后再分配。

省略掉的是它原来的顺序方案。这个方法倒对所有的算法都还算友好,不管你是用什么算法仿真,但是都是可以用的。

5.云任务调度的实现

仅仅完成以上四个步骤,你查看控制台会发现实际只有你虚拟机数目的个数的云任务被执行了,其他的任务绑定时会说虚拟机不可用。如果你跑过例子你会发现它云任务的分配方式是给每一个云任务分配一个虚拟机,但如果虚拟机数目少于云任务(反正我的虚拟机一般就几十个到一两百,用的是它20110303的,有1052个任务),那么其他的任务就无法执行。这个时候就需要修改一下调度方法了。最简单的方法是你自己写一个简单的调度算法,如果要求比较高,那么可以写一个PSO/GA/SA等等方法,以时间最短原则绑定云任务。其次,也可以参照刘鹏教授的《云计算》第二版一书的两个例子,写一个顺序调度和一个贪心调度方法(这里提醒一下第三版没有这个内容了,第二版第九章还是第十章才有,我要吐槽一下他第三版把那一章删掉了….)。

最后,关于虚拟机映射至物理机和云任务的绑定就是这样了。除此之外还可以用NetworkTopology

类当中的buildNetworkTopology()以及mapNode()方法构建网络拓扑,CloudSim自带的拓扑比较简单,如果要求较高的话则是可以通过修改这些实现自定义的拓扑连接。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/182368.html原文链接:https://javaforall.cn

0 人点赞