蘭雨晴 ,宋瀟豫 ,馬立克 ,徐 舫
(1.北京航空航天大學計算機學院 北京100191;2.上海中標軟件有限公司創新中心 北京100190)
計算機平臺的虛擬化技術已有40多年的歷史,它起源于對分時操作系統的研究[1]。最早使用虛擬化技術的IBM7044計算機能夠在一臺物理機上運行多個獨立客戶操作系統系統,目的是為了讓用戶盡可能地充分利用昂貴的大型機資源。虛擬機技術是在軟、硬件之間引入虛擬層,可為應用程序提供獨立的運行環境,屏蔽硬件平臺的動態性、分布性和異構性,支持硬件資源的共享和復用,并為每個用戶提供屬于個人的獨立、隔離的計算環境,同時,為管理員提供硬件資源和軟件資源的集中管理[2]。
隨著x86處理器性能的提升和應用的普及,虛擬化技術在x86平臺上得到了迅速的發展和廣泛的應用。虛擬化技術目前的主要用途是測試開發以及服務器資源整合。
虛擬化技術按照不同的實現方式可以分為全虛擬化(full virtualization)、半虛擬化(paravirtualization)和硬件輔助虛擬化(hardware assisted virtualization)。全虛擬化和半虛擬化主要通過軟件方式實現虛擬化,全虛擬化采用二進制代碼動態翻譯(dynamic binary translation)技術訪問虛擬硬件,半虛擬化技術將敏感指令替換為對虛擬機監控器的超級調用(hypercall),避免每條指令的翻譯,但這兩種方式都會帶來一定程度的性能開銷。近年來,Intel和AMD在硬件級上對虛擬化技術予以支持,如Intel的VT(virtualization technology,虛擬化技術,也曾叫做vanderpool technology)和AMD 的 SVM(secure virtual machine,安全虛擬機)技術,虛擬機的處理器性能和I/O(input/output,輸入輸出)性能有了明顯的提升,硬件輔助虛擬化技術因其具有接近物理機甚至在某些方面超越物理機的性能而被學術界和工業界廣泛關注。
企業或者科研機構在面對種類繁多、各有特點的虛擬化技術時,往往比較關注虛擬化技術的性能問題。首先,應用程序運行在虛擬機上與直接運行在物理機上性能上的差異有多少;其次,虛擬化的各種技術實現提供的性能是否存在很大的差異。本文正是針對目前普遍關注的虛擬機CPU性能和I/O性能等展開了一系列的標準性能測試,包括編譯內核、磁盤讀寫、文件壓縮、網絡傳輸、Sysbench、Unixbench等。本文第2節概述虛擬化技術,第3節給出了測試工具和測試方法的具體描述,第4節分析了基準測試結果,最后在第5節對上述工作進行了總結。
1974年,Popek和Goldberg[3]提出經典系統虛擬化模型,該模型指出操作系統成為虛擬機監控器(virtual machine monitor,VMM)的基本要求:CPU的指令集體系結構中,敏感指令必須是特權指令的子集。這種特性使得只有當客戶操作系統執行敏感指令時,VMM才會陷入到0特權級去執行敏感指令。然而目前流行的x86架構并不能適用于這種模型,x86指令集中有一部分敏感指令不是特權指令[4],有17條敏感指令(比如LGDT等)不屬于特權指令,這些敏感指令在低特權級下運行不會發生陷入,這就使得VMM無法有選擇性地陷入指令而減少VMM帶來的性能損失。
x86在構架上的缺陷使得x86平臺虛擬化的實現存在困難和挑戰,一些學者和工程師另辟蹊徑采用純軟件的方法來彌補x86體系結構固有的虛擬化缺陷。在CPU虛擬化方面,全虛擬化技術(full virtualization)使用軟件的方法完全或者部分的模擬出底層計算機硬件,不需要修改客戶操作系統(guest OS)的內核,客戶操作系統完全感知不到自己運行在虛擬的硬件之上,通過二進制代碼動態翻譯(dynamic binary translation)核心指令來替代那些不能虛擬化的指令,使用翻譯后的指令訪問虛擬硬件。在內存虛擬化方面,全虛擬化技術為每個Guest都維護一個“影子頁表”,在這個表中寫入虛擬化之后的內存地址映射關系,而Guest OS的頁表則無需變動,最后,VMM將影子頁表交給MMU(memory management unit,內存管理單元)進行地址轉換。在I/O虛擬化方面,全虛擬化技術通過模擬I/O設備(磁盤和網卡等)來實現虛擬化。對Guest OS而言,它所能看到就是一組統一的I/O設備,同時Guest OS每次I/O操作都會陷入到VMM,讓VMM來執行。這種方式對Guest而言,非常透明,無需顧忌底層硬件。采用全虛擬化技術的典型系統有:Virtual Box、VMware Workstation、VMware ESX Server、Virtual PC、QEMU[5]等。
半虛擬化技術 (para-virtualization)在CPU虛擬化方面,通過修改客戶操作系統的內核源代碼,將客戶操作系統的指令操作替換為對虛擬機監控器的超級調用(hypercall),客戶操作系統知道自身運行在一個虛擬化的硬件系統之上[5],并且被要求與虛擬機監控器相互協調與合作。在內存虛擬化方面,半虛擬化技術采用頁表寫入法,當Guest OS創建一個新的頁表時,其會向VMM注冊該頁表,之后在Guest運行的時候,VMM將不斷地管理和維護這個表,使Guest上面的程序能直接訪問到合適的地址。在I/O虛擬化方面,半虛擬化技術通過前端(front-end)/后端(back-end)架構,將Guest的I/O請求通過一個環狀隊列傳遞到特權域(privileged domain,也被稱為Domain-0)。采用半虛擬化技術的產品有Xen的半虛擬化產品。
硬件輔助虛擬化技術彌補了x86體系結構虛擬化的缺陷,在CPU虛擬化方面,Intel VT技術和AMD SVM技術對處理器硬件進行了擴展,通過引入根模式和非根模式來分別運行VMM以及客戶操作系統,VMM和客戶操作系統分別運行在根模式和非根模式的0特權級上,只有客戶操作系統在執行敏感指令時,才產生根模式與非根模式的切換,系統會切換到運行于根模式的VMM,讓VMM來處理這些特殊指令。在內存虛擬化方面,硬件輔助虛擬化技術使用擴展頁表(extended page table,EPT),EPT 通過使用硬件技術,使其能在原有的頁表的基礎上,增加了一個EPT頁表,通過這個頁表能夠將Guest的物理地址直接翻譯為物理機的物理地址,從而減低整個內存虛擬化所需的開銷。在I/O虛擬化方面,有 Intel的VT-d、AMD的IOMMU(input/output memory management unit,輸入輸出內存管理單元)和PCI-SIG的 IOV(I/O virtulization,輸入輸出虛擬化)這三個技術。VT-d,其核心思想就是讓虛擬機能直接使用物理設備,但是這會牽涉到I/O地址訪問和DMA(direct memory access,直接存儲器訪問)的問題,而VT-d通過采用DMA重映射 (remapping)和I/O頁表來解決這兩個問題,從而讓虛擬機能直接訪問物理設備。IOMMU和VT-d在技術上有很多相似之處。目前硬件輔助虛擬化技術已經獲得了接近原生操作系統的高性能,主要的技術有KVM(kernel virtual machine)和硬件輔助虛擬化的Xen。
之前提到各種虛擬化技術是在硬件層次上的虛擬化,主要通過軟件或者硬件輔助的方法實現物理機與虛擬機的隔離,虛擬機能夠直接對物理機的資源進行訪問。而目前也存在比較流行的操作系統級 (OS Level)的虛擬化技術,為用戶提供了一個獨立完整的操作系統環境,包括操作系統、用戶函數庫、文件系統和環境設置等。客戶操作系統運行在宿主操作系統之上,虛擬機可以是對物理機資源的分區或者僅僅是一個容器,復制了宿主操作系統的環境。由于所有物理機和虛擬機的操作系統只運行了一個內核,沒有虛擬機監控器中間層的運行開銷,操作系統級的虛擬化技術具有優秀的性能。操作系統級的虛擬化代表系統有Linux-VServer和OpenVZ。但是目前操作系統級的虛擬化技術因其穩定性、易用性以及可管理性等方面均存在不足之處,并且無法與其他虛擬化技術一樣安裝部署主流的企業級服務器操作系統,無法構建統一的比較測試環境,因此本次評測沒有將Linux-VServer和OpenVZ列入待比較的虛擬化技術之中。
無論是在學術界還是在工業界,對于什么樣的方法是評測虛擬化解決方案的最好方法,一直沒有達成共識。標準性能評測公司(standard performance evaluation corporation,SPEC)在2006年底成立了一個委員會專門研究虛擬化解決方案評測方法[7]。VMware和Intel都是該委員會的成員,并且走在研究前沿,已經發布了兩款不同的基準測試程序套件(或稱工作負載,因為兩個套件都是由現存的、獨立的基準測試程序組成的),分別叫做VMmark[8]和vConsolidate[9]。組成兩個套件的工作負載非常相似,區別只是在于每個公司根據合成得到的結果來定義一個評分系統的方式。但是在本次研究中,兩款基準測試程序套件都未被采用,因為它們都依賴于一個針對郵件服務器的,叫做LoadSim的基準測試程序,這個基準測試程序只能配合微軟的Exchange Server使用。
本文的評測沒有使用專門面向虛擬環境的性能評測工具,而是重用了傳統操作系統的性能評測工具,因為普通用戶最為關注的問題是:(1)虛擬機能否達到物理機的性能;(2)虛擬機與物理機相比性能損失有多少;(3)各種虛擬化技術孰優孰劣。因此,重用傳統操作系統的性能評測工具往往能夠得到最為直觀并且有說服力的結果。在選用具體的評測工具時,我們主要考慮要從以下三個方面對虛擬機的性能進行評測:客戶機操作系統上處理器性能指標;客戶機操作系統內存性能;虛擬外設I/O的性能。
在本次測試中使用上海中標軟件有限公司的NeoShine Advance Server 5.4 x86-64作為物理機和虛擬機的操作系統,它的內核版本是2.6.18。在測試中使用的基準測試程序的名稱和版本如表1所示。表2列舉了待評測的虛擬化解決方案以及在物理機和虛擬機上安裝的操作系統的內核版本。

表1 使用的基準測試程序列表

表2 待評測虛擬化解決方案及各自內核版本
所有的測試在IBM x3650 M2服務器上進行,該服務器的配置如下:2 個 Intel Xeon CPU E5520(2.26 GHz,16 核),8 GB內存,897 GB磁盤陣列和一個吉比特網卡,該網卡連接到局域網中。在測試中,虛擬機的配置如下:1個CPU,2 GB的內存,50 GB的硬盤和一個網卡。
對于結果的收集方式如下:所有的測試都重復4次,拋棄第一次結果樣本,在第二次、第三次及第四次結果樣本中選取中位數作為當前的測試結果。虛擬機上的測試結果都進行標準化處理,即以物理機上的測試結果為基數,將虛擬機上的測試結果轉化為相對于該基數的比例值。測試機在每次進行新的測試集合之前都必須重新啟動。在測試新的虛擬化解決方案之前,重新格式化磁盤并重新安裝操作系統。
本部分展示本研究的結果,所有這些結果值都是以物理機上的測試結果為基數,經過標準化之后的相對值。圖1顯示了以時間為單位的基準測試程序的標準化測試結果,圖中的條形越高表示該虛擬化解決方案的性能在對應的工作負載中越好。

本次測試采用Bzip2進行數據壓縮測試。Bzip2是一個CPU密集型的任務,只有較低的I/O需求。在Bzip2的測試中,采用壓縮單個大文件和壓縮多個小文件兩種方式來進行壓縮時間的測試:Bzip2-1壓縮很大的一個鏡像文件(Neoshine Advance Server的光盤鏡像ISO文件,4.37 GB),Bzip2-2壓縮有很多小文件的文件夾 (Linux Kernel 2.6.32內核源碼樹,包含32 364個文件,共計423 MB)。在光盤鏡像壓縮的試驗中,只有Virtual Box比較接近物理機的性能,而在內核源碼樹的壓縮試驗中,KVM和Virtual Box都比較接近物理機的性能。
本測試中采用dd來測試磁盤性能,dd操作對CPU沒有太大壓力,而是主要集中于磁盤輸入輸出(I/O)操作。在這個測試中,我們把一個4.37 GB的鏡像文件(ISO文件)拷貝到同一個ext3分區下。本文評測的所有虛擬化解決方案在本測試中的性能和物理機相比都不是十分理想,Xen的半虛擬化解決方案相對來說比其他解決方案略勝一籌。
Sysbench用來做數據庫服務器的一個基準測試程序,我們的測試中主要是進行在線事務處理(OLTP)測試,它對MySQL數據庫中進行一組10 000個事務處理所耗的時間。在本測試中,除了Virtual Box以外,各虛擬化解決方案的表現都相當不錯,性能甚至略微超過了物理機,Virtual Box相比之下則遜色得多。
內核編譯是一個綜合性能評測方法,內核編譯測試既是處理器敏感型任務,又是內存、多線程和對文件系統的讀寫壓力敏感型的任務,因為它在編譯的過程中,會讀寫很多的小文件,這些特征使它成為很好的綜合系統系能指標。在本測試中,測試編譯Linux Kernel 2.6.32所消耗的時間。所有的待測虛擬化解決方案的表現都不錯,Xen的全虛擬化和半虛擬化的性能都很接近物理機的性能,而Virtual Box和KVM更是較大幅度地超過了物理機的性能。
圖2顯示了測試吞吐量的基準測試程序的標準化測試結果。
Dbench是一個文件系統基準測試程序,模擬文件服務器上的工作。在本測試中,Dbench模擬300個用戶同時對文件服務器進行并發讀寫操作,其中,Virtual Box的表現相當突出,在其他虛擬化解決方案的性能最高只有物理機性能的40%左右的情況下,它一舉超過了物理機的性能達20%之多。
Netperf是一個簡單的網絡基準測試程序,它使用TCP數據包流來評測數據交換的性能。在本項測試中,除了Xen的全虛擬化解決方案性能只有不到物理機的60%外,其他解決方案都非常接近物理機的性能。
在完成Netperf的網絡測試以后,本測試又采用Rsync進行了兩項測試,都是從服務器端向客戶端同步數據。第一項測試同步內核源碼樹,它是一個包含很多小文件的文件夾,包含32 364個文件,共計423 MB。第二項測試是同步一個很大的鏡像文件(4.37 GB的ISO文件)。在兩項測試中,Virtual Box、Xen的半虛擬化和KVM表現都很不錯,很接近物理機的性能,而Xen的全虛擬化解決方案則要遜色得多。

圖2 吞吐量類測試結果對比
最后,我們還使用UnixBench進行了測試,UnixBench的目的是給類Unix系統的性能分析提供一種基本的指標,其基于早先的BYTE測試。因此,多個測試被用于測試系統性能的各個的方面,包括基本數學運算、文件系統效率、進程間通信、管道吞吐率、shell程序效率等。然后將這些測試結果與從基礎系統的分數比較,產生一個預定值,這個預定值比原始的分數更容易處理。綜合整套系列的預定值將得出一個系統全面的索引。在進行多項測試以后,UnixBench會給出一個綜合評分。在該項測試中,KVM和Virtual Box表現不錯,都超過了物理機性能的60%。
UnixBench綜合評分結果對比如圖3所示。

圖3 UnixBench綜合評分結果對比
本文評測了Linux下的4款開源虛擬化技術的基本性能。在研究過程中,我們使用了一些基準測試程序來分析不同的虛擬化技術在不同的工作負載中的性能,并和物理機上的性能進行比較,觀察其開銷。
BZip2和Sysbench測試結果主要體現了客戶操作系統在處理器性能方面的指標,其中KVM和Virtual Box有較好的表現,因此,如果用戶使用虛擬化技術主要面向處理器密集型的應用,需要消耗大量的處理器資源,并且保持處理器調度的高效率,KVM和Virtual Box是較好的選擇,但是由于Virtual Box是一個桌面虛擬化系統,因此在實際企業應用中,處理器密集型應用主要考慮使用KVM虛擬機。內核編譯測試不僅對處理器敏感,也對內存和硬盤讀寫敏感,KVM在內核編譯中的表現也是遠遠優于Xen的兩種虛擬化方案。并且從UnixBench總體性能測試的結果來看,KVM硬件輔助虛擬化技術也是所有虛擬化技術中表現最好的。
對于I/O性能測試,首先從磁盤讀寫的dd測試來看:所有虛擬化技術均低于物理機性能的50%,表現最好的是Xen半虛擬化和Virtual Box,而表現最差的是硬件輔助的KVM;在并發讀寫Dbench測試中,Virtual Box的性能超過了物理機的性能,而性能最差的仍然是KVM。因此,可以看出,KVM的磁盤I/O性能在所有虛擬化技術中最弱的,面向磁盤輸入輸出密集的應用不適合使用KVM虛擬化技術。其次,從網絡I/O性能來看,在Netperf測試中,除了Xen硬件輔助虛擬化,其他虛擬化技術均具有與物理機相當的性能,在Rsync的兩項測試中,也是Xen的硬件輔助虛擬化性能最差。由此可以看出,對于網絡I/O密集的應用,使用Xen的硬件輔助虛擬化是不太合適的。
通過以上分析,本文的結論是:對于處理器密集型的應用,適合選擇使用KVM硬件輔助虛擬化技術;對于磁盤I/O密集的應用,不適合使用KVM硬件輔助虛擬化技術;對于網絡I/O密集的應用,不適合選用本文測試所使用的Xen的硬件輔助虛擬化版本,而其他虛擬化技術都可作為備選方案。
1 Christopher Strachey.Time sharing in large fast computers.In:International Conference on Information Processing,UNESCO,June 1959
2 懷進鵬,李沁,胡春明.基于虛擬機的虛擬計算環境研究與設計.軟件學報,2007(4)
3 Popek G J,Goldberg R P.Formal requirements for virtualizable third generation architectures.Commun ACM,1974,17(7):412~421
4 Robin J,Irvine C.Analysis of the Intel pentium’s ability to support a secure virtual machine monitor,2000
5 Fabrice Bellard.Qemu,a fast and portable dynamic translator.In:Proceedings of the Annual Conference on USENIX Annual Technical Conference,Berkeley,CA,USA,2005
6 Forbes J M.Why virtualization fragmentation sucks.In:Proceedings of the Linux Symposium,Ottawa,ON,Canada,June 2007
7 Standard Performance Evaluation Corporation.Spec Virtualization Committee,http://www.spec.org/specvirtualization/,April 2008
8 Makhija,et al.Vmmark:a scalable benchmark for virtualized systems.Tech reaport,VMware,Inc,2006
9 Casazza,et al.Redefining server performance characterization for virtualization benchmarking.Intel Technology Journal,2006,10(3):243~252