說一說虛擬化繞不開的IO半虛擬化
QEMU-KVM作為一個VMM提供了全虛擬化環(huán)境,guest不經(jīng)過任何修改就能運(yùn)行在KVM環(huán)境中。不過KVM在IO虛擬化方面,使用QEMU純軟件的方式來模擬IO設(shè)備,效率并不高。在KVM中,要想提高IO虛擬化的效率,就要使用半虛擬化的方式:virtio。
簡單介紹全虛擬化和半虛擬化
在全虛擬化 中,guest操作系統(tǒng)運(yùn)行在VMM之上,并不知道它已被虛擬化,不需要任何更改就可以工作。相反,在半虛擬化中,guest操作系統(tǒng)不僅知道它運(yùn)行在 VMM上,還需要做修改來對接VMM的代碼。
在全虛擬化中,VMM必須模擬設(shè)備硬件,盡管這種模擬很徹底很干凈,但它效率低代碼最復(fù)雜。在半虛擬化模式中,guest和 VMM共同合作,模擬更加高效。
IO全虛擬化使用QEMU軟件模擬
1.當(dāng)虛擬機(jī)進(jìn)行I/O操作時,根據(jù)《也談Intel的cpu虛擬化》我們知道,虛擬機(jī)通過VM exit將cpu控制權(quán)返回給VMM,從而陷入到root模式下的ring0內(nèi)的VMM,進(jìn)行”陷入模擬“。
2.將本次I/O請求的信息存放到IO共享頁,QEMU從IO共享頁讀取信息后由硬件模擬代碼來模擬出本次的IO操作,并調(diào)用內(nèi)核中的硬件驅(qū)動把IO請求發(fā)送到物理硬件,完成之后將結(jié)果放回到IO共享頁。
3.KVM模塊中的捕獲代碼讀取IO共享頁中的結(jié)果,把結(jié)果返回到guest。
4.通過VM entry,guest再次獲得cpu控制權(quán),根據(jù)IO返回的結(jié)果進(jìn)行處理。
說明:VMM和guest的IO信息共享不光IO共享頁一種,還可以使用DMA。QEMU不把IO結(jié)果放到IO共享頁中,而是通過DMA將結(jié)果直接寫到guest的內(nèi)存中去,然后通過KVM模塊告訴客戶機(jī)DMA操作已經(jīng)完成。
下面這張圖(來自網(wǎng)絡(luò))是軟件模擬IO的流程圖:
IO半虛擬化virtio
guest和host使用使用virtio前后端的技術(shù)減少了guest IO時的VM Exit(guest和host的上下文切換)并且使guest和host能并行處理IO來提高throughput和減少latency。但是IO的路徑并沒有比全虛擬化技術(shù)減少。下面是virtio的IO路徑:
guest在IO請求時,首先guest需要切換到host kernel,然后host kernel會切換到hyperisor來處理guest的請求,hypervisor通過系統(tǒng)調(diào)用將數(shù)據(jù)包發(fā)送到外部網(wǎng)絡(luò)后切換回host kernel,然后再切換回guest。這個長IO路徑和全虛擬化時相同的,只是減少了VM exit和VM entry。
vhost
為了解決virio的IO路徑太長的問題,vhost產(chǎn)生了。它是位于host kernel的一個模塊,用于和guest直接通信,所以數(shù)據(jù)交換就在guest和host kernel間進(jìn)行,減少了上下文的切換。vhost相對與virto架構(gòu),把virtio驅(qū)動后端驅(qū)動從用戶態(tài)放到了內(nèi)核態(tài)中(vhost的內(nèi)核模塊充當(dāng)virtiO后端驅(qū)動)
下面這張圖(來自redhat)描述了在virtio和vhost(vhost-net時vhost架構(gòu)中的網(wǎng)卡實現(xiàn))架構(gòu)下內(nèi)核的不同工作流程:
下面這張圖(來自intel)介紹了vhost工作原理:
vhost-user
vhost-user和vhost類似,只是使用一個用戶態(tài)進(jìn)程vhost-user代替了內(nèi)核中的vhost模塊。vhost-user進(jìn)程和Guset之間時通過共享內(nèi)存的方式進(jìn)行數(shù)據(jù)操作。vhost-user相對與vhost架構(gòu),把virtio驅(qū)動后端驅(qū)動從內(nèi)核態(tài)又放回到了用戶態(tài)中(vhost-user進(jìn)程充當(dāng)virtiO后端驅(qū)動)。
下面這張圖(來自intel)介紹了vhost-user的工作原理:
總結(jié)
io虛擬化經(jīng)歷了從全虛擬化io到半虛擬化virtio。半虛擬化的后端驅(qū)動又經(jīng)歷了從VMM中到內(nèi)核中,從內(nèi)核中到用戶空間中的過程。