(ZZ) 剖析系统虚拟化(4)——VMware ESX架构介绍
上篇文章已經向大家介紹了VMware vSphere,而本篇將繼續把重點放在vSphere身上,并向介紹大家vSphere之核心ESX的架構,雖然關于ESX架構的公開資料較少,但是基于這些已公開的資料,并加上我的一些實際經驗,我覺得還是能對ESX的架構有一個大致的描述,下圖為ESX的架構:
圖1. ESX的架構圖(點擊可看大圖)(參【2】)
ESX主要可被分為兩部分:其一是用于提供管理服務的Service Console,其二是ESX的核心,也是主要提供虛擬化能力的VMKernel。
Service Console
簡單的來說,Service Console就是一個簡化版Redhat Enterprise OS。雖然其不能實現任何虛擬化功能,但是對這個ESX架構而言,它卻是一個不可分割的一部分。主要有五個方面功能:
注:雖然Service Console提供了許多功能,但因為其本身資源所限的原因(關于這點,我曾經和一位VMware工程師有過聊天,好像整個Service Console大概只能占有280MB內存和少量的I/O),所以不適合在Service Console中執行一些重量級的任務,比如:上傳或者復制虛擬磁盤(Virtual Disk)。
VMKernel
VMKernel是由VMware開發的基于POSIX協議的操作系統,它提供了很多在其它操作系統中也能找到的功能,比如,創建和管理進程,信號(Signal),文件系統和多線程等。但它是為運行多個虛擬機而“度身定做”的。它的核心功能是資源進行虛擬化。下面將通過CPU,內存和I/O這三個方面,來講解VMKernel是如何實現虛擬化的。
CPU
在CPU方面,ESX使用了在第二篇提到的兩個全虛擬化技術:優先級壓縮(Ring Compression)和二進制代碼翻譯(Binary Translation)。
優先級壓縮,指的是為了讓VMKernel獲得所有物理資源的控制權,比如CPU。這就需要讓VMKernel運行在Ring 0,在其上面的虛擬機內核代碼是運行在Ring 1,而虛擬機的用戶代碼只能運行在Ring 3上。這種做法不僅能讓VMKernel安全地控制所有的物理資源,而且能讓VMKernel截獲部分在虛擬機上執行的特權指令,并對其進行虛擬化。
二進制代碼翻譯,雖然上面的優先級壓縮這個技術已經處理了很多特權指令引發的異常情況,但是由于X86架構在初始設計方面并沒有考慮到虛擬化這個需求,所以有很多X86特權指令成了優先級壓縮的漏網之魚,雖然通過傳統的Trap-Emulation技術也能處理這些指令,但是由于其不僅需要花時間觀測有潛在影響的指令,而且還要監視那些非常普通的指令,導致Trap-Emulation的效率非常低,所以VMware引進了二進制代碼翻譯這個技術,這個技術能讓那些非常普通的指令直接執行,不干涉,并提供接近物理機的速度,但會掃描并修改那些有嫌疑的代碼,使其無法對虛擬機造成錯誤的影響。由于大多數代碼都不屬于有嫌疑的,所以二進制代碼翻譯的效率遠勝Trap-Emulation。還有經過VMware長達十年的調優,使得二進制代碼翻譯這個技術越發優秀。
接下來,談一下的VMware的二進制代碼翻譯技術的特點:
對于CPU虛擬化而言,只有上面這兩種技術是遠遠不夠的,還需要調度技術,也就是需要CPU調度器(Scheduler)。但是CPU的調度器和常見操作系統的調度器是很不同的,因為CPU的調度器的責任是將執行上下文分配給一個處理器,而普通操作系統的調度器則是執行上下文分配給一個進程。同樣的是,CPU調度器并沒有采用傳統的優先級機制,而是采用平衡共享的機制,來將處理器資源更好地分配給虛擬機,同時也能設定每個虛擬機的份額,預留和極限等設定值。在VMware最常用的CPU調度器算法,是“Co-Scheduling”算法,其也常被稱為“gang-scheduling”算法,它的核心概念是讓相關的多個進程盡可能在多個處理器上同時執行,因為當多個相關進程同時執行時,它們互相之間會進行同步,假設他們不再一起執行的話,將會增加很多由同步導致的延遲。在vSphere中,VMware推出了Co-Scheduling的更新版本,叫做Relaxed Co-Scheduling,它能更好地與虛擬機進行協作。同時,為了更好利用最新推出了多核系統,VMware也給調度器添加很多新的特性,主要集中在兩方面:其一是對現有多核環境的探知,比如對NUMA(Non-Uniform Memory Access),Hyperthreading,VM-Affinity的支持。其二是在多核之間進行有效的負載均衡。
?
內存
VMKernel在內存虛擬化方面所采用的核心機制就是“影子頁表 (Shadow Page Table)”。在探討影子頁表的機制之前,先看一下傳統頁表的運行機制,其實也很簡單,就是頁表將VPN(Virtual Page Number 虛擬內存頁號)翻譯成MPN(Machinel Page Number,機器內存頁號),之后將這個MPN發給上層,讓其調用。但是這種做法在虛擬的環境是不適用的,因為當虛擬機從頁表得到的翻譯之后的頁號不是MPN是PPN(物理內存頁號),之后需要從PPN再轉換成MPN,由于這樣將經歷兩層轉換,所以肯定會較高的成本,所以VMware引入影子頁表這個機制,它維護為每個Guest都維護一個“影子頁表”,在這個表中能直接維護VPN和MPN之間映射關系,并加載在TLB中。所以通過“影子頁表”這個機制能夠讓Guest在大多數情況下能通過TLB直接訪問內存,保證了效率。
圖2. 內存虛擬化(點擊可看大圖)
由于虛擬機對內存的消耗勝于對CPU的消耗,同時介于內存的內容同質化和浪費這兩個現象在虛擬環境非常普遍,所以VMware在影子頁表的基礎上引入了三個非常不錯的技術來減少內存的消耗,以支撐更多的虛擬機:其一是Memory Overcommit機制,這個機制通過讓虛擬機占用的內存總量超越物理機的實際容量來使一臺物理機能支持更多的虛擬機。其二是用于減少虛擬機之間相似內存頁的Page Sharing,它主要實現是通過對多個虛擬機的內存頁面進行Hash,來獲知那些內存頁面是重復的,接著將多個重復的內存頁面整合為一個replica,之后通過CoW(Copy On Write)的機制來應對對內存頁面的修改。其三是能在各個虛擬機之間動態調整內存的Balloon Driver,其實現機制就是通過給每個虛擬機安裝VMware Tools(可以把VMware Tools看作VMware的驅動)來裝入Balloon Agent,在運行的時候,Balloon Agent會和主機的Balloon Driver進行溝通,來調整每臺虛擬機的內存空間,來將那些在某些虛擬機上不處于工作狀態的內存通過swapping等方式來閑置出來,以撥給那些急需內存的虛擬機。
?
I/O
VMKernel的做法是通過模擬I/O設備(磁盤和網卡等)來實現虛擬化。而且主要選取最大眾化的硬件來模擬,比如440BX的主板,LSI Logic的SCSI卡和AMD Lance的網卡,從而提高這些模擬I/O設備的兼容性。 對Guest OS而言,它所能看到就是一組統一的I/O設備,同時Guest OS每次I/O操作都會陷入到VMM,讓VMM來執行。這種方式,對Guest而言,是一種非常透明的方式,因為無需顧忌其是否和底層硬件兼容,比如Guest操作的是SCSI的設備,但實際物理機可以SATA的硬盤。雖然這種模擬I/O設備的做法有一定開支,但在經過了VMware長時間優化,使得其在處理小規模的I/O時,非常游刃有余,但是在這個模型的方法在處理大規模I/O的時候,有時候可能會出現力不從心的局面,所以VMware在I/O層推出一些半虛擬機技術,比如,vmxnet半虛擬化網卡。
其次,為了更好地為VM服務,VMKernel還支持一些高級I/O技術:
?
總結
在開頭也說,有可能是競爭的原因,使得VMware已經越來越少地公開它的技術資料,特別是最核心的ESX技術。 所以上面這些材料主要是來自于ESX 2的文檔,而不是來自于最新的vSphere 4的文檔,但是從這些文檔中,我們還可以可以看出它絕對是全虛擬化的巔峰,并且在其新版中也已經引入了代號為VMI的半虛擬技術和支持Intel/AMD最新的硬件輔助虛擬化技術。就像本系列第二篇X86虛擬化技術所講的那樣,雖然在速度上面,半虛擬化技術和硬件輔助虛擬化技術的確各有千秋,但是他們都有軟肋,半虛擬化技術是需要對Guest OS進行修改,硬件輔助虛擬化技術則是不夠成熟,而且ESX的全虛擬化技術是經過VMware高級工程師們長達10年優化的,所以在跑某些Workload的時候,全虛擬化反而速度更優。綜上所述,用戶在使用最新版ESX的時候,應該根據不同的workload來選擇不同的虛擬化方法,具體可以查看VMware的白皮書(見參3)。
?
?
參考資料:
轉載于:https://www.cnblogs.com/qyddbear/articles/3449951.html
總結
以上是生活随笔為你收集整理的(ZZ) 剖析系统虚拟化(4)——VMware ESX架构介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WebIM Vue Demo 使用文档
- 下一篇: 创建oracle的存储过程,以及通过JD