眾所周知,虛擬化技術(shù)旨在將有限的物理資源(CPU蔼夜、內(nèi)存等)抽象成更多份的虛擬資源供上層應(yīng)用使用兼耀。最常用的領(lǐng)域有云服務(wù)提供商,SDN/NFV求冷,比如:在一臺(tái)物理服務(wù)器上運(yùn)行成百上千的虛擬機(jī)瘤运,并將單個(gè)虛擬機(jī)出租給不同用戶。
虛擬化的實(shí)現(xiàn)主要由三項(xiàng)關(guān)鍵技術(shù)構(gòu)成:CPU虛擬化匠题、內(nèi)存虛擬化和I/O虛擬化拯坟。其中CPU和內(nèi)存虛擬化多由硬件支持實(shí)現(xiàn),如intel VT-x韭山、VT-d等IA架構(gòu)擴(kuò)展郁季,還有EPT頁(yè)表等。而I/O虛擬化則沒(méi)有CPU和內(nèi)存虛擬化那么統(tǒng)一钱磅,由于其大量基于軟件實(shí)現(xiàn)梦裂,因此發(fā)展過(guò)程中,衍生出了好多種性能盖淡、靈活性各異的方案年柠。我們通常所說(shuō)的全虛擬化和半虛擬化一般都是在網(wǎng)絡(luò)I/O虛擬化中體現(xiàn)的差異最大。
1.網(wǎng)絡(luò)I/O全虛擬化
該方式采用軟件模擬真實(shí)硬件設(shè)備褪迟。一個(gè)設(shè)備的所有功能或者總線結(jié)構(gòu)(如設(shè)備枚舉冗恨、識(shí)別、中斷和DMA)等都可以在宿主機(jī)中模擬味赃。而對(duì)客戶機(jī)而言看到的是一個(gè)功能齊全的“真實(shí)”的硬件設(shè)備掀抹。其實(shí)現(xiàn)上通常需要宿主機(jī)上的軟件配合截取客戶機(jī)對(duì)I/O設(shè)備的各種請(qǐng)求,通過(guò)軟件去模擬心俗。比如:QEMU/KVM虛擬化中QEMU就可以通過(guò)模擬各種類型的網(wǎng)卡傲武。
這種方式的好處是靈活,不需要專有驅(qū)動(dòng),因此能實(shí)現(xiàn)既不需要修改客戶機(jī)谱轨、也無(wú)需考慮底層硬件戒幔,對(duì)客戶機(jī)透明地使用網(wǎng)絡(luò)資源。但是缺點(diǎn)在于土童,很多中斷信號(hào)的處理需要讓客戶機(jī)感覺(jué)到自己運(yùn)行在一個(gè)“真實(shí)環(huán)境”诗茎,因此QEMU軟件模擬的很底層,效率低下献汗。
2.網(wǎng)絡(luò)I/O半虛擬化
在這種虛擬化中敢订,客戶機(jī)操作系統(tǒng)能夠感知到自己是虛擬機(jī),I/O的虛擬化由前端驅(qū)動(dòng)和后端驅(qū)動(dòng)共同模擬實(shí)現(xiàn)罢吃。在客戶機(jī)中運(yùn)行的驅(qū)動(dòng)程序稱之為前端楚午,在宿主機(jī)上與前端通信的驅(qū)動(dòng)程序稱之為后端。前端發(fā)送客戶機(jī)請(qǐng)求給后端尿招,后端驅(qū)動(dòng)處理完這些請(qǐng)求后再返回給前端矾柜。而在不同的虛擬化機(jī)制中,這一過(guò)程的實(shí)現(xiàn)手段也有所區(qū)別就谜,例如:Xen中的共享內(nèi)存怪蔑、授權(quán)表,KVM中的virtio丧荐。它相比于全虛擬化的好處在于缆瓣,不再需要宿主機(jī)上專門的軟件去模擬實(shí)現(xiàn)I/O請(qǐng)求,因此不會(huì)有VM-exit虹统,性能會(huì)有所提升弓坞。
半虛擬化中的virtio是IBM于2005年提出的一套方案[1],經(jīng)過(guò)了十多年的發(fā)展车荔,其驅(qū)動(dòng)現(xiàn)在基本已經(jīng)被主流的操作系統(tǒng)接納編入內(nèi)核渡冻,因此virtio也已經(jīng)成為半虛擬化的一套事實(shí)標(biāo)準(zhǔn)。其主要結(jié)構(gòu)如下圖所示忧便,前后端驅(qū)動(dòng)通過(guò)虛擬隊(duì)列通信菩帝,虛擬隊(duì)列中又包含used ring、avail ring和desc ring茬腿。其具體接口標(biāo)準(zhǔn)參見(jiàn)IBM網(wǎng)站https://www.ibm.com/developerworks/cn/linux/1402_caobb_virtio/
,這里不做過(guò)多介紹宜雀。
以virtio為標(biāo)準(zhǔn)的半虛擬化在其追尋性能的道路上也歷經(jīng)了三個(gè)演進(jìn)方案:virtio-net切平、vhost-net和vhost-user。
virtio-net
如下圖所示辐董,KVM負(fù)責(zé)為程序提供虛擬化硬件的內(nèi)核模塊悴品,QEMU利用KVM模擬VM運(yùn)行環(huán)境,包括處理器和外設(shè)等;Tap是內(nèi)核中的虛擬以太網(wǎng)設(shè)備苔严,可以理解為內(nèi)核bridge定枷。
當(dāng)客戶機(jī)發(fā)送報(bào)文時(shí),它會(huì)利用消息通知機(jī)制通知KVM届氢,并退出到用戶空間的QEMU進(jìn)程欠窒,然后由QEMU對(duì)Tap設(shè)備進(jìn)行讀寫(xiě)(需要說(shuō)明的是,QEMU是VM運(yùn)行的主進(jìn)程退子,因此才有退出這一說(shuō))岖妄。
在該模型中,宿主機(jī)寂祥、客戶機(jī)和QEMU存在大量的上下文切換荐虐,以及頻繁的數(shù)據(jù)拷貝、CPU特權(quán)級(jí)切換丸凭,因此性能差強(qiáng)人意福扬。其函數(shù)調(diào)用路徑如下:
兩次報(bào)文拷貝導(dǎo)致性能瓶頸,另外消息機(jī)制處理過(guò)程太長(zhǎng):報(bào)文到達(dá)Tap時(shí)內(nèi)核通知QEMU惜犀,QEMU利用IOCTL向KVM請(qǐng)求中斷铛碑,KVM發(fā)送中斷到客戶機(jī)。
vhost-net
針對(duì)virtio-net的優(yōu)化是把QEMU從消息隊(duì)列的處理中解放出來(lái)向拆,直接在宿主機(jī)實(shí)現(xiàn)了一個(gè)vhost-net內(nèi)核模塊亚茬,專門做virtio的后端,以此減少上下文切換和數(shù)據(jù)包拷貝浓恳。
其結(jié)構(gòu)如下圖所示刹缝,以報(bào)文接收過(guò)程為例。數(shù)據(jù)通路直接從Tap設(shè)備接收數(shù)據(jù)報(bào)文颈将,通過(guò)vhost-net內(nèi)核模塊把報(bào)文拷貝到虛擬隊(duì)列中的數(shù)據(jù)區(qū)梢夯,從而使客戶機(jī)接收?qǐng)?bào)文。消息通路是當(dāng)報(bào)文從Tap設(shè)備到達(dá)vhost-net時(shí)晴圾,通過(guò)KVM向客戶機(jī)發(fā)送中斷颂砸,通知客戶機(jī)接收?qǐng)?bào)文。
在數(shù)據(jù)通路層面死姚,vhost-net減少了內(nèi)存拷貝人乓,但是由于其后端運(yùn)行在內(nèi)核態(tài),仍然存在性能瓶頸都毒。
vhost-user
vhost-user是采用DPDK用戶態(tài)后端實(shí)現(xiàn)的高性能半虛擬化網(wǎng)絡(luò)I/O色罚。其實(shí)現(xiàn)機(jī)理與vhost-net類似,但是整個(gè)后端包括ovs(openvswitch) datapath全部置于用戶空間账劲,更好的利用DPDK加速戳护。
然而由于OVS進(jìn)程是用戶態(tài)進(jìn)程金抡,無(wú)權(quán)限訪問(wèn)客戶機(jī)內(nèi)存,因此需要使用共享內(nèi)存技術(shù)腌且,提前通過(guò)socket通信在客戶機(jī)啟動(dòng)時(shí)梗肝,告知OVS自己的內(nèi)存布局和virtio中虛擬隊(duì)列信息等。這樣OVS建立起對(duì)每個(gè)VM的共享內(nèi)存铺董,便可以在用戶態(tài)實(shí)現(xiàn)上述vhost-net內(nèi)核模塊的功能巫击。
vDPA加速的vhost-user
在DPDK加速的vhost-user方案中,還有一次內(nèi)存拷貝柄粹。半虛擬化中僅剩的性能瓶頸也就在這一次拷貝中喘鸟,intel推出了一款硬件解決方案,直接讓網(wǎng)卡與客戶機(jī)內(nèi)的virtio虛擬隊(duì)列交互驻右,把數(shù)據(jù)包DMA到客戶機(jī)buffer內(nèi)什黑,在支持了virtio標(biāo)準(zhǔn)的基礎(chǔ)上實(shí)現(xiàn)了真正意義上的零拷貝。
在18.05以后的DPDK版本中堪夭,已經(jīng)有支持vDPA的feature供選擇了愕把。
3.I/O透?jìng)?/h1>
對(duì)于性能的追求是永無(wú)止境的,除了上述全虛擬化森爽、半虛擬化兩種I/O虛擬化以外恨豁,還有一種非常極端的做法。讓物理設(shè)備穿過(guò)宿主機(jī)爬迟、虛擬化層橘蜜,直接被客戶機(jī)使用,這種方式通掣杜唬可以獲取近乎native的性能计福。
這種方式主要缺點(diǎn)是:
1.硬件資源昂貴且有限类垦。
2.動(dòng)態(tài)遷移問(wèn)題呈枉,宿主機(jī)并不知道設(shè)備的運(yùn)行的內(nèi)部狀態(tài)耗绿,狀態(tài)無(wú)法遷移或恢復(fù)溉苛。
DPDK針對(duì)這兩點(diǎn)問(wèn)題都做了一定程度的解決。另外還提供了一種基于硬件的PF(物理功能)轉(zhuǎn)VF(虛擬功能)匙睹,這相當(dāng)于在網(wǎng)卡層面上就已經(jīng)有了虛擬化的概念灵临,把一個(gè)網(wǎng)卡的PF虛擬成幾十上百個(gè)VF坐求,這樣可以把不同的VF透?jìng)鹘o不同的虛擬機(jī)潮瓶,這就是我們最熟悉的SR-IOV陶冷。
對(duì)于I/O透?jìng)髟谔摂M化環(huán)境中最嚴(yán)重的問(wèn)題不是性能了,而是靈活性毯辅“0龋客戶機(jī)和網(wǎng)卡之間沒(méi)有任何軟件中間層過(guò)度,也就意味著不存在負(fù)責(zé)交換轉(zhuǎn)發(fā)功能的I/O棧悉罕,也就不會(huì)有軟件交換機(jī)赤屋。那么如果要想有一臺(tái)server內(nèi)部的軟件交換功能如何實(shí)現(xiàn)呢。業(yè)界的主要做法是把交換功能完全下沉到網(wǎng)卡壁袄,直接在智能網(wǎng)卡上實(shí)現(xiàn)虛擬交換功能类早。這又帶來(lái)了另一個(gè)問(wèn)題,成本和性能的權(quán)衡嗜逻。
而DPDK 18.05以后的版本似乎也解決了這一靈活性問(wèn)題涩僻,為了充分發(fā)掘標(biāo)準(zhǔn)網(wǎng)卡(區(qū)別于智能網(wǎng)卡)在flow(流)層面上的功能,推出了VF representer栈顷∧嫒眨可以直接將OVS上的流表規(guī)則下發(fā)到網(wǎng)卡上,實(shí)現(xiàn)網(wǎng)卡在VF之間的交換功能萄凤,這樣就實(shí)現(xiàn)了高效靈活的虛擬化網(wǎng)絡(luò)配置室抽。
引用:
全虛擬化、半虛擬化和I/O透?jìng)髦黧w觀點(diǎn)來(lái)自《深入淺出DPDK》
[1] Russell R . virtio : Towards a De-Facto Standard For Virtual I/O Devices[M]. ACM, 2008.
圖引用:
圖1 引用自 IBM developer https://www.ibm.com/developerworks/cn/linux/1402_caobb_virtio/
圖2靡努、4坪圾、5 引用自 “Accelerating the Path to the Guest - Maryam Tahhan and Kevin Traynor, Intel”
圖6 引用自 KVM forum 2017 “virtio: vhost Data Path Acceleration towards NFV Cloud - Cunming Liang, Intel”
圖7 引用自 DPDK官網(wǎng)文檔
https://doc.dpdk.org/guides/prog_guide/switch_representation.html?highlight=representer