嵌入式網(wǎng)絡(luò)虛擬化環(huán)境中VirtIO網(wǎng)絡(luò)虛擬化工作方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及嵌入式系統(tǒng),具體地,涉及嵌入式網(wǎng)絡(luò)虛擬化環(huán)境中Virt1前端驅(qū)動程序設(shè)計方法。
【背景技術(shù)】
[0002]嵌入式系統(tǒng)是執(zhí)行少數(shù)任務(wù)的專用系統(tǒng),與傳統(tǒng)x86平臺不同,嵌入式環(huán)境具有功耗低、計算能力較弱等特點,具有不同的性能模型。嵌入式系統(tǒng)需要頻繁的與物理世界進(jìn)行頻繁的交互,但由于嵌入式系統(tǒng)的資源限制,在嵌入式虛擬化環(huán)境下I/o虛擬化的性能成為了嵌入式虛擬化技術(shù)的重要技術(shù)指標(biāo)。在嵌入式虛擬化環(huán)境中,I/o虛擬化的性能需要保證硬件設(shè)備的整體性能在一定的擴(kuò)展范圍內(nèi)穩(wěn)定,能夠滿足各個虛擬機(jī)的資源需求。
[0003]在傳統(tǒng)的系統(tǒng)結(jié)構(gòu)中,I/O設(shè)備連接到PCI總線上,PCI設(shè)備通過PCI配置空間以及設(shè)備地址空間與操作系統(tǒng)進(jìn)行交互,通過中斷機(jī)制通知反饋操作系統(tǒng)。虛擬化環(huán)境中,軟件通過截獲Guest P1和MM1請求截獲,通過硬件虛擬化擴(kuò)展轉(zhuǎn)發(fā)給上層;模擬結(jié)束后再將結(jié)果通過中斷反饋到Guest中。
[0004]目前有三種主流的I/O設(shè)備虛擬化方案,用來實現(xiàn)I/O設(shè)備的虛擬化:一是完全虛擬化方式,I/o設(shè)備完全由虛擬機(jī)平臺進(jìn)行模擬,其驅(qū)動不需要修改。虛擬機(jī)平臺對虛擬機(jī)完全透明,虛擬機(jī)只需要調(diào)用原生系統(tǒng)中的設(shè)備驅(qū)動,直接操作下層的虛擬硬件,具體的指令陷入由VMM完成解釋和執(zhí)行。I/O完全虛擬化方式最大的弊端在于處理器特權(quán)級地切換,即從Guest OS到VMM、VMM到模擬用戶程序的I/O進(jìn)程之間切換,嚴(yán)重影響了虛擬化效率,需要消耗大量的CPU指令周期;二是半虛擬化方式,虛擬機(jī)系統(tǒng)中集成專用的虛擬機(jī)設(shè)備驅(qū)動,訪問I/O設(shè)備需采用虛擬機(jī)中提供的虛擬設(shè)備。由于其驅(qū)動為虛擬設(shè)備專用,所以客戶機(jī)系統(tǒng)需要進(jìn)行修改。當(dāng)應(yīng)用程序提出訪問請求時,前后端驅(qū)動共同配合完成訪問。半虛擬化方式的I/O虛擬化擁有較好的性能,但是其不足之處在于虛擬機(jī)需要修改系統(tǒng)驅(qū)動,實現(xiàn)前后端驅(qū)動的對應(yīng);三是硬件支持的虛擬化,通過硬件的支持,虛擬機(jī)系統(tǒng)可以在VMM授權(quán)后,不經(jīng)VMM的請求轉(zhuǎn)發(fā),實現(xiàn)對硬件設(shè)備的直接訪問。硬件支持的虛擬化方式是未來虛擬化發(fā)展的一個方向,但是其廣泛的應(yīng)用仍然有賴于硬件設(shè)備的探索與發(fā)展。
[0005]1.UKVM/ARM
[0006]ARM體系結(jié)構(gòu)過去在指令集上認(rèn)為是不可虛擬化的(G.J.Popek andR.P.Goldberg.Formal Requirements for Virtualizable Third Generat1nArchitectures.Communicat1ns of the ACM, 17 (7):412 - 421, July 1974),ARM 在最新的ARMv7和ARMv8架構(gòu)中引入了硬件虛擬化擴(kuò)展,包括對CPU,內(nèi)存,中斷以及計時器虛擬化的硬件支持?jǐn)U展。嵌入式系統(tǒng)的虛擬化研宄,Christoffer Dall和Jason Nieh等已進(jìn)行了系統(tǒng)的研宄,實現(xiàn)了第一個ARM系統(tǒng)的虛擬化解決方案KVM/ARM,KVM/ARM已被并入到Linux3.9內(nèi)核中。
[0007]KVM/ARM基于已有的x86平臺下解決方案KVM,與x86平臺相比,ARM平臺缺少標(biāo)準(zhǔn)B1S或PCI總線的硬件自動識別,而Linux被設(shè)計于運行于幾乎所有的ARM平臺上。通過與KVM結(jié)合,KVM/ARM可以不加修改的運行在各個ARM平臺上,這與Xen ARM形成對比:Xen ARM直接運行在硬件層,必須針對各個不同的ARM平臺編寫不同的平臺代碼。
[0008]ARM虛擬化硬件擴(kuò)展被設(shè)計用于獨立運行于硬件的虛擬機(jī)監(jiān)控程序,因此KVM/ARM采用了分離模式的設(shè)計,該設(shè)計使得KVM既能夠利用已有KVM代碼,又可以充分利用ARM虛擬化硬件擴(kuò)展的特性,架構(gòu)如圖1所示。
[0009]KVM/ARM 分為 Highvisor 和 Lowvisor 兩個模塊,Highvisor 運行在 PLl 級別,即宿主機(jī)內(nèi)核中,負(fù)責(zé)集成和利用已有的KVM代碼,例如可以直接使用Linux Kernel中較為成熟的調(diào)度模塊,可以使用Linux Kernel中標(biāo)準(zhǔn)的數(shù)據(jù)結(jié)構(gòu);Lowvisor運行在CPU PL2級別,即Hyp級別,Lowvisor充分利用ARM虛擬化硬件擴(kuò)展的特性,配置正確的執(zhí)行環(huán)境。KVM/ARM的分離模式允許其可以運行在不經(jīng)修改的內(nèi)核中。
[0010]1.2λ Virt1 PV Driver
[0011]Virt1是半虛擬化解決方案中位于設(shè)備之上的設(shè)備層,是對通用模擬設(shè)備的抽象;通過應(yīng)用編程接口連接客戶機(jī)操作系統(tǒng)及虛擬機(jī)監(jiān)控程序(Hypervisor)。
[0012]Virt1的驅(qū)動程序架構(gòu)抽象如圖2所示,Virt1架構(gòu)包括前端驅(qū)動程序和后端驅(qū)動程序,其前端驅(qū)動程序包括塊設(shè)備,網(wǎng)絡(luò)設(shè)備,PCI設(shè)備以及balloon驅(qū)動程序,每個前端驅(qū)動程序包含一個對應(yīng)的后端程序,Virt1的軟件層次如圖3所示,其中VirtlO-net (半虛擬化網(wǎng)卡)提供了網(wǎng)絡(luò)設(shè)備共享的接口,為Guest和Qemu提供了高效的1通道,以共享內(nèi)存的數(shù)據(jù)傳輸方式為Guest提供了高效的網(wǎng)絡(luò)1性能。
[0013]在Virt1網(wǎng)絡(luò)虛擬化中,虛擬網(wǎng)絡(luò)設(shè)備維護(hù)了一個vring隊列的數(shù)據(jù)結(jié)構(gòu),以進(jìn)行數(shù)據(jù)收發(fā)和配置空間訪問。客戶機(jī)在進(jìn)行網(wǎng)絡(luò)I/O時,VirtlO-net前端驅(qū)動以讀寫數(shù)據(jù)方式寫入vring隊列,然后通過Virt10-pci硬件寄存器通知宿主機(jī),該步驟稱為kick操作。宿主機(jī)截獲通知信息并從vring隊列中讀寫請求,處理完畢后將結(jié)果添加到vring隊列并發(fā)送中斷給客戶機(jī)。該過程的流程圖如圖4所示,從該過程可以看出,客戶機(jī)每次發(fā)送數(shù)據(jù)時,需要執(zhí)行一次kick操作,從客戶機(jī)切換到虛擬機(jī)監(jiān)控程序KVM,再從虛擬機(jī)監(jiān)控程序切換回客戶機(jī)并觸發(fā)中斷。
[0014]1.3、網(wǎng)絡(luò)性能評估
[0015]網(wǎng)絡(luò)性能評估中一個重要的指標(biāo)是網(wǎng)絡(luò)的吞吐量,吞吐量是每秒中可以發(fā)送/傳輸多少字節(jié)數(shù)據(jù)。發(fā)明人針對不同虛擬機(jī)數(shù)量的情況下對網(wǎng)絡(luò)吞吐量進(jìn)行了測試,具體方法為,運行一定數(shù)量的虛擬機(jī),使用netperf網(wǎng)絡(luò)性能測試工具進(jìn)行批量數(shù)據(jù)傳輸測試,該測試結(jié)果反映的是一個系統(tǒng)能夠以多快的速度發(fā)送數(shù)據(jù),另一個系統(tǒng)能夠以多快的速度接收數(shù)據(jù)。在實驗過程中,發(fā)明人記錄了客戶機(jī)的數(shù)量與網(wǎng)絡(luò)的吞吐量,CPU使用率之間的關(guān)系,其結(jié)果如圖5所不。
[0016]從實驗結(jié)果可以看出,隨著虛擬機(jī)數(shù)量的增加,CPU利用率接近飽和,網(wǎng)絡(luò)總體的吞吐量保持穩(wěn)定。這個瓶頸表現(xiàn)為客戶機(jī)數(shù)量在2個及以上時CPU利用率完全飽和,也就是說,系統(tǒng)無法迅速地處理更多的數(shù)據(jù)包,而且?guī)缀跞康腃PU時鐘都被用于處理網(wǎng)絡(luò)數(shù)據(jù)收發(fā),在這個過程中,主要為客戶機(jī)和宿主機(jī)切換(VM Exit)所產(chǎn)生的開銷。
【發(fā)明內(nèi)容】
[0017]針對現(xiàn)有技術(shù)中的缺陷,本發(fā)明提出了一種在嵌入式網(wǎng)絡(luò)虛擬化環(huán)境中優(yōu)化網(wǎng)絡(luò)吞吐量的方法。該方法借鑒了網(wǎng)卡中斷節(jié)制技術(shù),網(wǎng)卡中斷節(jié)制技術(shù)是硬件網(wǎng)卡層面中的一種技術(shù)。在網(wǎng)絡(luò)繁忙的情況下,中斷帶來的CPU上下文切換的開銷非常大,CPU容易達(dá)到滿負(fù)荷中斷,產(chǎn)生中斷淹沒現(xiàn)象,使得CPU成為瓶頸,而網(wǎng)卡中斷節(jié)制技術(shù)所采取的策略為當(dāng)收到數(shù)據(jù)后并不立即產(chǎn)生中斷,而是經(jīng)過一定的時間后再產(chǎn)生中斷請求;這項技術(shù)避免頻繁的中斷占用CPU資源并有效地降低了 CPU利用率,優(yōu)化了網(wǎng)絡(luò)吞吐率。
[0018]根據(jù)本發(fā)明提供的一種嵌入式網(wǎng)絡(luò)虛擬化環(huán)境中Virt1網(wǎng)絡(luò)虛擬化工作方法,針對Virt1的前端驅(qū)動程序,對Virt1網(wǎng)絡(luò)引入延遲機(jī)制,使客戶機(jī)在進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)I/O時并不立刻將控制權(quán)移交給宿主機(jī),而是將數(shù)據(jù)緩存到隊列里,經(jīng)過一定的時間后再進(jìn)行上下文切換,通知宿主機(jī)從緩存隊列獲取數(shù)據(jù)。
[0019]優(yōu)選地,包括如下步驟:
[0020]步驟O:設(shè)置Virt1前端驅(qū)動程序中計時器的計時時間;
[0021]步驟1:當(dāng)客戶機(jī)發(fā)送數(shù)據(jù)包時,客戶機(jī)kernel調(diào)用Virt1前端驅(qū)動程序?qū)?shù)據(jù)寫在vring隊列;
[0022]步驟2:判斷計時器是否已啟動,若已啟動開始計時,則跳轉(zhuǎn)到步驟4 ;若尚未開始計時,則啟動計時器,進(jìn)入步驟3 ;
[0023]步驟3:計時器的計時時間結(jié)束后,客戶機(jī)執(zhí)行超級調(diào)用hypercall通知宿主機(jī),客戶機(jī)切換到虛擬機(jī)監(jiān)控程序,虛擬機(jī)監(jiān)控程序從vring隊列取出數(shù)據(jù),處理完畢后將結(jié)果添加到vring隊列并發(fā)送中斷給客戶機(jī);
[0024]步驟4:此次調(diào)用結(jié)束。
[0025]根據(jù)本發(fā)明提供的一種嵌入式網(wǎng)絡(luò)虛擬化環(huán)境中Virt1網(wǎng)絡(luò)虛擬化工作方法,包括如下步驟:
[0026]步驟O:設(shè)置Virt1前端驅(qū)動程序中計時器的計時時間;
[0027]步驟1:當(dāng)客戶機(jī)發(fā)送數(shù)據(jù)包時,客戶機(jī)kernel調(diào)用Virt1前端驅(qū)動程序?qū)?shù)據(jù)寫在vring隊列;
[0028]步驟2:判斷計時器是否已啟動,若已啟動