NFV關(guān)鍵技術(shù):計算虛擬化概述
Labs 導讀
所謂計算虛擬化,從狹義角度可理解為對單個物理服務器的虛擬化,主要包括對服務器上的CPU、內(nèi)存、I/O設(shè)備進行虛擬化,目的就是實現(xiàn)多個虛擬機能各自獨立、相互隔離地運行于一個服務器之上。從廣義角度還可延伸到云資源池下,各類資源池組網(wǎng)場景下的CPU、內(nèi)存、I/O設(shè)備等資源進行整合、抽象和虛擬化。
1、服務器虛擬化平臺概念回顧
在上一篇文章《虛擬化基礎(chǔ)》中,我們介紹虛擬化基礎(chǔ)的一些基本概念,這里我們按照服務器平臺虛擬化后的一個分層結(jié)構(gòu)來簡單回顧下。如下:
一個完整的服務器虛擬化平臺從下到上包括以下幾個部分:
- 底層物理資源:包括網(wǎng)卡、CPU、內(nèi)存、存儲設(shè)備等硬件資源,一般將包含物理資源的物理機稱為宿主機(Host)。
- 虛擬機監(jiān)控器(Virtual Machine Monitor,VMM):VMM是位于虛擬機與底層硬件設(shè)備之間的虛擬層,直接運行于硬件設(shè)備之上,負責對硬件資源進行抽象,為上層虛擬機提供運行環(huán)境所需資源,并使每個虛擬機都能夠互不干擾、相互獨立地運行于同一個系統(tǒng)中。
- 抽象化的虛擬機硬件:即虛擬層呈現(xiàn)的虛擬化的硬件設(shè)備。虛擬機能夠發(fā)現(xiàn)哪種硬件設(shè)施,完全由VMM決定。虛擬設(shè)備可以是模擬的真實設(shè)備,也可以是現(xiàn)實中并不存在的虛擬設(shè)備,如VMware的vmxnet網(wǎng)卡。
- 虛擬機:相對于底層提物理機,也稱為客戶機(Guest)。運行在其上的操作系統(tǒng)則稱為客戶機操作系統(tǒng)(Guest OS)。每個虛擬機操作系統(tǒng)都擁有自己的虛擬硬件,并在一個獨立的虛擬環(huán)境中執(zhí)行。通過VMM的隔離機制,每個虛擬機都認為自己作為一個獨立的系統(tǒng)在運行。
同時,在上一篇文章《虛擬化基礎(chǔ)》中,我們提到過Hypervisor就是VMM。其實,這個說法并不準確,至少在VMware的虛擬化解決方案中不準確,在VMware的ESX產(chǎn)品架構(gòu)中,VMM和Hypervisor還是有一定區(qū)別的,如下圖所示。
Hypervisor是位于虛擬機和底層物理硬件之間的虛擬層,包括boot loader、x86 平臺硬件的抽象層,以及內(nèi)存與CPU調(diào)度器,負責對運行在其上的多個虛擬機進行資源調(diào)度。而VMM則是與上層的虛機一一對應的進程,負責對指令集、內(nèi)存、中斷與基本的I/O設(shè)備進行虛擬化。當運行一個虛擬機時,Hypervisor中的vmkernel會裝載VMM,虛擬機直接運行于VMM之上,并通過VMM的接口與Hypervisor進行通信。而在KVM和Xen架構(gòu)中,虛擬層都稱為Hypervisor,也就是VMM=Hypervisor。
判斷一個VMM能否有效確保服務器系統(tǒng)實現(xiàn)虛擬化功能,必須具備以下三個基本特征:
- 等價性(Equivalence Property):一個運行于VMM控制之下的程序(虛擬機),除了時序和資源可用性可能不一致外,其行為應該與相同條件下運行在物理服務器上的行為一致。
- 資源可控性(Resource Control Property):VMM必須能夠完全控制虛擬化的資源。
- 效率性(Efficiency Property):除了特權(quán)指令,絕大部分機器指令都可以直接由硬件執(zhí)行,而無需VMM干涉控制。
上述三個基本特征也是服務器虛擬化實現(xiàn)方案的指導思想。
2、x86平臺虛擬化面臨的問題與挑戰(zhàn)
基于x86的操作系統(tǒng)在一開始就被設(shè)計為能夠直接運行在裸機硬件環(huán)境之上,所以自然擁有整個機器硬件的控制權(quán)限。為確保操作系統(tǒng)能夠安全地操作底層硬件,x86平臺使用了特權(quán)模式和用戶模式的概念對內(nèi)核程序與用戶應用程序進行隔離。在這個模型下,CPU提供了4個特權(quán)級別,分別是Ring0、1、2和3。如下圖所示:
Ring 0是最高特權(quán)級別,擁有對內(nèi)存和硬件的直接訪問控制權(quán)。Ring 1、2和3權(quán)限依次降低, 無法執(zhí)行操作訥河系統(tǒng)級別的指令集合。相應的,運行于Ring 0的指令稱為“特權(quán)指令”;運行于其他級別的稱為“非特權(quán)指令”。常見的操作系統(tǒng)如Linux與Windows都運行于Ring 0,而用戶級應用程序運行于Ring 3。如果低特權(quán)級別的程序執(zhí)行了特權(quán)指令,會引起“ 陷入”(Trap)內(nèi)核態(tài),并拋出一個異常。
當這種分層隔離機制應用于虛擬化平臺,為了滿足VMM的“資源可控” 特征,VMM必須處于Ring 0級別控制所有的硬件資源,并且執(zhí)行最高特權(quán)系統(tǒng)調(diào)用。而虛擬機操作系統(tǒng)Guest OS則要被降級運行在Ring 1級別,故Guest OS在執(zhí)行特權(quán)指令時都會引起”陷入“。如果VMM能夠正常捕獲異常,模擬Guest OS發(fā)出的指令并執(zhí)行,就達到了目的。這就是IBM的Power系列所采用的特權(quán)解除和陷入模擬的機制,支持這種特性的指令集合通常被認為是“可虛擬化的”。
但是...但是...但是...x86平臺的指令集是不虛擬化的。為什么這么說?首先我們來看下x86平臺指令集分類,x86平臺的指令集大致分為以下4類:
- 訪問或修改機器狀態(tài)的指令。
- 訪問或修改敏感寄存器或存儲單元的指令, 比如訪問時鐘寄存器和中斷寄存器。
- 訪問存儲保護系統(tǒng)或內(nèi)存、地址分配系統(tǒng)的指令(段頁之類)。
- 所有I/O指令。
其中,1~4在x86平臺都屬于敏感指令,第1、4類指令屬于敏感指令中的特權(quán)指令,由操作系統(tǒng)內(nèi)核執(zhí)行,Guest OS在執(zhí)行兩類指令時,因為不處于Ring 0級別,所以會陷入,并拋出異常,這個異常會被VMM捕獲,然后模擬Gust OS去執(zhí)行,并將執(zhí)行結(jié)果返回給Guest OS。到此為止,一切都OK。但是,第2、3類指令屬于非特權(quán)指令,可以由應用程序調(diào)用,也就是可以在Ring 3級別執(zhí)行,并調(diào)用Guest OS內(nèi)核進程來完成。當應用程序調(diào)用這些指令時,由于要修改內(nèi)存和內(nèi)部寄存器,這些狀態(tài)修改需要由Guest OS完成,而Guse OS此時運行在Ring 1級別,雖然也會發(fā)生陷入,但是不會拋出異常,這樣VMM就捕獲不到,也就無法模擬完成。因此,當Guest OS執(zhí)行這些指令就會導致虛擬機狀態(tài)異常,甚至影響服務器的狀態(tài)。在x86平臺下,這類指令共有19個,我自己稱之為x86平臺敏感指令中的邊界指令。
就是因為x86平臺指令集有上述缺陷,所以為了計算虛擬化技術(shù)在x86平臺應用,各大虛擬化廠商推出了五花八門的虛擬化技術(shù),其目的都是圍繞“如何捕獲模擬這19條邊界指令”這一命題來設(shè)計。在很長一段時間,都是通過軟件的方式來解決這個問題,其中包括無需修改內(nèi)核的全虛擬化與需要修改內(nèi)核的半虛擬化。盡管半虛擬化要求修改Guest OS內(nèi)核的方式在一定程度上并不滿足“ 等價性”要求,但是在性能上卻明顯優(yōu)于全虛擬化。直到2005年Intel與AMD公司分別推出了VT-d與AMD-V,能夠在芯片級別支持全虛擬化時,虛擬化技術(shù)才得到徹底完善,這就是現(xiàn)在稱之為的硬件輔助虛擬化技術(shù)。
3、x86平臺計算虛擬化解決方案
3.1 全虛擬化
全虛擬化(Full Virtualization)與半虛擬化(Para- Virtualization)的劃分,是相對于是否修改Guest OS而言的。如下圖所示,全虛擬化通過一層能夠完整模擬物理硬件環(huán)境的虛擬軟件,使得Guest OS與底層物理硬件徹底解耦。因此,Guest OS無需任何修改,虛擬化的環(huán)境對其完全透明,也就是說在全虛方案中,虛擬機感知不到自己處于虛擬化環(huán)境中,認為自己一直運行在物理硬件上。如下圖所示:
在實現(xiàn)上,通常是結(jié)合特權(quán)指令的二進制翻譯機制與一般指令的直接執(zhí)行的方式。具體來說, 對于Guest OS發(fā)出的特權(quán)指令和邊界指令,VMM會進行實時翻譯,并緩存結(jié)果(目的是提高虛擬化性能),而對于一般級別的指令,則無需VMM干涉,可以直接在硬件上執(zhí)行。異常-捕獲-模擬的過程如下圖所示:
由于虛擬化環(huán)境對Guest OS是完全透明的,全虛擬化模式對于虛擬機的遷移以及可移植性是最佳解決方案,虛擬機可以無縫地從虛擬環(huán)境遷移到物理環(huán)境中。但是,軟件模擬實現(xiàn)的全虛擬化無疑會增加VMM的上下文切換,因為這種方案實現(xiàn)的虛擬機性能不如半虛擬化方案。VMware的ESX系列產(chǎn)品 和Workstations系列產(chǎn)品是全虛擬化技術(shù)的典型產(chǎn)品。
3.2 半虛擬化如前所述,x86平臺上一直存在一些Ring 3級別可以執(zhí)行的邊界指令,盡管全虛擬化模式通過實時譯這些特殊指令解決了這一問題,但是實現(xiàn)開銷較大,性能并不如在實際物理機上運行。為了改善性能,半虛擬化技術(shù)應運而生, “Para-Virtualization” 可理解為通過某種輔助的方式實現(xiàn)虛擬化。半虛擬化的解決方案如下圖所示。
半虛擬化在Guest OS和虛擬層之間增加了一個特殊指令的過渡模塊,通過修改Guest OS內(nèi)核,將執(zhí)行特權(quán)指令和邊界指令替換為對虛擬層進行hypercall的調(diào)用方式來達到目的。同時,虛擬層也對內(nèi)存管理、中斷處理、時間同步提供了hypercall的調(diào)用接口。Hypercall調(diào)用過程如下圖所示:
通過這種方式,虛擬機運行的性能得以顯著提升。但是,對于某些無法修改內(nèi)核的操作系統(tǒng),比如:Windows,則不能使其運行于半虛擬化環(huán)境中。而且,由于需要修改Guest OS內(nèi)核,無法保證虛擬機在物理環(huán)境與虛擬環(huán)境之間的透明切換。開源項目Xen和華為6.3版本之前的虛擬化解決方案Fusion Compute就是通過修改Linux內(nèi)核以及提供I/O虛擬化操作的Domain 0的特殊虛擬機,使得運行于虛擬化環(huán)境上的虛擬機性能可以接近運行于物理環(huán)境的性能,屬于半虛擬化技術(shù)方案的典型產(chǎn)品。但是,隨著業(yè)務規(guī)模的增大,特殊虛機Domain 0是這種解決方案擴展性和性能方面的瓶頸。
3.3 硬件輔助虛擬化所謂“解鈴還須系鈴人”,針對敏感指令引發(fā)的一系列虛擬化問題,處理器硬件廠商最終給出了自己的解決方案。2005年Intel與AMD公司都效法IBM大型機虛擬化技術(shù)分別推出VT-x和AMD-V技術(shù)。如下圖所示:
第一代VT-x與AMD-V都試圖通過定義新的運行模式,使Guest OS恢復到Ring 0,而讓VMM運行在比Ring 0低的級別(可以理解為Ring -1)。比如:Intel公司的VT-x解決方案中,運行于非根模式下的Guest OS可以像在非虛擬化平臺下一樣運行于Ring 0級別,無論是Ring 0發(fā)出的特權(quán)指令還是Ring 3發(fā)出的敏感指令都會被陷入到根模式的虛擬層。VT-x解決方案具體如下圖所示:
VT-x與AMD-V推出之后,完美解決解決x86平臺虛擬化的缺陷,且提升了性能,所以各個虛擬化廠商均快速開發(fā)出對應的產(chǎn)品版本,用于支持這種技術(shù)。比如:KVM-x86、Xen 3.0與VMware ESX 3.0之后的虛擬化產(chǎn)品。隨后Intel和AMD在第二代硬件輔助虛擬化技術(shù)中均推出了針對I/O的硬件輔助虛擬化技術(shù)VT-d和IOMMU。
總結(jié):x86平臺下的三種虛擬化技術(shù),都是圍繞x86在虛擬化上的一些缺陷產(chǎn)生的。下圖對三種虛擬化技術(shù)進行了比較。
從圖中可以看出,全虛擬化與半虛擬化的Guest OS的特權(quán)級別都被壓縮在Ring 1中,而硬件虛擬化則將Guest OS恢復到了Ring 0級別。在半虛擬化中,Guest OS的內(nèi)核經(jīng)過修改,所有敏感指令和特權(quán)指令都以Hypercall的方式進行調(diào)用,而在全虛擬化與硬件虛擬化中,則無需對Guest OS進行修改。全虛擬化中對于特權(quán)指令和敏感指令采用了動態(tài)二進制翻譯的方式,而硬件虛擬化由于在芯片中增加了根模式的支持,并修改了敏感指令的語義,所有特權(quán)指令與敏感指令都能夠自動陷入到根模式的VMM中。
【本文為51CTO專欄作者“移動Labs”原創(chuàng)稿件,轉(zhuǎn)載請聯(lián)系原作者】



































