IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> CloudSim Plus仿真(三) -> 正文阅读

[系统运维]CloudSim Plus仿真(三)

前言

先前的例子在代码中指定数据中心、主机、虚拟机的参数,如:rambwstoragemipsPEs等,非常混乱。通过改进,实现从XML配置文件读取数据来创建,实现数据与逻辑分类,使之更加直观。

配置文件

通过抽象,将一个数据中心(datacenter)描述成如下配置文件。

datacenters.xml

<?xml version="1.0"?>
<datacenters>
	 <datacenter arch="x86" os="Linux" >
		<hosts>
			<host>
				<core>4</core>				<!-- in number of Processing Elements(PEs)  -->
				<mips>8000</mips>			<!-- Million Instructions Per Second (MIPS) -->
				<ram>1600</ram>  			<!-- in Megabytes -->
				<storage>20000</storage>  	<!-- in Megabytes -->
				<VMs>
					<VM>
						<core>1</core>
						<mips>1000</mips>
						<ram>400</ram>
						<storage>2000</storage>
					</VM>
					<VM>
						<core>1</core>
						<mips>1000</mips>
						<ram>400</ram>
						<storage>2000</storage>
					</VM>
					<VM>
						<core>2</core>
						<mips>5000</mips>
						<ram>800</ram>
						<storage>4000</storage>
					</VM>
				</VMs>
			</host>
		</hosts>
	</datacenter>
</datacenters>

关于主机的带宽参数,虚拟机的CPU调度策略等,可以写到另外的配置文件中。

DatacenterParameters.java

public class DatacenterParameters {
	public static int WAN_BANDWIDTH = 300;      // bandwidth (in Megabits/s)
	// CloudletSpaceShared,Cloudlet所需的PE将被独有地安排。
	// 这意味着如果Cloudlet数量大于可用的PE数量,后面到达的Cloudlet将在队列中等待,直到有足够的空闲资源。
	public static String CPU_ALLOCATION_POLICY = "SPACE_SHARED";
}

解析数据

  • 同一数据中心的主机(host)分配相同的带宽,也即配置文件中的WAN_BANDWIDTH
  • 同一台主机上的虚拟机上均分带宽,也即:long vmBandwidth = bandwidth / vmNodeList.getLength();
  • 在创建虚拟机时将虚拟机绑定到所属的主机上。
/**
 * @Author: mhh
 * @Date: 2021/8/9
 * @Description: 通过XML配置文件创建数据中心
 */
public class DatacentersManager {

    private final List<DatacenterSimple> datacentersList;
    private final List<Vm> vmList;
    private final CloudSim simulation;

    public DatacentersManager(CloudSim simulation) {
        this.simulation = simulation;
        this.datacentersList = new ArrayList<>();
        this.vmList = new ArrayList<>();
    }

    public void createDataCenters(String file) throws Exception {
        File serversFile = new File(file);
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(serversFile);
        NodeList datacenterList = doc.getElementsByTagName("datacenter");
        for (int i = 0; i < datacenterList.getLength(); i++) {
            Node datacenterNode = datacenterList.item(i);
            Element datacenterElement = (Element) datacenterNode;
            // 创建主机列表
            List<Host> hostList = createHosts(datacenterElement);
            // 创建数据中心
            datacentersList.add(new DatacenterSimple(simulation, hostList));
        }
    }

    private List<Host> createHosts(Element datacenterElement) {

        List<Host> hostList = new ArrayList<>();

        NodeList hostNodeList = datacenterElement.getElementsByTagName("host");
        for (int j = 0; j < hostNodeList.getLength(); j++) {

            Node hostNode = hostNodeList.item(j);
            Element hostElement = (Element) hostNode;
            int numOfCores = Integer.parseInt(hostElement.getElementsByTagName("core").item(0).getTextContent());
            double mips = Double.parseDouble(hostElement.getElementsByTagName("mips").item(0).getTextContent());
            long storage = Long.parseLong(hostElement.getElementsByTagName("storage").item(0).getTextContent());
            long ram = Integer.parseInt(hostElement.getElementsByTagName("ram").item(0).getTextContent());
			
			long bandwidth =  SimulationParameters.WAN_BANDWIDTH;
			
            List<Pe> peList = new ArrayList<>();

            for (int i = 0; i < numOfCores; i++) {
                peList.add(new PeSimple(mips, new PeProvisionerSimple()));
            }

            ResourceProvisioner ramProvisioner = new ResourceProvisionerSimple();
            ResourceProvisioner bwProvisioner = new ResourceProvisionerSimple();
            VmScheduler vmScheduler = new VmSchedulerSpaceShared();

            Host host = new HostSimple(ram, bandwidth, storage, peList);
            host.setRamProvisioner(ramProvisioner).setBwProvisioner(bwProvisioner).setVmScheduler(vmScheduler);
            createVms(host, hostElement, bandwidth);
            hostList.add(host);
        }

        return hostList;
    }

    private void createVms(Host host, Element hostElement, long bandwidth) {
        NodeList vmNodeList = hostElement.getElementsByTagName("VM");
        for (int k = 0; k < vmNodeList.getLength(); k++) {
            Node vmNode = vmNodeList.item(k);
            Element vmElement = (Element) vmNode;
            // VM参数
            long vmNumOfCores = Long.parseLong(vmElement.getElementsByTagName("core").item(0).getTextContent());
            double vmMips = Double.parseDouble(vmElement.getElementsByTagName("mips").item(0).getTextContent());
            int vmRam = Integer.parseInt(vmElement.getElementsByTagName("ram").item(0).getTextContent());
            long vmStorage = Long.parseLong(vmElement.getElementsByTagName("storage").item(0).getTextContent());

            long vmBandwidth = bandwidth / vmNodeList.getLength();

            CloudletScheduler tasksScheduler=  "SPACE_SHARED".equals(SimulationParameters.CPU_ALLOCATION_POLICY) ? new CloudletSchedulerSpaceShared() : new CloudletSchedulerTimeShared();

            Vm vm = new VmSimple(vmList.size(), vmMips, vmNumOfCores);
            vm.setRam(vmRam).setBw(vmBandwidth).setSize(vmStorage).setCloudletScheduler(tasksScheduler);
            vm.setHost(host);
            vmList.add(vm);
        }
    }

    public List<DatacenterSimple> getDatacentersList() {
        return datacentersList;
    }

    public List<Vm> getVmList() {
        return vmList;
    }
}

测试

/**
 * @Author: mhh
 * @Date: 2021/8/9
 * @Description: 使用配置文件生成数据中心
 */
public class Test {

    // 创建云任务
    private static final int CLOUDLETS = 4;
    private static final int CLOUDLET_PES = 1;
    private static final int CLOUDLET_LENGTH = 10000;

    public static void main(String[] args) throws Exception {
        new Test();
    }

    private Test() throws Exception {
        // 1.设置日志级别
        // Log.setLevel(WARN);
        // 2.初始化CloudSim
        CloudSim simulation = new CloudSim();
        // 3.创建数据中心代理
        // 创建代理,该代理是代表云客户进行管理其VM和Cloudlet的软件
        // 与云用户直接交互,充当用户与数据中心的中间人,屏蔽了云数据中心的内部操作
        // (如虚拟机的创建、管理、任务单元在虚拟机上的分配),
        // 用户只需要提交自己的服务请求即可。
        DatacenterBroker broker0 = new DatacenterBrokerSimple(simulation);
        // 4.创建数据中心、创建主机列表
        DatacentersManager serversManager = new DatacentersManager(simulation);
        serversManager.createDataCenters("mobile/src/main/resources/datacenters.xml");
        List<DatacenterSimple> dataCenterList = serversManager.getDatacentersList();
        // 5.虚拟机列表
        List<Vm> vmList = serversManager.getVmList();
        // 6.创建云任务
        List<Cloudlet> cloudletList = createCloudlets();
        // 7.提交划分的虚拟机列表到代理
        broker0.submitVmList(vmList);
        // 8.提交云任务
        broker0.submitCloudletList(cloudletList);
        // 仿真开始
        simulation.start();
        // 获得仿真结果
        final List<Cloudlet> finishedCloudlets = broker0.getCloudletFinishedList();
        // 打印输出
        new CloudletsTableBuilder(finishedCloudlets).build();
    }

    /**
     * Creates a list of Cloudlets.
     */
    private List<Cloudlet> createCloudlets() {
        final List<Cloudlet> list = new ArrayList<>(CLOUDLETS);

        final UtilizationModelDynamic utilization = new UtilizationModelDynamic();
        final UtilizationModelFull utilizationModelFull = new UtilizationModelFull();

        for (int i = 0; i < CLOUDLETS; i++) {
            final Cloudlet cloudlet = new CloudletSimple(CLOUDLET_LENGTH, CLOUDLET_PES);
            cloudlet.setSizes(1024)
                    .setUtilizationModelBw(utilization)
                    .setUtilizationModelRam(utilization)
                    .setUtilizationModelCpu(utilizationModelFull);
            list.add(cloudlet);
        }
        return list;
    }
}

结果

                                         SIMULATION RESULTS

Cloudlet|Status |DC|Host|Host PEs |VM|VM PEs   |CloudletLen|CloudletPEs|StartTime|FinishTime|ExecTime
      ID|       |ID|  ID|CPU cores|ID|CPU cores|         MI|  CPU cores|  Seconds|   Seconds| Seconds
-----------------------------------------------------------------------------------------------------
       2|SUCCESS| 2|   0|        4| 2|        2|      10000|          1|        0|         2|       2
       0|SUCCESS| 2|   0|        4| 0|        1|      10000|          1|        0|        10|      10
       1|SUCCESS| 2|   0|        4| 1|        1|      10000|          1|        0|        10|      10
       3|SUCCESS| 2|   0|        4| 0|        1|      10000|          1|       10|        20|      10
-----------------------------------------------------------------------------------------------------

后记

当不关心虚拟机的调度策略时,可以使用。此外,甚至可以将cloudlet的参数也抽取成配置文件。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-08-12 17:05:23  更:2021-08-12 17:06:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 9:34:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码