I/O虛擬化
來源:程序員人生 發(fā)布時間:2014-11-17 08:48:49 閱讀次數(shù):3517次
note:這里主要記錄我對IO虛擬化的理解,希望這篇文章對想了解虛擬化IO的同學(xué)有點幫助。這是我在看論文[vale,a switched ethernet for virtual machines]的時候總結(jié)的有關(guān)io虛擬化技術(shù),概括性的和思考結(jié)果比較多,細(xì)節(jié)內(nèi)容比較少。
我們假定現(xiàn)在大部份的計算機(jī)服務(wù)都遷移到了虛擬化環(huán)境中(實際上是事實),帶來的主要好處是資源同享并減少開消。虛擬機(jī)也是需要訪問外圍裝備的,比如磁盤和網(wǎng)絡(luò)。即便在非虛擬化環(huán)境中訪問網(wǎng)絡(luò)也是很有挑戰(zhàn)性的技術(shù)(利用程序使用系統(tǒng)調(diào)用),所以到了虛擬機(jī)這1層面,訪問網(wǎng)絡(luò),要到達(dá)硬件的速度很困難。所以要怎樣處理虛擬化I/O呢?主要有3種方法來虛擬化I/O,分別是全虛擬化,半虛擬化和Direct I/O accsss。他們在處理guest和hypervisor通訊和hypervisor和host架構(gòu)上分別采取了不同的處理方式。
全虛擬化
最簡單的方法就是給guest操作系統(tǒng)1個虛擬網(wǎng)絡(luò)接口。然后由hypervisor攔截下虛擬機(jī)的Accesses (to critical resources),并且hypervisor中用1個模塊來摹擬網(wǎng)卡硬件的功能(emulator)。這類方法很直觀易懂,在歷史上來講,這也是第1種I/O虛擬化方式,最開始由VMware 和QEMU采用。
(這只是最基本的解釋了,至于說怎樣寫1個摹擬器?我沒寫過,感興趣的可以google~~)
當(dāng)hypervisor截取到guest的packet以后,如果要發(fā)送到網(wǎng)絡(luò)上(這里可以既包括內(nèi)部網(wǎng)絡(luò)也包括外部網(wǎng)絡(luò)),就需要使用host的網(wǎng)絡(luò)棧了,比如TCP/UDP sockets(封裝)。
全虛擬化看起來直觀易懂,很容易使用,環(huán)境配置簡單。只是摹擬的開消會很大,1般來講,那是1個非常龐大的系統(tǒng)(所以寫個摹擬器工作量很大……)。
半虛擬化
上面講了全虛擬化,和全虛擬化相對的就是半虛擬化,半虛擬化的意思就是說guest操作系統(tǒng)能夠感知到自己是虛擬機(jī)。那末對I/O系統(tǒng)來講,只要guest的驅(qū)動能夠和hypervisor進(jìn)行溝通,。不同的hypervisor使用不同的技術(shù)來實現(xiàn)半虛擬化。比如說xen,就是通過事件通道,授權(quán)表和同享內(nèi)存的機(jī)制來使得虛擬機(jī)中的驅(qū)動(前端驅(qū)動)和host中的驅(qū)動(后端驅(qū)動)來通訊。最后由裝備域的標(biāo)準(zhǔn)linux內(nèi)核來處理IO。
另外kvm使用virtio,和xen的半虛擬化網(wǎng)絡(luò)驅(qū)動原理差不多。還有就是比如VMware的Guest tools,和xen的半虛擬化機(jī)制應(yīng)當(dāng)也很相似,1通百通。
那末半虛擬化相對全虛擬化有甚么好處?雖然和全虛擬化1樣,都是使用軟件完成虛擬化工作,但是由于機(jī)制不1樣,這類方式由于不像摹擬器那末復(fù)雜,軟件處理起來不至于那末慢,所以有更高的帶寬,更好的性能。但是還是存在性能問題,依然達(dá)不到硬件的速度。
break:到此為止,提1個問題,為何軟件實現(xiàn)的性能不好?比如達(dá)不到有硬件支持(下面會提到)的速度?難道硬件支持就1定快,軟件就1定慢?能不能設(shè)計出1種軟件比有硬件支持的更快呢?(這個問題邊想邊繼續(xù)看吧,到文章的結(jié)尾處我會給出我的認(rèn)識)
Direct I/O Access
前面的兩種方式,不管是摹擬還是溝通方式,都需要guest和hypervisor的交互,而這里要講的這類方式是為了不guest和hypervisor的溝通,使得guest能夠直接將流量發(fā)到硬件上面。看起來很奇怪是否是,但是這類方式應(yīng)當(dāng)怎樣做?host或hypervisor怎樣將網(wǎng)卡的控制權(quán)轉(zhuǎn)移給host?有無1個網(wǎng)卡可以轉(zhuǎn)移給多個虛擬機(jī)使用呢?(這只是1點提示問題,你可能還可以想出更多的問題來。)為了解決這些問題,需要1套機(jī)制支持,這里主要表現(xiàn)在硬件的支持。
首先斟酌1個簡單的情形,將1個NIC分配給1個guest(host和其他guest都不能看到這個NIC),現(xiàn)在的方法是通過pci passthrough技術(shù)。現(xiàn)在1般1個網(wǎng)卡是1個pci裝備,當(dāng)系統(tǒng)辨認(rèn)這個網(wǎng)卡后,在內(nèi)存會分配1塊對應(yīng)的pci配置空間,為了支持pci passthrough,現(xiàn)代的cpu架構(gòu)會提供1種機(jī)制將這塊pci物理地址映照到guest操作系統(tǒng)的內(nèi)存。比如intel的vt-d和amd的iommu(cpu對虛擬化的硬件支持)。然后通過軟件比如,pci passthrough命令來使用1次這塊硬件,實現(xiàn)映照的功能。但是是否是1定要用到CPU的虛擬化支持呢,我想只要你牛逼,寫個有映照功能和隔離機(jī)制的軟件也能夠做到一樣的功能吧。
另外如果要將1個NIC分配給多個guest,我想就是SR-IOV技術(shù)了。就是將1個網(wǎng)卡虛擬出多個VF,然后將每一個VF通過pci passthrough分配給不同的guest。這里除cpu的虛擬化支持,比如intel的vt-d,也還需要網(wǎng)卡本身的虛擬化技術(shù),需要虛擬出多個vf功能,和郵箱機(jī)制等功能(我做不了硬件的虛擬化,只講功能需求)。
關(guān)于這3種方式,我的了解程度都不1樣。雖然3種我都用過。全虛擬化的方式采取摹擬器(寫1個摹擬器的難度太大,沒有嘗試過寫,也沒有讀過代碼);xen的半虛擬化機(jī)制看過源碼,調(diào)用它的api實現(xiàn)過1些功能。至于pci passthrough我曾使用82599網(wǎng)卡的SRIOV功能,將網(wǎng)卡虛擬化為多個vf,再將多個vf分配給多個虛擬機(jī)進(jìn)行實驗,這樣虛擬機(jī)的帶寬確切很高。
break:對那個問題,私以為軟件運(yùn)行的速度不1定比純硬件慢。軟件歸根結(jié)柢也是表現(xiàn)在cpu上運(yùn)行(推薦看看csapp《深入理解計算機(jī)系統(tǒng)》)。一樣1個功能,軟件的不同設(shè)計致使運(yùn)行的速度極可能不同。有的快,有的慢。當(dāng)軟件的設(shè)計很完善的時候,這個時候影響軟件運(yùn)行的瓶頸就是CPU頻率和內(nèi)存帶寬。對實現(xiàn)交換機(jī)功能這樣的軟件,如果這個交換機(jī)設(shè)計公道,基本上能到達(dá)cpu的頻率,如果對應(yīng)的物理網(wǎng)卡的帶寬小于這個值,那末這個軟件交換機(jī)相對物理網(wǎng)卡而言,設(shè)計很棒,我們會覺得虛擬機(jī)的網(wǎng)絡(luò)IO性能真的是相當(dāng)棒。
另外如果網(wǎng)卡帶寬大于cpu主頻或內(nèi)存帶寬的時候,此時如果交換機(jī)軟件也設(shè)計相當(dāng)棒的時候,瓶頸就表現(xiàn)在cpu主頻上。
p.s.由于比較懶,沒有畫圖,希望不影響理解,有些觀點沒有展開,細(xì)節(jié)講的過少,有些沒有重點。會漸漸修改補(bǔ)充,歡迎評論與建議:-I
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈