CloudSim:
支持云计算的资源管理和调度模拟的仿真平台
EdgeCloudSim
针对边缘计算场景的一个仿真环境,基于CloudSim开发,主要针对边缘环境下的计算资源和网络资源的管理。在cloudsim的基础上添加了边缘中资源管理的特性。
主要分为6个模块:默认情况下各个模块以及其中的主要元素的关系
如下:
移动模块
为设备增加位置信息,可以通过扩展抽象类Mobility Model实现不同的设备移动模型
负载生成模块:
通过扩展抽象类LoadGeneratorModel实现不同的计算任务生成模式。
边缘协调模块:
负责从其他模块收集信息,并决定如何让处理传入的客户端请求,可以通过扩展抽象类EdgeOrchestrator来条件不同类型的边缘协调器。
网络模块:
包括wlan和wan,同时考虑数据的上传和下载,默认实现是单个服务器队列模型,可以通过扩展抽象类NetworkModel实现其他网络行为模型。
核心仿真模块:
负责从配置文件夹中初始化边缘场景的参数并运行和管理所有的边缘实体。提供日记记录,数据以csv数据格式保存,可以通过matlab绘图。
核心仿真模块功能的大致介绍:
ScenarioFactory.java
工厂接口
通过实现接口中的方法对其他模块的对象进行实例化。
SimSettings.Java
仿真参数设置:
Initialize():从文件中初始化参数
ConfigFile,参数设置 通过load a properties file
包含一些仿真中可能用到的参数,云服务器的配置,卸载策略,调度策略等。
EdgeDevicesFile:边缘设备设置 parseEdgeDevicesXML()
设置中包括边缘服务器的参数,每个边缘服务器是一个datacenter的对象,其中包含host,host中又包含虚拟机。每部分都有其对应的计算、存储资源等。
应用程序设置 parseApplicationsXML()
应用程序设置中包含了可能存在的不同类型的任务,包括各种任务对应的计算存储资源的开销,以及任务在总任务中所占的比例。
以上import部分用于解析和读取xml文件中的参数
包括DOM解析器对象实例化和解析xml文件
DocumentBuilderFactory doc=DocumentBuilderFactory.newInstance();
DocumentBuilder db=doc.newDocumentBuilder();
调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进而可以利用DOM特性对整个XML文档进行操作了。
后续其他代码中的上述对象大部分用于解析xml或者利用dom特性来操作Document对象。
SimManager(ScenarioFactory _scenarioFactory, int _numOfMobileDevice, String _simScenario, String _orchestratorPolicy)
//SimManager(sampleFactory, j, simScenario, orchestratorPolicy)
生成对应的仿真管理实例
SimManager 继承SimEntity 用于管理仿真实体
仿真管理文件:
包括初始化卸载策略、调度策略、设备数量、移动模型mobilityModel,网络模型networkModel,边缘协调器edgeOrchestrator,云服务器manager cloudServerManager,边缘服务器管理edgeServerManager,移动服务器管理mobileServerManager,移动设备管理mobileDeviceManager;,负载生成器loadGeneratorModel
SimLogger类用于进行日志记录,并在每次任务完成后将结果从内存写入到文件中。
SimLogger.getInstance().simStarted(outputFolder,"SIMRESULT_" + simScenario + "_" + orchestratorPolicy + "_" + j + "DEVICES");
simstarted用于进行一些准备工作:这部分主要是和不同类型的app相关的,这些app信息来自applications.xml文件,applications.xml中记录了不同类型app的比例和对应任务的属性,大小,数据等。
日志文件需要记录app的完成情况。
CloudSim.init()
在创建任何的cloudsim实例前,都应该先调用init()进行初始化操作。
Simmanager的其他部分:
Simmanager->startSimulation()//初始化完成后开始仿真
//任务是创建并开启云、边、端的数据中心,创建对应数量的VM
主要是边缘部分:
startSimulation()->edgeServerManager.startDatacenters()
edgeServerManager.createVmList(mobileDeviceManager.getId())
EdgeVM(vmCounter, brokerId, mips, numOfCores, ram, bandwidth, storage, vmm, new CloudletSchedulerTimeShared());
//cloudServerManager和mobileServerManager过程相同
startDatacenters()介绍//数据中心创建
数据中心列表localDatacenters//
->createDatacenter(int index, Element datacenterElement) //创建数据中心,具体包含6个步骤,
->createHosts(datacenterElement)//创建用于存储主机的列表hostList
EdgeHost extends Host加入了主机的location信息setplace() or getlocation()
Host模拟真实主机,可用于虚拟机VM的放置
先初始化用于创建主机的参数,包括core,mips,ram,storage等,接着创建pe,这是主机的处理单元,即cpu核心。Pe(i, new PeProvisionerSimple(mips)用于创建pe,包含核心的id和处理速度,加入pe到pe的列表中。
EdgeHost(
hostIdCounter,
new RamProvisionerSimple(ram),
new BwProvisionerSimple(bandwidth), //kbps
storage,
peList,
new VmSchedulerSpaceShared(peList)
);
//用于创建边缘主机
创建完后添加主机到hostlist
vm_policy = EdgeVmAllocationPolicy_Custom(hostlist,datacenter_index)//虚拟机分配策略
创建数据中心:
Datacenter(name, characteristics, vm_policy, storageList, 0);
创建完数据中心,为每个主机创建对应的VM列表
根据数据中心->主机->VM依次遍历的方式创建所有的虚拟机。
EdgeVM extends Vm
EdgeVM(vmCounter, brokerId, mips, numOfCores, ram, bandwidth, storage, vmm, new CloudletSchedulerTimeShared())
创建包含参数和后续可能分配的虚拟机的任务队列。
云和移动端部分在某些情况下不提供服务,如果提供服务,则与边缘数据中心创建过程类似。
开始仿真
CloudSim.startSimulation();
执行已经创建的实体,直到所有实体被执行完毕。
CloudSim.stopSimulation();
下面是其他模块的核心部分:
包括负载生成和网络模型生成和移动模型生成,这些是仿真实体的数据来源。还有一部分是edge-client和edge-orchestrator,前者负责将任务发送到边缘或者云服务器,后者则负责对任务进行编排,选择对应的虚拟机。
负载生成模块:
抽象类LoadGeneratorModel()
负载生成器模块负责为给定配置生成任务。并把任务分配到移动设备,默认情况下,根据泊松分布生成任务,并且移动设备根据移动性移动模型移动。
IdleActiveLoadGenerator(numOfMobileDevice,simulationTime, simScenario) extends LoadGeneratorModel()
默认生成的任务模型,这些规则可以通过配置文件来设置。
网络模块:
抽象类networkModel
主要功能是获取任务上传和下载数据的时延,结果是基于数学公式的计算,默认实现方法是基于单个服务器队列模型。
MM1Queue extends NetworkModel
核心函数calculateMM1(double propagationDelay, double bandwidth /*Kbps*/, double PoissonMean, double avgTaskSize /*KB*/, int deviceCount)//参数包 括传播时延,带宽,平均任务大小,设备数量
移动模块:
抽象类MobilityModel.java
主要功能是提供设备的地理位置.根据移动模型对边缘设备的路径进行模拟生成。
边缘协调模块:
用于任务的调度
simScenario:
包括三种模式SINGLE_TIER,TWO_TIER,TWO_TIER_WITH_EO
单层、两层和带边缘协调器的三种卸载模式。一层和两层没有利用边缘协调模块,
包括卸载策略:选择云或者边来处理任务(一层模式没有)
调度策略:选择哪个虚拟机用来处理任务
其中单层是只卸载到边缘上,两层为卸载到边缘或者云上,但边缘协调器的方式可以实现把任务调度到其他位置的数据中心上。
在这个部分可以实现卸载算法的设计。