NFV關(guān)鍵技術(shù):計(jì)算虛擬化之IO虛擬化
Labs 導(dǎo)讀
現(xiàn)實(shí)中的外設(shè)資源是有限的,為了提高資源的利用率,滿足多個(gè)虛擬機(jī)操作系統(tǒng)對(duì)外部設(shè)備的訪問需求,VMM必須通過I/O虛擬化的方式來實(shí)現(xiàn)資源的復(fù)用,讓有限的資源能被多個(gè)虛擬機(jī)共享。
1、IO虛擬化概述
如何將服務(wù)器上的物理設(shè)備虛擬化為多個(gè)邏輯設(shè)備,并將物理設(shè)備與邏輯設(shè)備解耦,使虛擬機(jī)可以在各個(gè)虛擬化平臺(tái)間無縫遷移,正是I/O虛擬化的目標(biāo)。I/O虛擬化的基本要求主要有以下的三點(diǎn):
- 保真性,要求在虛擬化平臺(tái)下進(jìn)行的I/O訪問與非虛擬化條件下的I/O訪問除了完成時(shí)間差別外,其它效果相同;
 - 安全性,要求各虛擬機(jī)操作系統(tǒng)只能訪問VMM分配給其的I/O資源,而各I/O設(shè)備也只能與屬于同一個(gè)虛擬機(jī)的其它資源進(jìn)行交互,如存儲(chǔ)空間和CPU,而不能越界訪問屬于其它虛擬機(jī)的資源;
 - 性能,要求虛擬化系統(tǒng)下I/O訪問的性能與非虛擬化系統(tǒng)下的I/O訪問性能接近。
 
在這三個(gè)基本要求之中最為重要的就是安全性方面的要求,這是保證虛擬化環(huán)境可以正常運(yùn)行的根本,只有首先滿足這一要求才能保證虛擬化I/O的保真性,對(duì)于性能的要求才會(huì)有意義。虛擬化環(huán)境下之所以會(huì)出現(xiàn)安全性的問題是因?yàn)樘摂M機(jī)操作系統(tǒng)可見的地址并不是實(shí)際的機(jī)器物理地址,而是客戶物理地址,設(shè)備若無法獲知客戶物理地址和機(jī)器物理地址間的轉(zhuǎn)換關(guān)系,直接使用客戶物理地址進(jìn)行內(nèi)存訪問,這會(huì)導(dǎo)致非法地址訪問、破壞正常數(shù)據(jù)。
正是由于I/O虛擬化對(duì)于I/O空間安全隔離性方面的要求,所以對(duì)于虛擬機(jī)操作系統(tǒng)的I/O訪問操作一般都需要VMM的介入,而不允許虛擬機(jī)操作系統(tǒng)與I/O設(shè)備直接進(jìn)行交互,導(dǎo)致虛擬機(jī)操作系統(tǒng)的I/O訪問會(huì)受到VMM干預(yù),導(dǎo)致性能與非虛擬化環(huán)境有較大差距。而VMM介入之所以會(huì)導(dǎo)致性能嚴(yán)重?fù)p失的根本原因就是發(fā)生了上下文切換。
上下文切換分為兩種,虛擬機(jī)與虛擬機(jī)之間發(fā)生的上下文切換以及虛擬機(jī)與VMM之間發(fā)生的上下文切換。在I/O虛擬化中影響性能的就是虛擬機(jī)和VMM之間的上下文切換。虛擬機(jī)操作系統(tǒng)產(chǎn)生的I/O請(qǐng)求會(huì)被VMM截獲,VMM將I/O請(qǐng)求交由驅(qū)動(dòng)域去處理,驅(qū)動(dòng)域完成I/O請(qǐng)求要返回執(zhí)行結(jié)果,這些過程都會(huì)造成上下文切換。虛擬機(jī)和VMM之間的上下文切換的開銷主要分為以下三個(gè)部分:
- 直接開銷,這個(gè)部分主要由CPU的切換造成,CPU需要停滯虛擬機(jī)切換到VMM去執(zhí)行,之后又要從VMM轉(zhuǎn)回虛擬機(jī)執(zhí)行下一條指令。
 - 間接開銷,兩種環(huán)境的切換導(dǎo)致需要保存上下文環(huán)境。
 - 同步開銷,這個(gè)部分主要是VMM處理VM EXIT造成的。
 
因此,一旦發(fā)生大量的上下文切換,將嚴(yán)重影響I/O虛擬化的性能,尤其在I/O密集型的任務(wù)中,上下文切換導(dǎo)致的開銷往往是無法忍受的。為了解決性能的問題,通過DMA重映射、IOMMU等硬件輔助,實(shí)現(xiàn)了域間隔離和設(shè)備地址轉(zhuǎn)換,保證被分配給虛擬機(jī)的設(shè)備不會(huì)訪問不屬于該虛擬機(jī)的存儲(chǔ)器空間。
I/O虛擬化在具體實(shí)現(xiàn)上與CPU和內(nèi)存虛擬化一樣,分為軟件與硬件虛擬化;在被虛擬機(jī)訪問的方式上,又分為共享模式與直接訪問模式。
2、軟件I/O虛擬化技術(shù)
軟件I/O虛擬化通過軟件模擬設(shè)備的方式,使得I/O設(shè)備資源能夠被多個(gè)虛擬機(jī)共享,該方式可使I/O設(shè)備的利用率得到極大的提高,并且可以做到物理設(shè)備與邏輯設(shè)備分離,具有良好的通用性,但由于該方式需要VMM的介入而導(dǎo)致多次上下文切換,使得I/O性能受到影響。其本質(zhì)是VMM需要截獲虛擬機(jī)操作系統(tǒng)對(duì)外部設(shè)備的訪問請(qǐng)求,通過軟件的方式模擬出真實(shí)的物理設(shè)備的效果,這樣,虛擬機(jī)看到的實(shí)際只是一個(gè)虛擬設(shè)備,而不是真正的物理設(shè)備,這種模擬的方式就是I/O虛擬化的一種實(shí)現(xiàn),下圖所示就是一個(gè)典型的虛擬機(jī)I/O模型。
為了達(dá)到虛擬化I/O的目的,VMM截獲客戶操作系統(tǒng)對(duì)設(shè)備的訪問請(qǐng)求,然后通過軟件的方式來模擬真實(shí)設(shè)備的效果。I/O虛擬化中的設(shè)備對(duì)軟件來說,就是一堆的寄存器(I/O端口)和I/O內(nèi)存,以及中斷和DMA。而設(shè)備虛擬化的過程,就是模擬設(shè)備的這些寄存器和內(nèi)存,然后截獲Guest OS里面對(duì)I/O端口和寄存器的訪問,然后通過軟件的方式來模擬真實(shí)的硬件。軟件I/O虛擬化需要解決3個(gè)問題:
設(shè)備發(fā)現(xiàn): 需要控制各虛擬機(jī)能夠訪問的設(shè)備。
所謂設(shè)備發(fā)現(xiàn)就是VMM必須采取某種方式,使得虛擬機(jī)能夠發(fā)現(xiàn)虛擬設(shè)備。這樣,虛擬機(jī)才能夠加載相應(yīng)的驅(qū)動(dòng)程序。
在沒有虛擬化的系統(tǒng)中,由BIOS或者操作系統(tǒng)通過遍歷PCI總線上的所有設(shè)備完成設(shè)備發(fā)現(xiàn)過程,而在虛擬化系統(tǒng)中,則由VMM決定向虛擬機(jī)呈現(xiàn)哪些設(shè)備。具體過程要根據(jù)設(shè)備是否存在于物理總線上來進(jìn)行。對(duì)于一個(gè)真實(shí)存在于物理總線的設(shè)備,如果是不可枚舉的類型,例如PS/2鍵盤,由于這類設(shè)備是硬編碼固定的,驅(qū)動(dòng)程序會(huì)通過其特定的訪問方式來檢查設(shè)備是否存在,因此VMM只要在相應(yīng)端口上模擬出該設(shè)備,虛擬機(jī)即可成功檢測(cè)到它;如果是可枚舉的類型,譬如PCI設(shè)備或者PCIe設(shè)備,這種設(shè)備通常定義了完整的設(shè)備發(fā)現(xiàn)方法,并允許BIOS或者操作系統(tǒng)在設(shè)備枚舉過程中通過PCI配置空間對(duì)其資源進(jìn)行配置。因此VMM不僅要模擬這些設(shè)備本身的邏輯,還要模擬PCI總線的一些屬性,包括總線拓?fù)潢P(guān)系及相應(yīng)設(shè)備的PCI配置空間,以便虛擬機(jī)OS在啟動(dòng)時(shí)能夠發(fā)現(xiàn)這些設(shè)備。
VMM不僅可以模擬真實(shí)設(shè)備,還可以實(shí)際并不存在的虛擬設(shè)備。由于這類設(shè)備并沒有現(xiàn)實(shí)中的規(guī)范和模型與之相對(duì)應(yīng),因此完全由VMM決定它們的總線類型。這類虛擬設(shè)備可以掛載在已有PCI總線上,也可以完全自定義一套新的總線。若使用自定義的新總線,則必須在虛擬機(jī)中加載特殊的總線驅(qū)動(dòng)程序,且影響虛擬機(jī)在不同虛擬化平臺(tái)的遷移性。
訪問截獲: 通過I/O端口對(duì)設(shè)備的訪問。
所謂訪問截獲就是虛擬機(jī)操作系統(tǒng)發(fā)現(xiàn)虛擬設(shè)備之后,虛擬機(jī)上的驅(qū)動(dòng)程序就會(huì)按照特定接口訪問這個(gè)虛擬設(shè)備。驅(qū)動(dòng)程序?qū)τ诮涌诘恼{(diào)用必須能夠被VMM截獲,并能按照真實(shí)設(shè)備的行為進(jìn)行模擬。
以分配到端口I/O資源的設(shè)備為例,由于CPU對(duì)于端口I/O資源的控制與指令流所處的特權(quán)級(jí)別和相關(guān) I/O位圖有關(guān),而在虛擬化環(huán)境中虛擬機(jī)OS又被降級(jí)到非特權(quán)級(jí)別,因此OS能否訪問設(shè)備的I/O端口就完全由I/O位圖決定。對(duì)于沒有直接分配給虛擬機(jī)的設(shè)備,VMM就可以把它的I/O端口在I/O位圖中關(guān)閉,當(dāng) 虛擬機(jī)操作系統(tǒng)在訪問該端口時(shí),就會(huì)拋出一個(gè)保護(hù)異常,VMM即可獲得異常原因,并進(jìn)而將請(qǐng)求發(fā)送給底層設(shè)備模擬器進(jìn)行模擬,并異常訪問處理結(jié)果返回給虛擬機(jī);如果該設(shè)備是直接分配給虛擬機(jī),那么VMM就可以在I/O位圖中打開它的I/O端口,這樣虛擬機(jī)驅(qū)動(dòng)程序就可以直接訪問該設(shè)備。
同理,對(duì)于分配到MMIO(Memory Mapped I/ O)資源的設(shè)備,比如某些PCIe設(shè)備,由于MMIO是系統(tǒng)物理地址空間的一部分,物理地址空間由頁(yè)表管理,因此VMM同樣可以通過控制MMIO相應(yīng)的頁(yè)表項(xiàng)是否有效來截獲虛擬機(jī)操作系統(tǒng)對(duì)于MMIO資源的訪問。
設(shè)備模擬:通過軟件的方式模擬真實(shí)的物理設(shè)備。
所謂設(shè)備模擬就是模擬設(shè)備的功能,內(nèi)容十分多樣且復(fù)雜。對(duì)于像PS/2鍵盤、鼠標(biāo)這樣的設(shè)備,VMM需要根據(jù)設(shè)備的接口規(guī)范模擬設(shè)備的所有行為,才能夠無需修改驅(qū)動(dòng)就在虛擬機(jī)上展現(xiàn)出設(shè)備應(yīng)有的效果。而對(duì)于磁盤存儲(chǔ)系統(tǒng),則不必受限于實(shí)際的磁盤控制器以及具體磁盤類型和型號(hào)。比如,對(duì)IDE硬盤其I/O端口虛擬化時(shí),底層可以是一塊磁盤,可以是一個(gè)分區(qū),也可以是不同格式的文件;然后在其上實(shí)現(xiàn)一個(gè)專門的塊設(shè)備抽象層;最后在塊設(shè)備上使用文件系統(tǒng),并引入一些真實(shí)硬件沒有的高級(jí)特性,例如:加密、備份、增量存儲(chǔ)等。
上述三個(gè)環(huán)節(jié)僅是VMM處理一個(gè)虛擬 機(jī)所發(fā)出I/O請(qǐng)求的流程。在實(shí)際中,系統(tǒng)的物理設(shè)備需要同時(shí)接受來自多個(gè)虛擬 機(jī)的I/O請(qǐng)求。因此,VMM還要將多個(gè)虛擬機(jī)的I/O請(qǐng)求合并為單獨(dú)一個(gè)I/O數(shù)據(jù)流發(fā)送給底層設(shè)備驅(qū)動(dòng)。當(dāng)VMM收到來自底層設(shè)備驅(qū)動(dòng)完成I/O請(qǐng)求的中斷時(shí),VMM還要能夠?qū)⒅袛囗憫?yīng)結(jié)果轉(zhuǎn)發(fā)給正確的虛擬機(jī),以通知其I/O操作結(jié)束。同時(shí)VMM在調(diào)度各個(gè)虛擬機(jī)發(fā)送來的I/O請(qǐng)求處理時(shí),必須依據(jù)一定的算法確保虛擬機(jī)I/O的QoS與設(shè)備共享的公平性。
在實(shí)現(xiàn)架構(gòu)上,軟件I/O虛擬化技術(shù)主要包括Hypervisor全虛架構(gòu)和前端/后端的半虛架構(gòu)來說實(shí)現(xiàn)。
2.1 全虛擬化---模擬模型
即完全使用軟件來模擬真實(shí)硬件,模擬通常硬件,例如鍵盤鼠標(biāo)。該架構(gòu)使用最為廣泛的I/O設(shè)備虛擬化模型,采用軟件的方式模擬設(shè)備行為,為虛擬機(jī)模擬出與底層硬件完全一致的虛擬化環(huán)境,保證虛擬機(jī)操作系統(tǒng)的行為與非虛擬化環(huán)境下完全一致。在模擬模型中,虛擬設(shè)備必須以某種方式讓虛擬機(jī)可以發(fā)現(xiàn),導(dǎo)致虛擬機(jī)被“欺騙”。當(dāng)虛擬機(jī)訪問虛擬設(shè)備時(shí),訪問請(qǐng)求被VMM截獲,然后VMM將I/O請(qǐng)求交由domain0來模擬完成,最后將結(jié)果返回給虛擬機(jī)。如下圖所示是一個(gè)基于設(shè)備模擬的xen的I/O虛擬化模型。
這種架構(gòu)最大的優(yōu)點(diǎn)在于不需要對(duì)虛擬機(jī)操作系統(tǒng)內(nèi)核做修改,也不需要為改寫其原生驅(qū)動(dòng)程序,因此,這種架構(gòu)是可移植性與兼容性最佳的一種I/O設(shè)備虛擬模型,這也是它被如此廣泛使用的主要原因,除了Xen架構(gòu)的全虛模型外,VMware的Workstations和ESX都有類似的全虛模型,且是全虛模型的典型代表。
但是,全虛模型有一個(gè)很大的不足之處,即性能不夠高,主要原因有兩方面:第一、模擬方式是用軟件行為進(jìn)行模擬,這種方式本身就無法得到很高的性能;第二、這種模型下I/O請(qǐng)求的完成需要虛擬機(jī)與VMM多次的交互,產(chǎn)生大量的上下文切換,造成巨大開銷。模擬IO虛擬化方式的最大開銷在于處理器模式的切換:包括從Guest OS到VMM的切換,以及從內(nèi)核態(tài)的VMM到用戶態(tài)的IO模擬進(jìn)程之間的切換。
在全虛擬化,由于VMM實(shí)現(xiàn)模式不同,采用的設(shè)備虛擬化方式也不同。比如,全虛擬化最有代表性的VMware ESX和VMWare Workstattion。
在VMware ESX中,VMM直接運(yùn)行在物理硬件之上,直接操作硬件設(shè)備,而Guest OS看到的則是一組統(tǒng)一的虛擬IO設(shè)備。Guest OS對(duì)這些虛擬設(shè)備的每一個(gè)IO操作都會(huì)陷入VMM 中,由VMM對(duì)IO指令進(jìn)行解析并映射到實(shí)際的物理設(shè)備,然后直接控制硬件完成。
而VMWare WorkStation采用了不同的方式。VMM實(shí)際上運(yùn)行在一個(gè)傳統(tǒng)的操作系統(tǒng)之上,這類VMM無法獲得對(duì)硬件資源的完全控制,因此采用軟件模擬的方式來模擬IO設(shè)備。Guest OS的IO操作會(huì)被VMM捕獲,并轉(zhuǎn)發(fā)給宿主機(jī)(host OS)的一個(gè)用戶態(tài)進(jìn)程,該進(jìn)程通過對(duì)宿主機(jī)操作系統(tǒng)的系統(tǒng)調(diào)用來模擬設(shè)備的行為。
以下是VMware的ESX架構(gòu),VMkernel負(fù)責(zé)管理虛擬機(jī)對(duì)于網(wǎng)絡(luò)和存儲(chǔ)設(shè)備的訪問。通過設(shè)備模擬術(shù),不同的物理設(shè)備對(duì)于虛擬機(jī)可以呈現(xiàn)為某種特定的虛擬設(shè)備,甚至并不存在的虛擬設(shè)備。
對(duì)于存儲(chǔ),物理服務(wù)器上部署的可能是某種SCSI設(shè)備、磁盤陣列甚至是SAN存儲(chǔ)網(wǎng)絡(luò),但是ESX能夠模擬出BusLogic或者LSILogic的SCSI適配器,因此對(duì)于虛擬機(jī)總是呈現(xiàn)為SCSI設(shè)備。而對(duì)于網(wǎng)絡(luò)ESX則模擬為AMD Lance適配器或者一個(gè)并不存在的自定義接口vmxnet,來幫助虛擬機(jī)對(duì)網(wǎng)絡(luò)的問。上圖顯示了在ESXi服務(wù)器內(nèi)部經(jīng)過的I/O路徑。其中,虛擬機(jī)分別使用vmxnet虛擬網(wǎng)絡(luò)適配器與LSI Logic虛擬SCSI適配器對(duì)網(wǎng)絡(luò)和存儲(chǔ)進(jìn)行訪問,而物理服務(wù)器則使用Intel e1000網(wǎng)卡連接到SAN網(wǎng)絡(luò)的QLogic光纖HBA卡。
- 第1步所示,虛擬機(jī)中的某個(gè)應(yīng)用程序通過操作系統(tǒng)發(fā)起I/O訪問,比如發(fā)送一個(gè)網(wǎng)絡(luò)數(shù)據(jù)包或者向磁盤寫入一個(gè)文件;
 - 第2步表示操作系統(tǒng)對(duì)其進(jìn)行處理,并調(diào)用設(shè)備驅(qū)動(dòng)處理相應(yīng)的I/O請(qǐng)求;
 - 第3步表示當(dāng)設(shè)驅(qū)動(dòng)試圖訪問外設(shè)時(shí),VMM攔截到該操作并將控制權(quán)切換到Vmkernel;
 - 第4步為VMkernel獲得控制權(quán)后,I/O請(qǐng)求會(huì)被轉(zhuǎn)發(fā)到與設(shè)備無關(guān)的網(wǎng)絡(luò)或者存儲(chǔ)抽象層進(jìn)行處理;
 - 第5步表示VMkernel還會(huì)同時(shí)接收到來自其他虛擬機(jī)的多個(gè)I/O請(qǐng)求,并對(duì)這些I/O請(qǐng)求按照特定算法進(jìn)行優(yōu)先級(jí)調(diào)度處理。
 
I/O請(qǐng)求最終會(huì)被轉(zhuǎn)發(fā)到具有物理設(shè)備驅(qū)動(dòng)程序的硬件接口層進(jìn)行處理。當(dāng)I/O請(qǐng)求的完成中斷到達(dá)時(shí),I/O處理過程則與上述路徑完全相反。VMkernel中設(shè)備驅(qū)動(dòng)會(huì)將到達(dá)的中斷保護(hù)起來,并調(diào)用VMkernel來處理該中斷;接下來VMkernel會(huì)通知相應(yīng)虛擬機(jī)的VMM進(jìn)程,VMM進(jìn)程會(huì)向虛擬機(jī)發(fā)起中斷,以通知I/O請(qǐng)求處理完畢;同時(shí)VMkernel還要確保I/O處理完畢的相關(guān)信息與其他虛擬機(jī)的數(shù)據(jù)相互隔離。
由于上述過程需要VMkernel處理I/O請(qǐng)求,因此從虛擬機(jī)到VMkernel上下文的切換過程會(huì)導(dǎo)致一定的開銷。為了降低開銷,vmxnet在收發(fā)數(shù)據(jù)包之前,會(huì)收集一組數(shù)據(jù)包再轉(zhuǎn)發(fā)給各個(gè)虛擬機(jī)或者一起發(fā)送出去。對(duì)于多個(gè)虛擬機(jī)之間的設(shè)備資源管理方面,對(duì)于網(wǎng)絡(luò)ESX采用了流量整形的方式限制每個(gè)虛擬機(jī)的總帶外流量;對(duì)于存儲(chǔ)ESX實(shí)現(xiàn)了比例公平的算法平衡多個(gè)虛擬機(jī)之間磁盤訪問帶寬。
2.2 半虛擬化---泛虛擬化模型
即屬于前后端驅(qū)動(dòng)模型的IO虛擬化,也稱為分離驅(qū)動(dòng)模型。泛虛擬化模型是被廣泛使用的另一種I/O設(shè)備虛擬化模型。相比于全虛模型而言,泛虛擬化模型在性能上有很大的提升。主要有以下兩個(gè)原因:
- 一是該模型采用了I/O環(huán)機(jī)制(一種大塊多隊(duì)列聚合傳輸技術(shù),支持I/O環(huán)適配功能的虛擬機(jī)操作系統(tǒng),只有安裝了Tools才能使用到IO環(huán)適配功能),減少了虛擬機(jī)與VMM之間的切換;
 - 二是該模型摒棄了傳統(tǒng)的中斷機(jī)制,而采用事件或回調(diào)機(jī)制來實(shí)現(xiàn)設(shè)備與客戶機(jī)間的通信。進(jìn)行中斷處理時(shí),傳統(tǒng)的中斷服務(wù)程序需要進(jìn)行中斷確認(rèn)和上下文切換,而采用事件或回調(diào)機(jī)制,無需進(jìn)行上下文切換。如下圖所示是一個(gè)基于泛虛擬化的Xen的I/O虛擬化模型。
 
前端/后端架構(gòu)也稱為“Split I/O”,即將傳統(tǒng)的I/O驅(qū)動(dòng)模型分為兩個(gè)部分,一部分是位于客戶機(jī)OS內(nèi)部的設(shè)備驅(qū)動(dòng)程序(前端),該驅(qū)動(dòng)程序不會(huì)直接訪問設(shè)備,所有的I/O設(shè)備請(qǐng)求會(huì)轉(zhuǎn)發(fā)給位于一個(gè)特權(quán)虛機(jī)的驅(qū)動(dòng)程序(后端),后端驅(qū)動(dòng)可以直接調(diào)用物理I/O設(shè)備驅(qū)動(dòng)訪問硬件。前端驅(qū)動(dòng)負(fù)責(zé)接收來自其他模塊的I/O操作請(qǐng)求,并通過虛擬機(jī)之間的事件通道機(jī)制將I/O請(qǐng)求轉(zhuǎn)發(fā)給后端驅(qū)動(dòng)。后端在處理完請(qǐng)求后會(huì)異步地通知前端。相比于全虛模型中VMM需要截獲每個(gè)I/O請(qǐng)求并多次上下文切換的式,這種基于請(qǐng)求/事務(wù)的方式能夠在很大程度上減少上下文切換的頻率,并降低開銷。但是這種I/O模型有一個(gè)很大的缺點(diǎn),要修改操作系統(tǒng)內(nèi)核以及驅(qū)動(dòng)程序,因此會(huì)存在移植性和適用性方面的問題,導(dǎo)致其使用受限。下滿以Xen架構(gòu)的模型為例說明:
在Xen架構(gòu)的半虛擬化模型中,通過修改Guest OS的內(nèi)核,將原生的設(shè)備驅(qū)動(dòng)從Guest OS移出,放到一個(gè)特殊的設(shè)備虛擬機(jī)中Dom0了,其余虛擬機(jī)中的I/O請(qǐng)求都由設(shè)備虛擬機(jī)處理。而在Guest OS內(nèi)部,為每個(gè)虛擬設(shè)備安裝一個(gè)特殊的驅(qū)動(dòng)程序,由該驅(qū)動(dòng)程序負(fù)責(zé)I/O請(qǐng)求的傳遞,設(shè)備虛擬機(jī)經(jīng)過VMM授權(quán),解析收到的請(qǐng)求并映射到實(shí)際物理設(shè)備,最后交給設(shè)備的原生驅(qū)動(dòng)來完成IO。實(shí)際上在這種情況下,Guest OS的驅(qū)動(dòng)是消息代理的作用,把I/O事件轉(zhuǎn)換為消息,發(fā)送給設(shè)備虛擬機(jī)處理。具體前后端驅(qū)動(dòng)配合實(shí)現(xiàn)物理設(shè)備驅(qū)動(dòng)功能,需要通過以下幾步實(shí)現(xiàn):
Step1:如何實(shí)現(xiàn)設(shè)備發(fā)現(xiàn)?
- 所有VM的設(shè)備信息保存在Domain0的XenStore中。
 - VM中的XenBus (為Xen開發(fā)的半虛擬化驅(qū)動(dòng))通過與Domain0的XenStore通信,獲取設(shè)備信息。
 - 加載設(shè)備對(duì)應(yīng)的前端驅(qū)動(dòng)程序。
 
Step2:如何實(shí)現(xiàn)設(shè)備數(shù)據(jù)截獲?
- 前端設(shè)備驅(qū)動(dòng)將數(shù)據(jù)通過VMM提供的接口全部轉(zhuǎn)發(fā)到后端驅(qū)動(dòng)。
 - 后端驅(qū)動(dòng)VM的數(shù)據(jù)進(jìn)行分時(shí)分通道進(jìn)行處理。
 
Step3:如何模擬使用IO設(shè)備
Domain U中虛擬機(jī)程序使用IO設(shè)備時(shí),通過前端驅(qū)動(dòng)Front-End Driver由XenBus總線訪問Domain 0中的Back-End Driver,Back-End Driver通過XenStor中記錄的IO設(shè)備信息,找到真實(shí)的設(shè)備驅(qū)動(dòng)Native Driver去訪問真實(shí)IO設(shè)備。
需要注意一點(diǎn):這種前后端驅(qū)動(dòng)架構(gòu)的瓶頸就是Domain 0,因?yàn)镈omain 0通過XenBus總線采用時(shí)分復(fù)用的策略與前端多個(gè)DomainU聯(lián)動(dòng)。
3、硬件I/O虛擬化技術(shù)
為了改善I/O性能,旨在簡(jiǎn)化I/O訪問路徑的設(shè)備直通訪問方式又被提了出來。代表技術(shù)為Intel公司出 的VT-d與AMD公司的IOMMU技術(shù)。盡管這兩種技術(shù)在一定程度上提高了I/O訪問性能,但代價(jià)卻是限制了系統(tǒng)的可擴(kuò)展性。目前PCI-SIG提出的SR-IOV與MR-IOV是平衡I/O虛擬化通用性、訪問性能與系統(tǒng)可擴(kuò)展性的很好的解決方案。
3.1 IO透?jìng)?--設(shè)備直接分配模型,即直接分配給虛擬機(jī)物理設(shè)備
軟件實(shí)現(xiàn)I/O虛擬化的技術(shù)中,所有的虛擬機(jī)都共享物理平臺(tái)上的硬件設(shè)備。如果物理?xiàng)l件好,有足夠的硬件,就可以考慮讓每個(gè)虛擬機(jī)獨(dú)占一個(gè)物理設(shè)備,這樣無疑會(huì)提高系統(tǒng)的性能。把某一個(gè)設(shè)備直接分配給一個(gè)虛擬機(jī),讓虛擬機(jī)可以直接訪問該物理設(shè)備而不需要通過VMM或被VMM截獲,這就是設(shè)備直通技術(shù)。如下圖所示為設(shè)備直接分配的I/O模型。
在設(shè)備直接分配模型中,虛擬機(jī)操作系統(tǒng)可直接擁有某一物理設(shè)備的訪問控制權(quán)限,VMM不再干涉其訪問操作。因此,該模型可以較大地改善虛擬化設(shè)備的性能,降低VMM程序的復(fù)雜性,易于實(shí)現(xiàn),并且不需要修改操作系統(tǒng),保證了高可用性。
設(shè)備直接分配模型雖然在性能上相比軟件方式的兩種I/O設(shè)備虛擬化模型有著很大的提升,但是該模型的使用也是有一定限制的。因?yàn)樵撃P蛯⒁患锢碓O(shè)備直接分配給了一個(gè)虛擬機(jī),其它虛擬機(jī)是無法使用該設(shè)備的,所產(chǎn)生的一個(gè)問題就是如果其它虛擬機(jī)需要訪問該設(shè)備則無法滿足需求,解決辦法就是物理資源充分滿足需求或者通過硬件虛擬化技術(shù)虛擬出多個(gè)IO設(shè)備(與物理設(shè)備性能極為接近)供多個(gè)虛擬機(jī)使用(硬件必須支持)。
3.2 Intel的設(shè)備硬件虛擬化技術(shù)---VT-d
VT-d,即VT for Direct I/O,主要在芯片組中實(shí)現(xiàn),允許虛擬機(jī)直接訪問I/O設(shè)備,以減少VMM和CPU的負(fù)擔(dān),如下圖畫紅框部分。
Intel公司提出的VT系列技術(shù)中VT-d其目的就是讓虛擬機(jī)直接訪問物理機(jī)底層I/O設(shè)備,使虛擬機(jī)能夠使用自己的驅(qū)動(dòng)直接操作I/O設(shè)備,而無需VMM的介入和干涉。通過引入DMA重映射,VT-d不僅可以使虛擬機(jī)直接訪問設(shè)備,同時(shí)還提供了一種安全隔離機(jī)制,防止其他虛擬機(jī)或者VMM訪問分配給指定虛擬機(jī)的物理內(nèi)存。VT-d中DMA重映射原理如下圖所示:(在北橋也就是現(xiàn)在CPU封裝中實(shí)現(xiàn))
具體來說,VT-d技術(shù)在北橋引入了DMA重映射技術(shù),并通過兩種數(shù)據(jù)結(jié)構(gòu)(Root Entry 和 Context Entry)維護(hù)了設(shè)備的I/O頁(yè)表。設(shè)備上的DMA操作都會(huì)被DMA重映射硬件截獲,并根據(jù)對(duì)應(yīng)的I/O頁(yè)表對(duì)DMA中的地址進(jìn)行轉(zhuǎn)換,同時(shí)也會(huì)對(duì)要訪問的地址空間進(jìn)行控制。
在具體實(shí)現(xiàn)上,VT-d使用PCI總線中的設(shè)備描述符BDF(Bus Device Function)來標(biāo)示DMA操作發(fā)起者的標(biāo)示符。其次,VT-d使用兩種數(shù)據(jù)結(jié)構(gòu)來描述PCI總線結(jié)構(gòu),分別是根條目(Root Entry)和上下文條目(Context Entry)。如下圖所示,其中根條目用于描述PCI總線。由于PCI總線個(gè)數(shù)可以達(dá)到256個(gè),因此根條目的范圍是0~255,其中每個(gè)根條目的一個(gè)指針字段都指向該總線的所有PCI設(shè)備的上下文條目表指針(Context Table Pointer,CTP)。由于一個(gè)PCI總線可以包含256個(gè)設(shè)備,因此上下文條目表的范圍也是0~255 。在每個(gè)上下文條目中都包含兩個(gè)重要字段:地址空間根(Address Space Root,ASR) 指向該設(shè)備的I/O頁(yè)表;域標(biāo)示符(Domain ID,DID)可以理解為唯一標(biāo)示一個(gè)虛擬機(jī)的標(biāo)示符。
基于這種方式,當(dāng)某一個(gè)設(shè)備發(fā)起DMA操作及被DMA重映射硬件截獲時(shí),通過該設(shè)備的BDF中的Bus字段,可以找到其所在的根條目。根據(jù)device和function字段,可以索引到具體設(shè)備的上下文條目。這樣就可根據(jù)上下文條目中的ASR字段找到該設(shè)備的I/O頁(yè)表,再通過DMA重映射硬件將I/O請(qǐng)求的GPA轉(zhuǎn)換為HPA,從而達(dá)到設(shè)備直接訪問虛擬機(jī)內(nèi)存的目的。
使用VT-d將設(shè)備直接分配給虛擬機(jī)的I/O訪問性能十分接近無虛擬化環(huán)境下的I/O訪問性能,然而VT-d事實(shí)上是一種I/O設(shè)備被虛擬機(jī)獨(dú)占的方式,這種方式犧牲了虛擬化平臺(tái)中的設(shè)備共享能力,設(shè)備用率大大降低,而且系統(tǒng)的可擴(kuò)展性受到物理平臺(tái)插槽個(gè)數(shù)的限制。比如,假定一個(gè)服務(wù)器配置4個(gè)CPU,每個(gè)CPU為8核,按照平均分配方式每個(gè)虛擬機(jī)一個(gè)核,則可以創(chuàng)建32個(gè)虛擬機(jī),如果按照備 直接訪問的方式分配網(wǎng)卡,則需要32個(gè)物理插槽,這是不現(xiàn)實(shí)的。
VT-d還為DMA重映射提供了安全隔離的保障。上圖是沒有VT-d技術(shù)與有VT-d技術(shù)的虛擬化平臺(tái)的對(duì)比。可以看出,圖(a)部分沒有VT-d虛擬化技術(shù)的平臺(tái)中,物理設(shè)備的DMA操作可以訪問整個(gè)系統(tǒng)內(nèi)存。而圖(b)有VT-d技術(shù)的平臺(tái)中,對(duì)設(shè)備DMA操作的地址范圍進(jìn)行了限制,只能訪問指定的地址空間。
除了DMA重映射外,VT-d還提供了中斷重映射功能,有興趣的可以參考Intel官網(wǎng)的VT技術(shù)手冊(cè)。
3.3 VMDq和VMDc技術(shù)
在集群和數(shù)據(jù)中心這類環(huán)境中,每臺(tái)主機(jī)通常同時(shí)運(yùn)行大量的虛擬機(jī)。由于主機(jī)的網(wǎng)絡(luò)設(shè)備數(shù)目有限,多個(gè)虛擬機(jī)不得不復(fù)用同一個(gè)網(wǎng)絡(luò)設(shè)備,從而導(dǎo)致性能下降。Intel VT-c 技術(shù)可針對(duì)虛擬化進(jìn)一步優(yōu)化網(wǎng)絡(luò)性能。VT-c 包括如下兩個(gè)關(guān)鍵技術(shù):
3.3.1 虛擬機(jī)設(shè)備隊(duì)列(Virtual Machine Device Queues,VMDq)
收到一個(gè)數(shù)據(jù)包時(shí),VMM必須將其分類以確定應(yīng)該轉(zhuǎn)發(fā)給哪個(gè)虛擬機(jī),這占用了大量寶貴的處理器資源。如果以太網(wǎng)控制器支持 VMDq 技術(shù),VMM可以為虛擬機(jī)使用不同的數(shù)據(jù)包隊(duì)列,以太網(wǎng)控制器自動(dòng)分類數(shù)據(jù)包并投放到相應(yīng)的隊(duì)列中,大大減輕VMM的負(fù)擔(dān),提高了I/O吞吐量,如下圖所示。
而Intel所使用的VMDq就是通過網(wǎng)卡芯片內(nèi)建的 Layer 2 classifier / sorter 以加速網(wǎng)絡(luò)數(shù)據(jù)傳送,它可以先行將不同的虛擬機(jī)所需的網(wǎng)絡(luò)數(shù)據(jù)包,直接在芯片里規(guī)劃好,然后再通過 receive queue直送給虛擬機(jī)。這樣就不用送過虛擬交換機(jī)轉(zhuǎn)發(fā)數(shù)據(jù)包減少網(wǎng)絡(luò)的負(fù)載與CPU的開銷,有VMDq和沒VMDq的對(duì)比如下:
3.3.2 虛擬機(jī)直接連接(Virtual Machine Direct Connect,VMDc)
這是Intel借鑒了SR-IOV技術(shù)的特點(diǎn)。與SR-IOV技術(shù)一樣,支持該技術(shù)的網(wǎng)絡(luò)設(shè)備能夠?qū)ν庹宫F(xiàn)出多個(gè)虛擬功能接口VF(Virtual Function)。每個(gè)功能接口相當(dāng)于一個(gè)網(wǎng)絡(luò)設(shè)備,VMM可將其直接分配給某個(gè)虛擬機(jī),從而“避免”了網(wǎng)絡(luò)設(shè)備的復(fù)用。例如,VMM僅用單個(gè)英特爾萬兆位服務(wù)器網(wǎng)卡,可為10個(gè)客戶機(jī)操作系統(tǒng)分配獨(dú)立受保護(hù)的1Gb/秒的專用鏈路,VMM無需繼續(xù)管理這些直接通信鏈路,進(jìn)一步提升I/O性能并減少主機(jī)CPU的負(fù)載 。
3.4 SR-IOV與MR-IOV:PCIe的虛擬化
如前所述,軟件設(shè)備模擬盡管實(shí)現(xiàn)了物理與邏輯的分離,但是性能受到影響;VT-d或者IOMMU技術(shù)則以犧牲系統(tǒng)擴(kuò)展性為代價(jià)獲得近似于直接訪問設(shè)備的I/O性能,而且其中任何一種都不是基于現(xiàn)有的工業(yè)標(biāo)準(zhǔn)。因此,業(yè)界希望重新設(shè)計(jì)一種可以原生共享的設(shè)備。具有原生共享特性的設(shè)備可同時(shí)為多個(gè)虛擬機(jī)提供單獨(dú)的內(nèi)存空間、工作隊(duì)列、中斷與命令處理,使得設(shè)備的資源能夠在多個(gè)虛擬機(jī)之間共享。同時(shí),這些設(shè)備能夠從多個(gè)源端同時(shí)接收命令,并將其合并再一起發(fā)送出去。因此,原生共享設(shè)備不需要VMM模擬設(shè)備,同時(shí)也在硬件層次上使得多個(gè)虛擬機(jī)同時(shí)訪問設(shè)備,很好地兼顧了虛擬化系統(tǒng)的性能與可擴(kuò)展性。
PCI-SIG組織提出了一個(gè)新的技術(shù)規(guī)范:SR-IOV(Single Root I/O Virtualization)。該規(guī)范定義了一個(gè)單根設(shè)備(如 一個(gè)以太網(wǎng)卡端口)如何呈現(xiàn)為多個(gè)虛擬設(shè)備。在SR-IOV中,定義了兩個(gè)功能類型:一是物理功能類型PF,負(fù)責(zé)管理SR-IOV設(shè)備的特殊驅(qū)動(dòng),其主要功能是提供設(shè)備訪問功能和全局共享資源配置的功能,虛擬機(jī)所有影響設(shè)備狀態(tài)的操作均需通過通信機(jī)制向PF發(fā)出請(qǐng)求完成。二是虛擬功能類型VF是輕量級(jí)的PCIe功能,包含三個(gè)方面:向虛擬機(jī)操作系統(tǒng)提供的接口;數(shù)據(jù)的發(fā)送、接收功能;與PF進(jìn)行通信,完成全局相關(guān)操作。由于VF的資源僅是設(shè)備資源的子集,因此VF驅(qū)動(dòng)能夠訪問的資源有限,對(duì)其它資源的訪問必須通過PF完成。
上圖是一個(gè)支持SR-IOV的網(wǎng)卡配置。其中左側(cè)三個(gè)VM是通過VF可以直接分配到的網(wǎng)卡資源,而該網(wǎng)卡的PF所具有的完整資源仍能用于最右側(cè)兩個(gè)虛擬機(jī)對(duì)模擬設(shè)備的訪問路徑。一個(gè)具備SR-IOV特性的設(shè)備通過VMM配置可以在PCI配置空間中呈現(xiàn)為多個(gè)VF,每個(gè)VF都配置了基地址寄存器(Base Address Register,BAR)的完整配置空間。VMM通過將一個(gè)或多個(gè)VF的配置空間映射到虛擬機(jī)的PCI配置空間中實(shí)現(xiàn)VF的分配。結(jié)合VT-d內(nèi)存映射等技術(shù),虛擬機(jī)可以直接訪問VF的內(nèi)存空間,這就 能繞過VMM直接訪問I/ O設(shè)備。如下圖所示:
SR-IOV還實(shí)現(xiàn)了地址轉(zhuǎn)換服務(wù)(Address Translation Service,ATS)來提供更好的性能。通過緩存TLB到本地,I/O設(shè)備可以在發(fā)起PCI事務(wù)之前直接對(duì)DMA地址進(jìn)行轉(zhuǎn)換,這樣就避免了在IOMMU中進(jìn)行地址轉(zhuǎn)換時(shí)可能發(fā)生的缺頁(yè)情況。通過這種方式,綁 定到VF的虛擬機(jī)可 獲得與基于硬件I/O虛擬 化虛擬機(jī)接近的性能。但是與基于硬件I/O虛擬化較低的可擴(kuò)展性相比,一個(gè)SR-IOV設(shè)備可以具有幾百個(gè)VF,因此SR-IOV具有更好的可擴(kuò)展性。
MR-IOV(Multiple Root I/O Virtualization)擴(kuò)展了SR-IOV規(guī)范。MR-IOV允許PCIe設(shè)備在多個(gè)有獨(dú)立PCI根的系統(tǒng)之間共享,這些系統(tǒng)通過基于PCIe轉(zhuǎn)換器的拓?fù)浣Y(jié)構(gòu)與PCIe設(shè)備或者PCIe-PCI橋相接。MR-IOV與SR-IOV相比,每個(gè)VH(Virtual Hierarchy,一個(gè)VH就是一個(gè)虛擬獨(dú)立的SR-IOV設(shè)備)擁有獨(dú)立的PCI Memory,IO,配置空間。如下圖是MR-IOV的作用,本來每個(gè)系統(tǒng)只有一個(gè)Host,兩個(gè)PCIe設(shè)備,但是有了MRA Switch之后,系統(tǒng)里面有2個(gè)Host,4個(gè)PCIe設(shè)備。
MR-IOV里有個(gè)重要概念:VH,Virtual Hirearchy:每個(gè)VH至少包含一個(gè)PCIe Switch,這個(gè)PCIe Switch是MRA Switch里面的一個(gè)虛擬組件。每個(gè)VH可以包含各種PCIe設(shè)備、MRA PCIe設(shè)備、或者PCIe-PCI橋的組合。如下圖,在MRA PCIe Switch中,可以有多個(gè)根端口Root Port,RP。
這樣,有了MR-IOV之后,軟件系統(tǒng)變成了下面這種,物理機(jī)之間也能相互通信,PCIe設(shè)備被多臺(tái)物理機(jī)共享。下圖中的SI就是虛擬機(jī)OS、VI就是虛擬機(jī)監(jiān)視器VMM。
【本文為51CTO專欄作者“移動(dòng)Labs”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】






























 
 
 



 
 
 
 