基礎知識:虛擬機的構成和CPU虛擬化
回憶一下主要內容:
1、 計算虛擬化包括了“一虛多”和“多虛一”;現在階段硬件能力過盛,一虛多”成為主流。
2、 裸金屬架構更適合部署在資源池內如VMWARE、CitrixXenServerv、RHEV,適合企業使用,寄居架構適合單機,適合個人折騰。
3、 全虛擬化和半虛擬化各有優缺點。KVM發展迅猛,XEN開始走入暮年。
其實,對于應用來看,虛擬機就是一臺X86服務器。所以能運行在X86服務器上的應用,也能運行在虛擬機上。虛擬機的構成和物理機也完全一致,主要是CPU、內存、硬盤,輸入、輸出設備。但是虛擬機的這些“構件”都是虛擬或共享的,都可以由所在的物理機提供出來的,但是為了實現虛擬機的遷移功能,虛擬機的硬盤***由和這臺物理服務器相連的共享存儲提供。
CPU虛擬化技術主要分為兩大部分。一是將CPU核運行時間進行切片,通過VMM(虛擬化層管理)調度,將CPU運行時間片分配、調度到不同的虛擬機上,當虛擬機運行完成或超時,將這個時間片控制權交回VMM,再進行下一次的調度。分配給應用的vCPU不是固定在某個CPU上,它只是可以執行命令的一個或幾個時間片,這一次分配在這些物理核上,下一次分配在另外一些核上。通過時間片,可以提高物理CPU的利用率。原來物理機的CPU好比是私家車,上下班的時候在路上跑,平時都停在路邊;CPU被時間切片被調度后就像加入“優步”的私家車,一直在路上跑,有需求就搭客運營,提高了利用率。
二是CPU需要“欺騙”虛擬機上的操作系統(guest OS)執行敏感指令。CPU是通過Ring級別來進行訪問控制的,級別共分4層,RING0,RING1,RING2,RING3。RING0層擁有***的權限,是個操作系統使用的,可以訪問所有層的數據,而其他驅動程序位于RING1、RING2層,RING3可以運行應用。每一層只能訪問本層以及權限更低層的數據。如果普通應用程序企圖執行RING0指令,則會認為“非法指令”錯誤信息。但是在虛擬機內,RING0被比guest OS更“低級”的VMM所霸占,只能運行在RONG1。而操作系統的有些指令一定要在RING0執行的,這些指令叫做敏感指令。RING0已經被“控制者”霸占,在執行浙西敏感指令時候就會出現異常而“陷入”,執行一定會出現異常。如何處理“陷入”的敏感指令就是CPU虛擬化需要干的事情。
解決這個沖突,有2種方法:軟件模擬和硬件支持(Intel VT-x和AMD SVM)。
軟件模擬的方式就是當這些“陷入”的指令被送到VMM層進行模擬并執行,并將執行的結果返回到虛擬機的guest OS。模擬執行的方法有很多種,典型的有解釋執行和二進制執行。軟件模擬的方法效率相對硬件支持要低,所以在采購資源池的X86服務器都要求采購帶有Intel VT-x和AMD SVM標志的64位服務器,因為現在CPU硬件就可以解決這個問題。
以Intel VT-x為例,VT-x提供了一套稱作VMX的新的工作模式,工作在該模式下的處理器又具有兩類操作模式:VMX root operation和VMX non-root operation。VMM占據VMX root operation,而guest OS使用VMX non-root operation。對操作系統來說,VMX non-root operation模式與傳統的x86處理器兼容,***的差別在于當虛擬機執行一些訪問全局資源的指令時將導致虛擬機退出操作(VM-Exit),從而使VMM獲得控制權,以便對訪問全局資源的指令進行模擬。然后,VMM可以通過虛擬機進入操作(VM-Entry)使虛擬機重新獲得控制權。
虛擬化的CPU和物理機的CPU還是有一定的差別。就像上面的例子,物理機的CPU是固定被操作系統占用的,用和不用,都是被一個操作系統控制的,所有CPU配置越大,不會影響應用的執行,只是CPU的利用率越來越低。但是虛擬CPU就不一樣了,當你配置的CPU的核數越多,本質上是等待相應核數的時間片,而且VMM的調度程序一定要等到配置的vCPU的核數全部到位后,才能執行,所以在超配的情況下,核數越多,等待的時間越長。在虛擬CPU下,配置的原則是在滿足需求的情況下CPU數量越少越好。也可以再看一下我以前寫的文章《基礎知識——CPU的分配原則》。
還有一個需要注意的,虛擬機的時鐘會比實際的慢。因為計算機的時間是通過CPU的主頻計算出來的,虛擬機的時間也是靠vCPU計算出來的,而vCPU經常被調度到其他虛擬機上,“時間被偷走了”,虛擬機上的時間走的慢。所以虛擬機***連接時間同步服務器。