分布式計(jì)算、云計(jì)算與大數(shù)據(jù) 第2版 課件 第5章 云計(jì)算編程實(shí)踐_第1頁
分布式計(jì)算、云計(jì)算與大數(shù)據(jù) 第2版 課件 第5章 云計(jì)算編程實(shí)踐_第2頁
分布式計(jì)算、云計(jì)算與大數(shù)據(jù) 第2版 課件 第5章 云計(jì)算編程實(shí)踐_第3頁
分布式計(jì)算、云計(jì)算與大數(shù)據(jù) 第2版 課件 第5章 云計(jì)算編程實(shí)踐_第4頁
分布式計(jì)算、云計(jì)算與大數(shù)據(jù) 第2版 課件 第5章 云計(jì)算編程實(shí)踐_第5頁
已閱讀5頁,還剩104頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第5章云計(jì)算編程實(shí)踐提綱5.1CloudSim體系結(jié)構(gòu)和API介紹5.2CloudSim環(huán)境搭建和使用方法5.3CloudSim擴(kuò)展編程5.4CloudSim的編程實(shí)踐5.5OpenStack編程實(shí)踐CloudSim體系結(jié)構(gòu)CloudSim是一個(gè)通用、可擴(kuò)展的新型仿真框架,支持無縫建模和模擬,并能進(jìn)行云計(jì)算基礎(chǔ)設(shè)施和管理服務(wù)的實(shí)驗(yàn)。這個(gè)仿真框架有如下幾個(gè)特性:支持在單個(gè)物理節(jié)點(diǎn)上進(jìn)行大規(guī)模云計(jì)算基礎(chǔ)設(shè)施的仿真和實(shí)例化。提供一個(gè)獨(dú)立的平臺(tái),供數(shù)據(jù)中心、服務(wù)代理、調(diào)度和分配策略進(jìn)行建模。提供虛擬化引擎,可在一個(gè)數(shù)據(jù)中心節(jié)點(diǎn)創(chuàng)建和管理多個(gè)獨(dú)立、協(xié)同的虛擬化服務(wù)。可以在共享空間和共享時(shí)間的處理核心分配策略之間靈活地切換虛擬化服務(wù)。

CloudSim方便用戶在組成、配置和部署軟件前評(píng)估和模擬軟件,減少云計(jì)算環(huán)境下,訪問基礎(chǔ)設(shè)施產(chǎn)生的資金耗費(fèi)?;诜抡娴姆椒ㄊ褂脩艨稍谝粋€(gè)可控的環(huán)境內(nèi)免費(fèi)地反復(fù)測試他們的服務(wù),在部署之前調(diào)節(jié)性能瓶頸。CloudSim體系結(jié)構(gòu)CloudSim采用分層的體系結(jié)構(gòu),其架構(gòu)及其架構(gòu)組件如下圖所示。CloudSim核心模擬引擎GridSim原本是CloudSim的一個(gè)組成部分,但GridSim將SimJava庫作為事件處理和實(shí)體間消息傳遞的框架,而SimJava在創(chuàng)建可伸縮仿真環(huán)境時(shí)暴露出一些不足:不支持在運(yùn)行時(shí)通過編程方式重置仿真。不支持在運(yùn)行時(shí)創(chuàng)建新的實(shí)體。SimJava的多線程機(jī)制導(dǎo)致性能開銷與系統(tǒng)規(guī)模成正比,線程之間過多的上下文切換導(dǎo)致性能嚴(yán)重下降。多線程是系統(tǒng)調(diào)試變得更加復(fù)雜。CloudSim核心模擬引擎為了克服這些限制并滿足更復(fù)雜的仿真場景,墨爾本大學(xué)的研究小組開發(fā)了一個(gè)全新的離散事件管理框架。離散事件管理框架相關(guān)的類1)CloudSim這是主類,負(fù)責(zé)管理事件隊(duì)列和控制仿真事件的順序執(zhí)行,這些事件按照它們的時(shí)間參數(shù)構(gòu)成有序隊(duì)列。在每一步調(diào)度的仿真事件會(huì)從未來事件隊(duì)列(FutureEventQueue)中被刪除,并被轉(zhuǎn)移到延時(shí)事件隊(duì)列(DeferredEventQueue)中。每個(gè)實(shí)體調(diào)用事件處理方法會(huì)從延時(shí)事件隊(duì)列中選擇事件并執(zhí)行相應(yīng)的操作。這樣靈活的管理方式,具有以下優(yōu)勢:支持實(shí)體失活操作。支持不同狀態(tài)實(shí)體的上下文切換,暫?;蚶^續(xù)仿真流程。支持運(yùn)行中創(chuàng)建新實(shí)體。支持運(yùn)行中終止或重啟仿真流程。2)DeferredQueue實(shí)現(xiàn)CloudSim使用的延時(shí)事件隊(duì)列。3)FutureQueue實(shí)現(xiàn)CloudSim使用的未來事件隊(duì)列。離散事件管理框架相關(guān)的類4)CloudInformationService(CIS)提供資源注冊、索引和發(fā)現(xiàn)能力的實(shí)體,支持兩個(gè)基本操作:publish():允許實(shí)體使用CIS進(jìn)行注冊。search():允許實(shí)體發(fā)現(xiàn)其他實(shí)體的狀態(tài)和位置,并且該實(shí)體在仿真結(jié)束時(shí)會(huì)通知其他實(shí)體。5)SimEntity代表一個(gè)仿真實(shí)體,該實(shí)體既能向其他實(shí)體發(fā)送消息,也能處理接收到的消息。所有的實(shí)體必須擴(kuò)展該類并重寫三個(gè)核心方法即startEntity()、processEvent()以及shutdownEntity()。它們分別定義了實(shí)體初始化、事件處理和實(shí)體銷毀的行為。SimEntity類提供調(diào)度新事件和向其他實(shí)體發(fā)送消息的能力,其中消息傳遞的網(wǎng)絡(luò)延時(shí)是由BRITE模型計(jì)算出來的。實(shí)體一旦建立就會(huì)使用CIS自動(dòng)注冊。6)CloudSimTags包含多個(gè)靜態(tài)的事件或命令標(biāo)簽,決定Cloudsim實(shí)體在接收和發(fā)送事件時(shí)要采取的操作類型。離散事件管理框架相關(guān)的類7)SimEvent給出了在兩個(gè)或多個(gè)實(shí)體間傳遞仿真事件的過程。SimEvent存儲(chǔ)了關(guān)于事件的信息,包括事件的類型、初始化時(shí)間、事件發(fā)生的時(shí)間、結(jié)束時(shí)間、事件轉(zhuǎn)發(fā)到目標(biāo)實(shí)體的時(shí)間、資源標(biāo)識(shí)、目標(biāo)實(shí)體、事件標(biāo)簽及需要傳輸?shù)侥繕?biāo)實(shí)體的數(shù)據(jù)。8)CloudSimShutdown用于結(jié)束所有終端用戶和代理實(shí)體,并向CIS發(fā)送仿真結(jié)束信號(hào)。9)Predicate這是一個(gè)抽象類,需要擴(kuò)展,用于從延時(shí)隊(duì)列中選擇事件。10)PredicateAny表示匹配延時(shí)隊(duì)列中的任何一個(gè)事件。CloudSim的類中有一個(gè)可以公開訪問的實(shí)例CloudSim.SIM_ANY,因此不需要為該類創(chuàng)建新的實(shí)例。11)PredicateFrom表示被特定實(shí)體放棄的事件。離散事件管理框架相關(guān)的類12)PredicateNone表示不匹配延時(shí)隊(duì)列中的任何一個(gè)事件。CloudSim的類中有一個(gè)可以公開訪問的實(shí)例CloudSim.SIM_NONE,因此不需要為該類創(chuàng)建新的實(shí)例。13)PredicateNotFrom選擇已經(jīng)被特定對(duì)象發(fā)送的事件。14)PredicateType根據(jù)選擇特定標(biāo)簽選擇事件。15)PredicateNotType選擇不滿足特定標(biāo)簽選擇事件。CloudSim層CloudSim的體系結(jié)構(gòu)分為兩層:CloudSim仿真層和用戶代碼層。CloudSim仿真層為云數(shù)據(jù)中心環(huán)境的模擬和仿真提供支持,包括虛擬機(jī)、內(nèi)存、存儲(chǔ)器和帶寬的專用管理接口。CloudSim層又可以細(xì)化為5層:網(wǎng)絡(luò)層云資源層云服務(wù)層虛擬機(jī)服務(wù)層用戶接口結(jié)構(gòu)層CloudSim層1)網(wǎng)絡(luò)層CloudSim中云實(shí)體的內(nèi)部網(wǎng)絡(luò)建立在網(wǎng)絡(luò)抽象概念之上。在這個(gè)模型下,不會(huì)為模擬的網(wǎng)絡(luò)實(shí)體提供真實(shí)可用的組件,比如路由器和交換機(jī),而是通過延時(shí)矩陣來實(shí)現(xiàn)。如圖所示為5個(gè)CloudSim實(shí)體的延時(shí)矩陣,矩陣的元素eij代表一條消息通過網(wǎng)絡(luò)從實(shí)體i傳輸?shù)絡(luò)產(chǎn)生的延時(shí)。CloudSim層1)網(wǎng)絡(luò)層CloudSim的事件管理引擎利用實(shí)體交互的網(wǎng)絡(luò)延時(shí)信息來表示消息在實(shí)體間發(fā)送的延時(shí)。這意味著當(dāng)仿真時(shí)間達(dá)到t+d時(shí),事件管理引擎就會(huì)從實(shí)體i轉(zhuǎn)發(fā)到實(shí)體j。其中t表示消息最初被發(fā)送時(shí)的仿真時(shí)間,d表示實(shí)體i到j(luò)的網(wǎng)絡(luò)延時(shí)。交互的消息傳遞圖如圖所示。CloudSim層2)云資源層與云相關(guān)的核心硬件基礎(chǔ)設(shè)施均由該層數(shù)據(jù)中心組件來模擬。數(shù)據(jù)中心實(shí)體由一系列主機(jī)組成,主機(jī)負(fù)責(zé)管理虛擬機(jī)在其生命周期內(nèi)的一系列操作。每個(gè)主機(jī)都代表云中的一個(gè)物理計(jì)算節(jié)點(diǎn),它會(huì)被預(yù)先配置一些參數(shù),如處理器能力(用MIPS表示)、內(nèi)存、存儲(chǔ)器及為虛擬機(jī)分配處理核的策略等,而且主機(jī)組件實(shí)現(xiàn)的接口支持單核和多核節(jié)點(diǎn)的建模與仿真。為了整合多朵云,需要對(duì)云協(xié)調(diào)器(CloudCoordinator)實(shí)體進(jìn)行建模。該實(shí)體不僅負(fù)責(zé)和其他數(shù)據(jù)中心及終端用戶的通信,還負(fù)責(zé)監(jiān)控和管理數(shù)據(jù)中心實(shí)體的內(nèi)部狀態(tài)。在監(jiān)控過程中收到的信息將會(huì)活躍于整個(gè)仿真過程中,并被作為云交互時(shí)進(jìn)行調(diào)度決策的依據(jù)。注意,沒有一個(gè)云提供類似于云協(xié)調(diào)器的功能,如果一個(gè)非仿真云系統(tǒng)的開發(fā)人員想要整合多朵云上的服務(wù),必須開發(fā)一個(gè)自己的云協(xié)調(diào)組件。通過該組件管理和整合云數(shù)據(jù)中心,實(shí)現(xiàn)與外部實(shí)體的通信,協(xié)調(diào)獨(dú)立于數(shù)據(jù)中心的核心對(duì)象。在模擬一次云整合時(shí),有兩個(gè)基本方面需要解決:通信和監(jiān)控。通信由數(shù)據(jù)中心通過標(biāo)準(zhǔn)的基于事件的消息處理來解決,數(shù)據(jù)中心監(jiān)控則由云協(xié)調(diào)器解決。CloudSim的每一個(gè)數(shù)據(jù)中心為了讓自己成為聯(lián)合云的一部分都需要實(shí)例化云協(xié)調(diào)器,云協(xié)調(diào)基于數(shù)據(jù)中心的狀態(tài),對(duì)交互云的負(fù)載進(jìn)行調(diào)整,其中影響調(diào)整過程的事件集合通過傳感器(Sensor)實(shí)體實(shí)現(xiàn)。為了啟用數(shù)據(jù)中心主機(jī)的在線監(jiān)控,會(huì)將跟蹤主機(jī)狀態(tài)的傳感器和云協(xié)調(diào)器關(guān)聯(lián)起來。在監(jiān)控的每個(gè)步驟,云協(xié)調(diào)器都會(huì)查詢傳感器。如果云協(xié)調(diào)器的負(fù)載達(dá)到了預(yù)先配置的閾值,那么它就會(huì)和聯(lián)合云中的其他協(xié)調(diào)器通信,嘗試減輕其負(fù)載。CloudSim層3)云服務(wù)層虛擬機(jī)分配:這是主機(jī)創(chuàng)建虛擬機(jī)實(shí)例的一個(gè)過程,由虛擬機(jī)分配控制器(VmAllocationPolicy)完成,默認(rèn)的調(diào)度策略是先來先服務(wù)。給虛擬機(jī)分配處理內(nèi)核:由主機(jī)完成,需考慮給每個(gè)虛擬機(jī)分配多少處理核及給定虛擬機(jī)對(duì)于處理核的利用率有多高,可采用的分配策略包括:空間共享策略、時(shí)間共享策略以及按需給虛擬機(jī)分配內(nèi)核。考慮下面這種情況,一個(gè)云主機(jī)只有一個(gè)處理核,而在這個(gè)主機(jī)上同時(shí)產(chǎn)生了兩個(gè)實(shí)例化虛擬機(jī)的需求。盡管虛擬機(jī)上下文(通常指主存和輔存空間)實(shí)際上是相互隔離的,但是它們?nèi)匀粫?huì)共享處理器核和系統(tǒng)總線。因此,每個(gè)虛擬機(jī)的可能硬件資源被主機(jī)的最大處理能力及可能系統(tǒng)帶寬限制。在虛擬機(jī)的調(diào)度過程中,要防止已創(chuàng)建的虛擬機(jī)對(duì)處理能力的需求超過主機(jī)的能力。為了在不同環(huán)境下模擬不同的調(diào)度策略,CloudSim支持兩種層次的虛擬機(jī)調(diào)度:主機(jī)層和虛擬機(jī)層。在主機(jī)層指定每個(gè)處理核可以分配給虛擬機(jī)的處理能力;在虛擬機(jī)層,虛擬機(jī)為在其內(nèi)運(yùn)行的單個(gè)應(yīng)用服務(wù)(任務(wù)單元)分配一個(gè)固定的可用處理器能力。CloudSim層3)云服務(wù)層在上述的每一層,CloudSim都實(shí)現(xiàn)了基于時(shí)間共享和空間共享的調(diào)度策略。為了清楚地解釋這些策略之間的區(qū)別及它們對(duì)應(yīng)用服務(wù)性能的影響,可參見下圖所示的一個(gè)簡單的虛擬機(jī)調(diào)度場景。一臺(tái)擁有兩個(gè)CPU內(nèi)核的主機(jī)將要運(yùn)行兩個(gè)虛擬機(jī),每個(gè)虛擬機(jī)需要兩個(gè)內(nèi)核并要運(yùn)行4個(gè)任務(wù)單元。更具體來說,VM1上將運(yùn)行任務(wù)t1、t2、t3、t4,而VM2將運(yùn)行任務(wù)任務(wù)t5、t6、t7、t8。圖(a)中虛擬機(jī)和任務(wù)單元均采用空間共享策略。由于采用空間共享模式,且虛擬機(jī)需要兩個(gè)內(nèi)核,所以在特定時(shí)間段內(nèi)只能運(yùn)行一個(gè)虛擬機(jī)。因此,VM2只能在VM1執(zhí)行完任務(wù)單元才會(huì)被分配內(nèi)核。VM1中的任務(wù)調(diào)度也是一樣的,由于每個(gè)任務(wù)單元只需要一個(gè)內(nèi)核,所以t1和t2可以同時(shí)執(zhí)行,t3、t4則在執(zhí)行隊(duì)列中等待t1、t2完成后再執(zhí)行。圖(b)虛擬機(jī)采用空間共享策略,任務(wù)單元采用時(shí)間共享策略。因此,在虛擬機(jī)的生命周期內(nèi),所有分配給虛擬機(jī)的任務(wù)單元在其生命周期內(nèi)動(dòng)態(tài)地切換上下文環(huán)境。圖(c)虛擬機(jī)采用時(shí)間共享策略,任務(wù)單元采用空間共享策略。這種情況下,每個(gè)虛擬機(jī)都會(huì)收到內(nèi)核分配的時(shí)間片,然后這些時(shí)間片以空間共享的方式分配給任務(wù)單元。由于任務(wù)單元基于空間共享策略這就意味著對(duì)于一臺(tái)虛擬機(jī),在任何一個(gè)時(shí)間段內(nèi),內(nèi)核只會(huì)執(zhí)行一個(gè)任務(wù)。圖(d)虛擬機(jī)和任務(wù)單元采用時(shí)間共享策略。所有虛擬機(jī)共享處理器能力,且每個(gè)虛擬機(jī)同時(shí)將共享的能力分給其任務(wù)單元。這種情況下,任務(wù)單元不存在排隊(duì)延時(shí)。CloudSim層4)虛擬機(jī)服務(wù)層在這一層提供了對(duì)虛擬機(jī)生命周期的管理,如將虛擬機(jī)分配給主機(jī)、虛擬機(jī)創(chuàng)建、虛擬機(jī)銷毀以及虛擬機(jī)和遷移等,以及對(duì)任務(wù)單元的操作。5)用戶接口結(jié)構(gòu)層該層提供了任務(wù)單元和虛擬機(jī)實(shí)體的創(chuàng)建接口。用戶代碼層CloudSim的最高層是用戶代碼層,該層提供了一些基本的實(shí)體,通過擴(kuò)展基本實(shí)體,云應(yīng)用開發(fā)人員能夠進(jìn)行如下活動(dòng):生成工作負(fù)載分配請求和應(yīng)用配置請求。模擬云可用性場景,并基于自定義的配置進(jìn)行穩(wěn)健性測試。為云及聯(lián)合云實(shí)現(xiàn)了自定義的應(yīng)用調(diào)度技術(shù)。CloudSim3.0API介紹CloudSim3.0的API如下圖所示,可以分為以下幾個(gè)包,關(guān)于CloudSimAPI的詳細(xì)信息可以訪問http://www//cloudsim/doc/api/index.html獲取。CloudSim3.0API介紹CloudSim云模擬器的類設(shè)計(jì)圖如下圖所示。CloudSim3.0API介紹下面將對(duì)CloudSim的基礎(chǔ)類進(jìn)行介紹。1)BwProvisioner這個(gè)抽象類用于模擬虛擬機(jī)的帶寬分配策略。云系統(tǒng)開發(fā)和研究人員可以通過擴(kuò)展這個(gè)類反映其應(yīng)用的需求的變化,實(shí)現(xiàn)自己的策略(基于優(yōu)先級(jí)或服務(wù)質(zhì)量)。BwProvisionerSimple允許虛擬機(jī)保留盡可能多的帶寬,并受主機(jī)總可用帶寬的限制。2)CloudCoordinator這個(gè)抽象類整合了云數(shù)據(jù)中心,負(fù)責(zé)周期性地監(jiān)控?cái)?shù)據(jù)中心資源的內(nèi)部狀態(tài)和執(zhí)行動(dòng)態(tài)負(fù)載均衡的決策。3)Cloudlet模擬云應(yīng)用服務(wù),每個(gè)應(yīng)用服務(wù)都會(huì)擁有一個(gè)預(yù)分配的指令長度和其生命周期內(nèi)所需的數(shù)據(jù)傳輸開銷。4)CloudScheduler擴(kuò)展實(shí)現(xiàn)了多種策略,包括空間共享和時(shí)間共享策略,用于決定虛擬機(jī)內(nèi)的應(yīng)用服務(wù)如何共享處理器能力。CloudSim3.0API介紹5)Datacenter模擬云提供商提供的核心基礎(chǔ)設(shè)施及服務(wù)。6)DatacenterBroker模擬一個(gè)代理,負(fù)責(zé)根據(jù)服務(wù)質(zhì)量需求協(xié)調(diào)SaaS提供商和云提供商。如右圖所示,為Datacenter、CIS和DatacenterBroker之間信息交互的過程。在仿真初期,每個(gè)數(shù)據(jù)中心實(shí)體都會(huì)通過CIS進(jìn)行注冊,當(dāng)用戶請求到達(dá)時(shí),CIS就會(huì)根據(jù)用戶的應(yīng)用請求,從列表中選擇合適的云服務(wù)提供商。圖中對(duì)交互的描述依賴于實(shí)際的情況,比如從DatacenterBroker到Datacenter的消息可能只是對(duì)下一個(gè)執(zhí)行動(dòng)作的一次確認(rèn)。CloudSim3.0API介紹7)DatacenterCharacteristics包含數(shù)據(jù)中心資源的配置信息。8)Host模擬物理資源,比如計(jì)算機(jī)、存儲(chǔ)服務(wù)器等,并封存了一些重要的信息。9)NetworkTopology模擬網(wǎng)絡(luò)延時(shí)的信息,保存由BRITE拓?fù)渖善魃傻木W(wǎng)絡(luò)拓?fù)湫畔ⅰ?0)RamProvisioner這個(gè)抽象類代表虛擬機(jī)分配主存的策略。11)SanStorage模擬了云數(shù)據(jù)中心的存儲(chǔ)區(qū)域網(wǎng),主要用于存儲(chǔ)大量數(shù)據(jù)。CloudSim3.0API介紹12)Sensor模擬由主流云提供商提供的真實(shí)服務(wù),定義了兩個(gè)方法:為性能參數(shù)設(shè)置最小值和最大值以及周期性地更新測量值。其實(shí)現(xiàn)必須通過實(shí)例化一個(gè)能夠被云協(xié)調(diào)器使用地傳感器組件。13)Vm模擬了由主機(jī)組建托管和管理的虛擬機(jī)。14)VmAllocationPolicy這個(gè)抽象類代表虛擬機(jī)監(jiān)控器使用的調(diào)度策略,用于將虛擬機(jī)分配給主機(jī)。15)VmScheduler這個(gè)抽象類由一個(gè)主機(jī)組件實(shí)現(xiàn),模擬為虛擬機(jī)分配處理核所用的策略,可以重寫。提綱5.1CloudSim體系結(jié)構(gòu)和API介紹5.2CloudSim環(huán)境搭建和使用方法5.3CloudSim擴(kuò)展編程5.4CloudSim的編程實(shí)踐5.5OpenStack編程實(shí)踐環(huán)境配置1)JDK安裝和配置從/technetwork/java/javase/downloads/index.html下載JDK最新版本并安裝,CloudSim需要運(yùn)行在JDK1.6以上版本。以JDK1.8.0_333為例,默認(rèn)的安裝目錄為C:\ProgramFiles\Java\jdk1.8.0_333。設(shè)置環(huán)境變量如下:新建系統(tǒng)變量JAVA_HOME,將變量值設(shè)為JDK安裝目錄,即C:\ProgramFiles\Java\jdk1.8.0_333;在Path中加入路徑%JAVA_HOME%\bin;在ClassPath中加入路徑%JAVA_HOME%\lib\dt.jar、%JAVA_HOME%\lib\tools.jar。2)解壓CloudSim從/cloudsim/下載CloudSim,本書以CloudSim5.0為例。將其解壓縮到磁盤,例如C:\cloudsim-5.0。運(yùn)行樣例程序C:\cloudsim-5.0\modules\cloudsim-example\src\main\java\org\cloudbus\cloudsim\examples目錄提供了一些CloudSim樣例程序,包括8個(gè)基礎(chǔ)樣例程序和多個(gè)網(wǎng)絡(luò)仿真和能耗仿真例子。基礎(chǔ)樣例模擬的環(huán)境如下:1)CloudSimExample1.java:創(chuàng)建一個(gè)一臺(tái)主機(jī)、一個(gè)任務(wù)的數(shù)據(jù)中心。2)CloudSimExample2.java:創(chuàng)建一個(gè)一臺(tái)主機(jī)、兩個(gè)任務(wù)的數(shù)據(jù)中心。兩個(gè)任務(wù)具有一樣的處理能力和執(zhí)行時(shí)間。3)CloudSimExample3.java:創(chuàng)建一個(gè)一臺(tái)主機(jī)、兩個(gè)任務(wù)的數(shù)據(jù)中心。兩個(gè)任務(wù)隊(duì)處理能力的需求不同,同時(shí)根據(jù)申請?zhí)摂M機(jī)的性能不太,所需的執(zhí)行時(shí)間也不同。4)CloudSimExample4.java:創(chuàng)建兩個(gè)數(shù)據(jù)中心,每個(gè)數(shù)據(jù)中心一臺(tái)主機(jī),并在其上運(yùn)行兩個(gè)云任務(wù)。5)CloudSimExample5.java:創(chuàng)建兩個(gè)數(shù)據(jù)中心,每個(gè)數(shù)據(jù)中心一臺(tái)主機(jī),并在其上運(yùn)行兩個(gè)用戶的云任務(wù)。6)CloudSimExample6.java:創(chuàng)建可擴(kuò)展的仿真環(huán)境。7)CloudSimExample7.java:演示如何停止仿真。8)CloudSimExample8.java:演示如何在運(yùn)行時(shí)添加實(shí)體。網(wǎng)絡(luò)仿真的例子通過讀取文件構(gòu)建網(wǎng)絡(luò)拓?fù)?,網(wǎng)絡(luò)拓?fù)浒ü?jié)點(diǎn)距離、邊時(shí)延等信息。能耗仿真的例子通過讀取負(fù)載文件中的CPU利用率數(shù)據(jù)作為云任務(wù)的利用率,實(shí)現(xiàn)云任務(wù)負(fù)載的動(dòng)態(tài)變化。例子通過動(dòng)態(tài)遷移負(fù)載過高的主機(jī)中的虛擬機(jī)到負(fù)載低的主機(jī),實(shí)現(xiàn)了負(fù)載動(dòng)態(tài)適應(yīng)的算法,并且應(yīng)用能耗-CPU利用率模型計(jì)算數(shù)據(jù)中心消耗的能耗。運(yùn)行步驟需要安裝JDK及IDEA集成開發(fā)環(huán)境。Java版本要達(dá)到1.6或更高,CloudSim和舊版本的Java不兼容,如果安裝非Sun公司的Java版本,比如GCJ或J++,也可能不兼容。本書使用JDK1.8.0_333和IDEA2020.2.3。為了方便查看和修改代碼,通常選擇在IDEA中執(zhí)行,操作步驟如下。1)啟動(dòng)IDEA主程序,在IDEA主界面上選擇OpenorImport命令(如圖所示),導(dǎo)入一個(gè)項(xiàng)目。運(yùn)行步驟2)根據(jù)CloudSim5.0解壓到磁盤的路徑,選擇cloudsim-5.0目錄,注意要選擇第一個(gè)帶黑點(diǎn)的文件夾,然后單擊OK按鈕,如下圖所示。3)需要等待幾分鐘,直至所有文件導(dǎo)入完畢,如下圖所示。運(yùn)行步驟4)可以選擇org.cloudbus.cloudsim.examples下的例子運(yùn)行,這里運(yùn)行CloudSimExample1。如左圖所示,運(yùn)行結(jié)果如右圖所示。提綱5.1CloudSim體系結(jié)構(gòu)和API介紹5.2CloudSim環(huán)境搭建和使用方法5.3CloudSim擴(kuò)展編程5.4CloudSim的編程實(shí)踐5.5OpenStack編程實(shí)踐CloudSim擴(kuò)展編程CloudSim是開源的,可以運(yùn)行在Windows和Linux操作系統(tǒng)上,為用戶提供了一系列可擴(kuò)展的實(shí)體和方法,通過擴(kuò)展這些接口實(shí)現(xiàn)用戶自己的調(diào)度或分配策略,進(jìn)行相關(guān)的性能測試。本書僅以任務(wù)調(diào)度策略為例。如DatacenterBroker類中提供的方法bindCloudletToVM(intcloudletId,intvmId),實(shí)現(xiàn)了將一個(gè)任務(wù)綁定到指定的虛擬機(jī)上運(yùn)行。用戶可以對(duì)該類進(jìn)行擴(kuò)展,實(shí)現(xiàn)自定義調(diào)度策略,下面將介紹兩種調(diào)度策略:順序分配策略貪心策略順序分配策略新寫一個(gè)方法bindCloudletsToVmsSimple(),用于把一組任務(wù)順序分配給一組虛擬機(jī),當(dāng)所有的虛擬機(jī)都運(yùn)行有任務(wù)后,再從第一個(gè)虛擬機(jī)開始從頭分配任務(wù)。publicvoidbindCloudletsToVmsSimple(){intvmNum=vmList.size();intcloudletNum=cloudletList.size();intidx=0;for(inti=0;i<cloudletNum;i++){ //將任務(wù)綁定到指定id的虛擬機(jī) cloudletList.get(i).setVmId(vmList.get(idx).getId()); idx=(idx+1)%vmNum; //循環(huán)遍歷虛擬機(jī)}}貪心策略實(shí)際上,任務(wù)之間和虛擬機(jī)之間的配置(參數(shù))都不可能完全一樣。順序分配策略實(shí)現(xiàn)簡單,但是忽略了它們之間的差異因素,如任務(wù)的指令長度(MI)和虛擬機(jī)的執(zhí)行速度(MIPS)等。這里為DatacenterBroker類再寫一個(gè)新方法bindCloudletsToVmsTimeAwared(),該方法采用貪心策略,希望讓所有任務(wù)的完成時(shí)間接近最短,并只考慮MI和MIPS兩個(gè)參數(shù)的區(qū)別。通過分析CloudSim自帶的樣例程序,一個(gè)任務(wù)所需的執(zhí)行時(shí)間等于任務(wù)的指令長度除以運(yùn)行該任務(wù)的虛擬機(jī)的執(zhí)行速度。讀者也可以擴(kuò)展相應(yīng)的類,實(shí)現(xiàn)帶寬、數(shù)據(jù)傳輸?shù)葘?duì)任務(wù)執(zhí)行時(shí)間的影響。為了便于理解,不改變CloudSim當(dāng)前的計(jì)算方式,即任務(wù)的執(zhí)行時(shí)間只與MI和MIPS有關(guān),在這個(gè)前提下,可以得出以下結(jié)論。(1)如果一個(gè)虛擬機(jī)上同時(shí)運(yùn)行多個(gè)任務(wù),不論使用空間共享還是時(shí)間共享,這些任務(wù)的總完成時(shí)間是一定的,因?yàn)槿蝿?wù)的總指令長度和虛擬機(jī)的執(zhí)行速度是一定的。(2)如果一個(gè)任務(wù)在某個(gè)虛擬機(jī)上的執(zhí)行時(shí)間最短,那么它在其他虛擬機(jī)上的執(zhí)行時(shí)間也是最短的。(3)如果一個(gè)虛擬機(jī)的執(zhí)行速度最快,那么它不論執(zhí)行哪個(gè)任務(wù)都比其他的虛擬機(jī)要快。定義一個(gè)矩陣time[i][j],表示任務(wù)i在虛擬機(jī)j所需的執(zhí)行時(shí)間,顯然time[i][j]=MI[i]/MIPS[j]。在初始化矩陣time前,首先將任務(wù)按MI的大小降序排序,將虛擬機(jī)按MIPS的大小升序排列,注意重新排序后矩陣time的行號(hào)和任務(wù)id不再一一對(duì)應(yīng),列號(hào)和虛擬機(jī)id的對(duì)應(yīng)關(guān)系,也相應(yīng)改變。初始化后,矩陣time的每一行、每一列的元素值都是降序排列的,然后再對(duì)time做貪心。選用的貪心策略是:從矩陣中行號(hào)為0的任務(wù)開始,每次都嘗試分配給最后一列對(duì)應(yīng)的虛擬機(jī),如果該選擇相對(duì)于其他選擇是最優(yōu)的,就完成分配,否則將任務(wù)分配給運(yùn)行任務(wù)最少的虛擬機(jī),實(shí)現(xiàn)一種簡單的負(fù)載均衡。這種方式反映了越復(fù)雜的任務(wù)需要更快的虛擬機(jī)來處理,以解決復(fù)雜任務(wù)造成的瓶頸,降低所有任務(wù)的總執(zhí)行時(shí)間。bindCloudletsToVmsTimeAwared(),該方法采用貪心策略,希望讓所有任務(wù)的完成時(shí)間接近最短,并只考慮MI和MIPS兩個(gè)參數(shù)的區(qū)別。貪心策略publicvoidbindCloudletsToVmsTimeAwared(){intcloudletNum=cloudletList.size();intvmNum=vmList.size();double[][]time=newdouble[cloudletNum][vmNum];//重新排列任務(wù)和虛擬機(jī),需要導(dǎo)入包java.util.CollectionsCollections.sort(cloudletList,newCloudletComparator());

Collections.sort(vmList,newVmComparator());

//初始化矩陣time

for(inti=0;i<cloudletNum;i++){for(intj=0;j<vmNum;j++){time[i][j]=

(double)cloudletList.get(i).getCloudletLength()/vmList.get(j).getMips();}}double[]vmLoad=newdouble[vmNum]; //某個(gè)虛擬機(jī)上任務(wù)的總執(zhí)行時(shí)間int[]vmTasks=newint[vmNum]; //某個(gè)虛擬機(jī)上運(yùn)行的任務(wù)數(shù)doubleminLoad=0; //記錄當(dāng)前任務(wù)分配方式的最優(yōu)值intidx=0; //記錄當(dāng)前任務(wù)最優(yōu)分配方式對(duì)應(yīng)的虛擬機(jī)列號(hào)//將行號(hào)為0的任務(wù)直接分配給列號(hào)最大的虛擬機(jī)vmLoad[vmNum-1]=time[0][vmNum-1];vmTasks[vmNum-1]=1;cloudletList.get(0).setVmId(vmList.get(vmNum-1).getId());for(inti=1;i<cloudletNum;i++){minLoad=vmLoad[vmNum-1]+time[i][vmNum-1];idx=vmNum-1;for(intj=vmNum-2;j>=0;j--){//如果當(dāng)前虛擬機(jī)還未分配任務(wù),且其執(zhí)行當(dāng)前任務(wù)的時(shí)間小于等于最小時(shí)間貪心策略//分配給該虛擬機(jī)是否最優(yōu),即可以退出循環(huán)if(vmLoad[j]==0){

if(minLoad>=time[i][j]){idx=j;break;}}//如果當(dāng)前虛擬機(jī)分配了任務(wù),且其執(zhí)行當(dāng)前任務(wù)后的時(shí)間小于最小時(shí)間if(minLoad>vmLoad[j]+time[i][j]){

minLoad=vmLoad[j]+time[i][j];

idx=j;}elseif(minLoad==vmLoad[j]+time[i][j]&&vmTasks[j]<vmTasks[idx])(

idx=j;}//如果當(dāng)前虛擬機(jī)分配了任務(wù),且其執(zhí)行當(dāng)前任務(wù)后的時(shí)間等于最小時(shí)間,且其分配的任務(wù)數(shù)小于最優(yōu)分配方式對(duì)應(yīng)的虛擬機(jī)}vmLoad[idx]+=time[i][idx];vmTasks[idx]++;cloudletList.get(i).setVmId(vmList.get(idx).getId());}}//根據(jù)指令長度降序排列任務(wù),需要導(dǎo)入包java.util.ComparatorprivateclassCloudletComparatorimplementsComparator<Cloudlet>{ publicintcompare(Cloudletcl1,Cloudletcl2){ return(int)(c12.getCloudletLength()-cl1.getCloudletLength());}}//根據(jù)執(zhí)行速度升序排列虛擬機(jī)privateclassVmComparatorimplementsComparator<Vm>{ @Override publicintcompare(Vmvm1,Vmvm2){ return(int)(vm1.getMips()-vm2.getMips()); }}仿真步驟仿真步驟如下所示:

(1)初始化CloudSim包(2)創(chuàng)建數(shù)據(jù)中心 a)創(chuàng)建主機(jī)列表。 b)創(chuàng)建PE列表。 c)創(chuàng)建PE并將其添加到上一步創(chuàng)建的PE列表中,可對(duì)其ID和MIPS進(jìn)行設(shè)置。 d)創(chuàng)建主機(jī),并將其添加到主機(jī)列表中,主機(jī)的配置參數(shù)有ID、內(nèi)存、帶寬、存儲(chǔ)、PE及

虛擬機(jī)分配策略(時(shí)間或空間共享)。 e)創(chuàng)建數(shù)據(jù)中心特征對(duì)象,用來存儲(chǔ)數(shù)據(jù)中心的屬性,包含體系結(jié)構(gòu)、操作系統(tǒng)、機(jī)器列表、分配策略(時(shí)間、空間共享)、時(shí)區(qū)以及各項(xiàng)費(fèi)用(內(nèi)存、外存、帶寬和處理器資源的費(fèi)用)。 f)最后,創(chuàng)建一個(gè)數(shù)據(jù)中心對(duì)象,它的主要參數(shù)有名稱、特征對(duì)象、虛擬機(jī)分配策略、用于數(shù)據(jù)仿真的存儲(chǔ)列表以及調(diào)度間隔。(3)創(chuàng)建數(shù)據(jù)中心代理數(shù)據(jù)中心代理負(fù)責(zé)在云計(jì)算中根據(jù)用戶的QoS要求協(xié)調(diào)用戶及服務(wù)供應(yīng)商和部署服務(wù)任務(wù)。(4)創(chuàng)建虛擬機(jī)對(duì)虛擬機(jī)的參數(shù)進(jìn)行設(shè)置,主要包括ID、用戶ID、MIPS、CPU數(shù)量、內(nèi)存、帶寬、外存、虛擬機(jī)監(jiān)控器、調(diào)度策略,并提交給任務(wù)代理。(5)創(chuàng)建云任務(wù)創(chuàng)建指定參數(shù)的云任務(wù),設(shè)定任務(wù)的用戶ID,并提交給任務(wù)代理。在這一步可以設(shè)置需要?jiǎng)?chuàng)建的云任務(wù)數(shù)量以及任務(wù)長度等信息。(6)在這一步調(diào)用自定義的任務(wù)調(diào)度策略,分配任務(wù)到虛擬機(jī)。(7)啟動(dòng)仿真。(8)在仿真結(jié)束后統(tǒng)計(jì)結(jié)果。詳細(xì)實(shí)現(xiàn)代碼下面是貪心策略的仿真核心代碼,在org.cloudbus.cloudsim.examples包中新建類ExtendedExample2,實(shí)現(xiàn)代碼如下(詳細(xì)請參考5.3.2節(jié)代碼):運(yùn)行結(jié)果分析由于虛擬機(jī)對(duì)任務(wù)分配使用了空間共享策略,所以運(yùn)行在同一個(gè)虛擬機(jī)上的任務(wù),必須按順序完成。左圖為基于貪心策略的仿真結(jié)果,圖中顯示任務(wù)7、8被分配到了虛擬機(jī)0上運(yùn)行,從任務(wù)開始執(zhí)行的時(shí)間來看,任務(wù)8確實(shí)是在任務(wù)7完成后執(zhí)行的。圖中還顯示了所有任務(wù)的最終分配結(jié)果及運(yùn)行情況,用戶可以據(jù)此驗(yàn)證自己的調(diào)度策略是否符合要求。右圖為基于順序分配策略的仿真結(jié)果,該方法的總執(zhí)行時(shí)間為467.6,而貪心策略只需283.16,節(jié)省了約39%的時(shí)間。平臺(tái)重編譯實(shí)現(xiàn)自定義的調(diào)度算法后,用戶就可以重新編譯并打包CloudSim,來測試或發(fā)布自己的新平臺(tái)。CloudSim平臺(tái)重編譯主要通過Ant工具完成。

從/下載Ant工具,本書使用的版本為1.8.2。將其解壓到目錄C:\apache-ant-1.8.2。設(shè)置環(huán)境變量,在Path中加入C:\apache-ant-1.7.1\bin。將命令行切換到擴(kuò)展的CloudSim路徑(build.xml所在目錄),在命令行下輸入命令C:\cloudsim-3.0.0>ant,批量編譯CloudSim源文件,生成的文件會(huì)按照bulid.xml的設(shè)置存儲(chǔ)到指定位置,編譯成功后自動(dòng)打包生成cloudsim-new.jar并存放在C:\cloudsim-3.0.0\jars。擴(kuò)展的CloudSim平臺(tái)生成后,在環(huán)境變量ClassPath中增加路徑:C:\CloudSim\jars\cloudsim-new.jar。然后根據(jù)前面介紹的步驟,即可在新的平臺(tái)下編寫自己的仿真驗(yàn)證程序。提綱5.1CloudSim體系結(jié)構(gòu)和API介紹5.2CloudSim環(huán)境搭建和使用方法5.3CloudSim擴(kuò)展編程5.4CloudSim的編程實(shí)踐5.5OpenStack編程實(shí)踐CloudSim的編程實(shí)踐本書中的CloudSim的編程實(shí)踐主要包括以下三個(gè):CloudSim任務(wù)調(diào)度編程:主要講解org.cloudbus.cloudsim.examples包中的CloudSimExample1,CloudSimExample4。CloudSim網(wǎng)絡(luò)編程:以work.NetworkExample1為例,該例子展示了如何創(chuàng)建一個(gè)有網(wǎng)絡(luò)拓?fù)涞臄?shù)據(jù)中心并且在其上運(yùn)行一個(gè)云任務(wù)。CloudSim能耗編程CloudSim的編程實(shí)踐下面講解org.cloudbus.cloudsim.examples包中的CloudSimExample1,CloudSimExample4。CloudSimExample1創(chuàng)建了一臺(tái)主機(jī)、一個(gè)任務(wù)的數(shù)據(jù)中心,展示了數(shù)據(jù)中心,代理,主機(jī),虛擬機(jī),云任務(wù)等的簡單使用以及云仿真基本流程。這是最簡單的、最基本的一個(gè)程序。通過這一例子可以了解到使用CloudSim仿真的基本步驟,基本類的使用方法。云仿真的基本步驟是:(1)初始化CloudSim包;(2)創(chuàng)建數(shù)據(jù)中心Datacenter,創(chuàng)建過程創(chuàng)建主機(jī)列表List<Host>hostList;(3)創(chuàng)建數(shù)據(jù)中心代理DatacenterBroker;(4)創(chuàng)建虛擬機(jī)Vm;(5)創(chuàng)建云任務(wù)Cloudlet;(6)啟動(dòng)仿真;(7)統(tǒng)計(jì)結(jié)果并輸出結(jié)果。任務(wù)調(diào)度編程CloudSimExample1publicclassCloudSimExample1{ privatestaticList<Cloudlet>cloudletList; //任務(wù)列表 privatestaticList<Vm>vmlist; //虛擬機(jī)列表 publicstaticvoidmain(String[]args){ Log.printLine("StartingCloudSimExample1..."); try{//第一步:初始化CloudSim包,必須在創(chuàng)建實(shí)體前調(diào)用

intnum_user=1; //用戶數(shù) Calendarcalendar=Calendar.getInstance();

booleantrace_flag=false; //表示是否跟蹤

CloudSim.init(num_user,calendar,trace_flag);

//第二步:創(chuàng)建數(shù)據(jù)中心 //數(shù)據(jù)中心是云資源的提供者,至少需要一個(gè)數(shù)據(jù)中心來模擬云實(shí)驗(yàn)。 Datacenterdatacenter0=createDatacenter("Datacenter_0");

//第三步:創(chuàng)建數(shù)據(jù)中心代理DatacenterBrokerbroker=createBroker();intbrokerId=broker.getId();//第四步:創(chuàng)建虛擬機(jī)列表vmlist=newArrayList<Vm>();//設(shè)置虛擬機(jī)參數(shù)intvmid=0; //虛擬機(jī)idintmips=1000; //主頻(MB)longsize=10000; //硬盤(MB)intram=512; //虛擬機(jī)內(nèi)存(MB)任務(wù)調(diào)度編程CloudSimExample1 longbw=1000; //帶寬(MB) intpesNumber=1; //CPU核數(shù) Stringvmm="Xen"; //VMM名 //創(chuàng)建虛擬機(jī)

Vmvm=newVm(vmid,brokerId,mips,pesNumber,ram,bw,size,vmm,newCloudletSchedulerTimeShared()); //云任務(wù)調(diào)度使用時(shí)間共享策略 //添加到虛擬機(jī)列表 vmlist.add(vm); //提交虛擬機(jī)列表到代理 broker.submitVmList(vmlist); //第五步:創(chuàng)建云任務(wù) cloudletList=newArrayList<Cloudlet>(); //任務(wù)參數(shù) intid=0; //任務(wù)id longlength=400000; //任務(wù)計(jì)算量 longfileSize=300; //文件大小,影響傳輸?shù)膸捇ㄤN longoutputSize=300; //輸出文件大小,影響傳輸?shù)膸捇ㄤN UtilizationModelutilizationModel=newUtilizationModelFull();Cloudletcloudlet=newCloudlet(id,length,pesNumber,fileSize,outputSize,utilizationModel,utilizationModel,utilizationModel);cloudlet.setUserId(brokerId); //設(shè)置任務(wù)用戶Idcloudlet.setVmId(vmid); //設(shè)置虛擬機(jī)Id//添加任務(wù)到任務(wù)列表cloudletList.add(cloudlet);任務(wù)調(diào)度編程CloudSimExample1 //提交任務(wù)列表 broker.submitCloudletList(cloudletList); //第六步:啟動(dòng)仿真 CloudSim.startSimulation();

CloudSim.stopSimulation();//第七步:統(tǒng)計(jì)結(jié)果并輸出結(jié)果List<Cloudlet>newList=broker.getCloudletReceivedList();printCloudletList(newList);Log.printLine("CloudSimExample1finished!");

}catch(Exceptione){e.printStackTrace();Log.printLine("Unwantederrorshappen");} } privatestaticDatacentercreateDatacenter(Stringname){//創(chuàng)建一個(gè)數(shù)據(jù)中心 //1.創(chuàng)建主機(jī)列表 List<Host>hostList=newArrayList<Host>();

//2.創(chuàng)建主機(jī)包含的PE或者CPU處理器列表//這個(gè)例子中,主機(jī)CPU只有一個(gè)核芯List<Pe>peList=newArrayList<Pe>(); //Pe是CPU單元intmips=1000; //Pe速率//3.創(chuàng)建核芯并添加到核芯列表peList.add(newPe(0,newPeProvisionerSimple(mips)));任務(wù)調(diào)度編程CloudSimExample1 //4.創(chuàng)建主機(jī)并添加到主機(jī)列表 inthostId=0;intram=2048; //內(nèi)存(MB) longstorage=1000000; //硬盤存儲(chǔ)intbw=10000; //帶寬hostList.add(newHost(hostId,newRamProvisionerSimple(ram),newBwProvisionerSimple(bw),storage,peList,newVmSchedulerTimeShared(peList) )//虛擬機(jī)使用時(shí)間共享策略);//5.創(chuàng)建存儲(chǔ)數(shù)據(jù)中心屬性的數(shù)據(jù)中心特征對(duì)象Stringarch="x86"; //系統(tǒng)架構(gòu)Stringos="Linux"; //操作系統(tǒng)Stringvmm="Xen"; //虛擬機(jī)監(jiān)視器doubletime_zone=10.0; //時(shí)區(qū)doublecost=3.0; //單位時(shí)間成本doublecostPerMem=0.05; //單位內(nèi)存成本doublecostPerStorage=0.001;

//單位存儲(chǔ)成本doublecostPerBw=0.0; //單位帶寬成本 LinkedList<Storage>storageList=newLinkedList<Storage>();//存儲(chǔ)列表DatacenterCharacteristicscharacteristics=new

DatacenterCharacteristics(arch,os,vmm,hostList,time_zone,cost,

costPerMem,costPerStorage,costPerBw);//6.創(chuàng)建數(shù)據(jù)中心對(duì)象Datacenterdatacenter=null;

任務(wù)調(diào)度編程CloudSimExample1

try{

datacenter=newDatacenter(name,characteristics,new VmAllocationPolicySimple(hostList),storageList,0);

}catch(Exceptione){

e.printStackTrace();

}returndatacenter;} privatestaticDatacenterBrokercreateBroker(){//創(chuàng)建數(shù)據(jù)中心代理

DatacenterBrokerbroker=null;

try{

broker=newDatacenterBroker("Broker");}catch(Exceptione){

e.printStackTrace();

returnnull; } returnbroker;

} privatestaticvoidprintCloudletList(List<Cloudlet>list){//打印云任務(wù)的運(yùn)行結(jié)果

intsize=list.size();Cloudletcloudlet;Stringindent="";Log.printLine();

任務(wù)調(diào)度編程CloudSimExample1

Log.printLine("==========OUTPUT==========")

Log.printLine("CloudletID"+indent+"STATUS"+indent +"DatacenterID"+indent+"VMID"+indent+"Time"+indent +"StartTime"+indent+"FinishTime");

DecimalFormatdft=newDecimalFormat("###.##"); for(inti=0;i<size;i++){ cloudlet=list.get(i); Log.print(indent+cloudlet.getCloudletId()+indent+indent); if(cloudlet.getCloudletStatus()==Cloudlet.SUCCESS){ Log.print("SUCCESS"); Log.printLine(indent+indent+cloudlet.getResourceId()+indent+indent+indent+cloudlet.getVmId()+indent+indent+dft.format(cloudlet.getActualCPUTime())+indent+indent+dft.format(cloudlet.getExecStartTime())+indent+indent+dft.format(cloudlet.getFinishTime())); } } }}

任務(wù)調(diào)度編程CloudSimExample1運(yùn)行結(jié)果如下:任務(wù)調(diào)度編程CloudSimExample4CloudSimExample4展示了如何創(chuàng)建兩個(gè)數(shù)據(jù)中心,每個(gè)數(shù)據(jù)中心有一臺(tái)主機(jī),并在其上運(yùn)行兩個(gè)云任務(wù)。代理會(huì)自動(dòng)為虛擬機(jī)選擇在哪個(gè)數(shù)據(jù)中心的哪個(gè)主機(jī)上創(chuàng)建的工作。CloudSimExample4.java關(guān)鍵代碼(其他部分以省略號(hào)省略,詳細(xì)請參考書5.4.1節(jié)代碼):publicstaticvoidmain(String[]args){ Log.printLine("StartingCloudSimExample4..."); try{ …… //第二步::創(chuàng)建數(shù)據(jù)中心 //創(chuàng)建兩個(gè)數(shù)據(jù)中心 Datacenterdatacenter0=createDatacenter("Datacenter_0"); Datacenterdatacenter1=createDatacenter("Datacenter_1"); …… //創(chuàng)建兩個(gè)虛擬機(jī) Vmvm1=newVm(vmid,brokerId,mips,pesNumber,ram,bw,size,vmm,newCloudletSchedulerTimeShared()); vmid++; Vmvm2=newVm(vmid,brokerId,mips,pesNumber,ram,bw,size,vmm,newCloudletSchedulerTimeShared()); //添加虛擬機(jī)到虛擬機(jī)列表 vmlist.add(vm1); vmlist.add(vm2);……//第五步:創(chuàng)建兩個(gè)任務(wù) …… Cloudletcloudlet1=newCloudlet(id,length,pesNumber,fileSize,outputSize,utilizationModel,utilizationModel,utilizationModel); cloudlet1.setUserId(brokerId);

任務(wù)調(diào)度編程CloudSimExample4 id++; Cloudletcloudlet2=newCloudlet(id,length,pesNumber,fileSize,outputSize,utilizationModel,utilizationModel,utilizationModel); cloudlet2.setUserId(brokerId); //添加任務(wù)到任務(wù)列表 cloudletList.add(cloudlet1); cloudletList.add(cloudlet2); broker.bindCloudletToVm(cloudlet1.getCloudletId(),vm1.getId()); broker.bindCloudletToVm(cloudlet2.getCloudletId(),vm2.getId()); …… //打印每個(gè)數(shù)據(jù)中心的成本 datacenter0.printDebts(); datacenter1.printDebts(); …… } catch(Exceptione){ …… } }任務(wù)調(diào)度編程CloudSimExample4運(yùn)行結(jié)果如下:值得注意的是,由于數(shù)據(jù)中心的主機(jī)都用了VmSchdeulerSpaceShared策略,見createDatacenter()函數(shù)的代碼,如下,而主機(jī)只有一個(gè)CPU核芯,故VM#1創(chuàng)建失敗。hostList.add(newHost(hostId,newRamProvisionerSimple(ram), newBwProvisionerSimple(bw),storage,peList, newVmSchedulerSpaceShared(peList) ) );網(wǎng)絡(luò)編程N(yùn)etworkExample1

以work.NetworkExample1為例,該例子展示了如何創(chuàng)建一個(gè)有網(wǎng)絡(luò)拓?fù)涞臄?shù)據(jù)中心并且在其上運(yùn)行一個(gè)云任務(wù)。例子通過讀取topology.brite文件來構(gòu)造網(wǎng)絡(luò)拓?fù)?。網(wǎng)絡(luò)拓?fù)涞男畔ü?jié)點(diǎn)的位置,節(jié)點(diǎn)間的有向邊,邊時(shí)延,邊帶寬等信息。能夠模擬基于網(wǎng)絡(luò)位置,時(shí)延,帶寬等的網(wǎng)絡(luò)環(huán)境,有效地計(jì)算網(wǎng)絡(luò)傳輸造成的花銷。與前面例子不同的是,網(wǎng)絡(luò)編程需要調(diào)用org.cloudbus.cloudsim.NetworkTopology構(gòu)造網(wǎng)絡(luò)拓?fù)鋱D,然后把CloudSim實(shí)體與拓?fù)鋱D的節(jié)點(diǎn)進(jìn)行映射。下圖為關(guān)鍵部分代碼(詳細(xì)請參考書5.4.2節(jié)代碼):網(wǎng)絡(luò)編程N(yùn)etworkExample1

程序會(huì)尋找標(biāo)記“Nodes:”和“Edges:”,Nodes是節(jié)點(diǎn)信息,其中第一列是節(jié)點(diǎn)序號(hào),第二列是節(jié)點(diǎn)的橫坐標(biāo),第三列是節(jié)點(diǎn)的縱坐標(biāo)。Edges是邊信息,第一列是邊序號(hào),第二列是始節(jié)點(diǎn)序號(hào),第三列是終節(jié)點(diǎn)序號(hào),第四列是邊長度,第五列是邊時(shí)延,第六列是邊帶寬。CloudSim中只用到了以上信息。如此,我們就能構(gòu)造自己需要的網(wǎng)絡(luò)拓?fù)淞恕?/p>

運(yùn)行結(jié)果如下(注意:如“7.800000190734863:Broker:TryingtoCreateVM#0inDatacenter_0”中的7.800000190734863是CloudSim中的仿真時(shí)間)。CloudSim能耗編程

能耗模擬的例子有很多,代碼實(shí)現(xiàn)都類似。這些例子通過讀取負(fù)載文件中的CPU利用率數(shù)據(jù)作為云任務(wù)的利用率,實(shí)現(xiàn)云任務(wù)負(fù)載的動(dòng)態(tài)變化。因此仿真過程中會(huì)出現(xiàn)主機(jī)的負(fù)載不平衡,程序通過動(dòng)態(tài)遷移負(fù)載過高的主機(jī)中的虛擬機(jī)到負(fù)載低的主機(jī),實(shí)現(xiàn)了負(fù)載動(dòng)態(tài)適應(yīng)的算法,并且應(yīng)用能耗-CPU利用率模型計(jì)算數(shù)據(jù)中心消耗的能量。事實(shí)上,本節(jié)介紹的程序不僅適用于能耗編程,其更大的意義在于展示了虛擬機(jī)調(diào)度算法,可以計(jì)算虛擬機(jī)的遷移時(shí)間、服務(wù)等級(jí)協(xié)議(ServiceLevelAgreement,SLA)的違背率、主機(jī)利用率等指標(biāo)。這樣我們就能進(jìn)行動(dòng)態(tài)的虛擬機(jī)調(diào)度、任務(wù)調(diào)度、能耗模擬。

這些例子的差別在于虛擬機(jī)分配策略VmAllocationPolicy和虛擬機(jī)選擇策略VmSelectionPolicy的不同。VmAllocationPolicy的作用是為虛擬機(jī)選擇要放置的主機(jī),而VmSelectionPolicy的作用是選擇由于主機(jī)負(fù)載過高而要遷移的虛擬機(jī)。下面以org.cloudbus.cloudsim.examples.power.planetlab.IqrMc為例進(jìn)行說明。IqrMc中使用了PowerVmAllocationPolicyMigrationInterQuartileRange的虛擬機(jī)分配策略和PowerVmSelectionPolicyMaximumCorrelation的虛擬機(jī)選擇策略。InterQuartileRange是指四分位數(shù)間距,MaximumCorrelation是指最大相關(guān)系數(shù)。IqrMc.java的代碼十分簡單,但實(shí)際上這個(gè)例子比前面的例子復(fù)雜得多,因?yàn)榫唧w實(shí)現(xiàn)的代碼在其他類中。CloudSim能耗編程publicstaticvoidmain(String[]args)throwsIOException{ booleanenableOutput=false; booleanoutputToFile=true; StringinputFolder=IqrMc.class.getClassLoader().getResource("workload/planetlab").getPath(); StringoutputFolder="output"; Stringworkload="20110303";//負(fù)載數(shù)據(jù) StringvmAllocationPolicy="iqr";//四分間距分配策略(InterQuartileRange) StringvmSelectionPolicy="mc";//最大相關(guān)系數(shù)選擇策略(MaximumCorrelation) Stringparameter="1.5";//Iqr策略中的安全參數(shù) newPlanetLabRunner( enableOutput, outputToFile, inputFolder, outputFolder, workload, vmAllocationPolicy, vmSelectionPolicy, parameter); }CloudSim能耗編程如果運(yùn)行不了,出現(xiàn)錯(cuò)誤如下:有可能是因?yàn)樨?fù)載文件workload/planetlab/20110303的絕對(duì)路徑中有空格,這樣它在讀取路徑時(shí)會(huì)把空格轉(zhuǎn)義為“%20”,因而讀取文件失敗。解決方法是:把“StringinputFolder=IqrMc.class.getClassLoader().getResource("workload/planetlab").getPath();”改為“StringinputFolder=IqrMc.class.getClassLoader().getResource("workload/planetlab").toURI().getPath();”,并且在throwsIOException后加上“,URISyntaxException”,即變成“throwsIOException,URISyntaxException”。CloudSim能耗編程PlanetLabRunner的源代碼中通過org.cloudbus.cloudsim.examples.power.Helper類和org.cloudbus.cloudsim.examples.power.planetlab.PlanetLabHelper類創(chuàng)建了代理、云任務(wù)、虛擬機(jī)列表、主機(jī)列表。而數(shù)據(jù)中心是在其父類RunnerAbstract中創(chuàng)建的。publicclassPlanetLabRunnerextendsRunnerAbstract{ publicPlanetLabRunner( booleanenableOutput, booleanoutputToFile, StringinputFolder, StringoutputFolder, Stringworkload, StringvmAllocationPolicy, StringvmSelectionPolicy, Stringparameter){super( enableOutput, outputToFile, inputFolder, outputFolder, workload, vmAllocationPolicy, vmSelectionPolicy, parameter); }

CloudSim能耗編程 @Override protectedvoidinit(StringinputFolder){ try{ CloudSim.init(1,Calendar.getInstance(),false); broker=Helper.createBroker(); //創(chuàng)建代理 intbrokerId=broker.getId(); cloudletList=PlanetLabHelper.createCloudletListPlanetLab(brokerId,inputFolder); //創(chuàng)建云任務(wù),其中云任務(wù)的利用率是讀取負(fù)載文件的vmList=Helper.createVmList(brokerId,cloudletList.size());//創(chuàng)建虛擬機(jī)列表 hostList=Helper.createHostList(PlanetLabConstants.NUMBER_OF_HOSTS);//創(chuàng)建能耗主機(jī)列表 }catch(Exceptione){ e.printStackTrace(); Log.printLine("Thesimulationhasbeenterminatedduetoanunexpectederror"); System.exit(0); } }}CloudSim能耗編程

org.cloudbus.cloudsim.examples.power.RunnerAbstract的start()方法創(chuàng)建數(shù)據(jù)中心。并且定義了仿真的啟動(dòng)與結(jié)束。RunnerAbstract在其構(gòu)造函數(shù)中會(huì)執(zhí)行init()(由子類PlanetLabRunner具體實(shí)現(xiàn))和start()方法。protectedvoidstart(StringexperimentName,StringoutputFolder,VmAllocationPolicyvmAllocationPolicy){ System.out.println("Starting"+experimentName); try{ PowerDatacenterdatacenter=(PowerDatacenter)Helper.createDatacenter( "Datacenter",PowerDatacenter.class,hostList,vmAllocationPolicy); datacenter.setDisableMigrations(false); broker.submitVmList(vmList); broker.submitCloudletList(cloudletList); CloudSim.terminateSimulation(Constants.SIMULATION_LIMIT); //設(shè)置仿真超時(shí)時(shí)間,超時(shí)則結(jié)束仿真 doublelastClock=CloudSim.startSimulation(); //仿真總時(shí)間 List<Cloudlet>newList=broker.getCloudletReceivedList(); Log.printLine("Received"+newList.size()+"cloudlets"); CloudSim.stopSimulation(); Helper.printResults(datacenter,vmList,lastClock,experimentName, Constants.OUTPUT_CSV,outputFolder); }catch(Exceptione){ e.printStackTrace(); Log.printLine("Thesimulationhasbeenterminatedduetoanunexpectederror"); System.exit(0); } Log.printLine("Finished"+experimentName); }CloudSim能耗編程創(chuàng)建云任務(wù)由org.cloudbus.cloudsim.examples.power.planetlab.PlanetLabHelper通過讀取CPU利用率數(shù)據(jù),構(gòu)建負(fù)載動(dòng)態(tài)變化的云任務(wù)。publicstaticList<Cloudlet>createCloudletListPlanetLab(intbrokerId,StringinputFolderName)throwsFileNotFoundException{ List<Cloudlet>list=newArrayList<Cloudlet>(); longfileSize=300; longoutputSize=300; UtilizationModelutilizationModelNull=newUtilizationModelNull(); FileinputFolder=newFile(inputFolderName); File[]files=inputFolder.listFiles(); //列出文件夾中的文件 for(inti=0;i<files.length;i++){ //1052個(gè)文件,1052個(gè)任務(wù) Cloudletcloudlet=null; try{

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論