董衛(wèi)宇,蔣烈輝,王立新,唐永鶴,焦建華
(信息工程大學(xué) 數(shù)學(xué)工程與先進(jìn)計(jì)算國(guó)家重點(diǎn)實(shí)驗(yàn)室,河南 鄭州450000)
跨平臺(tái)系統(tǒng)虛擬機(jī) (cross-platform system virtual machine)利用動(dòng)態(tài)二進(jìn)制翻譯 (dynamic binary translation,DBT)、內(nèi)存虛擬化、I/O仿真等技術(shù),可使針對(duì)某處理器平臺(tái) (源平臺(tái))編譯的操作系統(tǒng)和應(yīng)用程序運(yùn)行于其它處理器平臺(tái) (目標(biāo)平臺(tái)),實(shí)現(xiàn)軟件的跨平臺(tái)透明移植,對(duì)體系結(jié)構(gòu)創(chuàng)新和新型處理器推廣具有重要意義[1]。另外,跨平臺(tái)系統(tǒng)虛擬機(jī)技術(shù)在動(dòng)態(tài)二進(jìn)制優(yōu)化、漏洞挖掘和利用、體系結(jié)構(gòu)模擬等領(lǐng)域也有廣泛的用途[2-4]。
除了對(duì)源平臺(tái)指令集架構(gòu) (instruction set architecture,ISA)兼容的完備性之外,性能是跨平臺(tái)系統(tǒng)虛擬機(jī)需優(yōu)先考慮的問題。源平臺(tái)與目標(biāo)平臺(tái)的ISA間在指令集、存儲(chǔ)管理單元 (memory management unit,MMU)、I/O接口等方面的差異,有可能嚴(yán)重制約跨平臺(tái)系統(tǒng)虛擬機(jī)的效率。
目前,提升跨平臺(tái)系統(tǒng)虛擬機(jī)效率的做法主要有兩類,一是利用軟硬件協(xié)同設(shè)計(jì)技術(shù)[1,5,6],在目標(biāo)平臺(tái)CPU中增加硬件資源來模擬源平臺(tái);二是利用軟件方法,通過分析源平臺(tái)ISA的特性來簡(jiǎn)化或去除不必要的模擬操作。第一類做法可獲得較大加速比,但對(duì)CPU進(jìn)行修改須面臨成本、技術(shù)、驗(yàn)證等多重風(fēng)險(xiǎn),處理器廠商對(duì)此種方案一般很謹(jǐn)慎。第二類做法如果運(yùn)用得當(dāng)也可以獲得可觀的收益,風(fēng)險(xiǎn)很小,出現(xiàn)錯(cuò)誤易于修改,并且可以為軟硬件協(xié)同設(shè)計(jì)提供依據(jù)。本文以基于申威處理器 (SW-410,以下簡(jiǎn)稱SW)的x86系統(tǒng)虛擬機(jī)監(jiān)控器為實(shí)例來討論跨平臺(tái)系統(tǒng)虛擬機(jī)的訪存操作的軟件優(yōu)化方法。
不同于某些進(jìn)程級(jí)虛擬機(jī)[7,8],跨平臺(tái)系統(tǒng)虛擬機(jī)需要模擬源平臺(tái)的MMU,在訪存前進(jìn)行虛實(shí)地址轉(zhuǎn)換,以及缺頁(yè)或內(nèi)存保護(hù)異常檢測(cè)。由于源平臺(tái)和目標(biāo)平臺(tái)的MMU往往存在很大差異,一般無法使用同構(gòu)系統(tǒng)虛擬化中的影子頁(yè)表、EPT (extended page table)等技術(shù),而只能利用軟件來串行模擬原本可以用MMU硬件并行完成的工作,因此開銷很大,優(yōu)化價(jià)值也很大。
本文的主要工作如下:①介紹了跨平臺(tái)系統(tǒng)虛擬機(jī)ARCH-BRIDGE及其設(shè)計(jì);②對(duì)ARCH-BRIDGE存儲(chǔ)子系統(tǒng)的性能瓶頸進(jìn)行了識(shí)別和分析;③提出了x86段級(jí)存儲(chǔ)仿真優(yōu)化、頁(yè)級(jí)存儲(chǔ)仿真優(yōu)化、連續(xù)內(nèi)存訪問優(yōu)化等方法;④對(duì)上述方法進(jìn)行了實(shí)現(xiàn)和測(cè)試,應(yīng)用上述方法,ARCHBRIDGE的訪存性能提升了2.4倍~3倍,操作系統(tǒng)引導(dǎo)性能提升了30.4%。
ARCH-BRIDGE是首個(gè)基于申威處理器的跨平臺(tái)系統(tǒng)虛擬機(jī)監(jiān)控器。為豐富申威處理器的軟件來源,并考慮到x86ISA在業(yè)界的壟斷地位,ARCH-BRIDGE選擇x86作為源平臺(tái)。該項(xiàng)目的目的是研究申威與x86間的ISA差異,識(shí)別基于申威平臺(tái)的x86系統(tǒng)虛擬機(jī)的性能瓶頸,提出面向x86架構(gòu)兼容的申威處理器優(yōu)化擴(kuò)展方案,并在后續(xù)硬件支持的基礎(chǔ)上最終演化為一款軟硬件協(xié)同設(shè)計(jì)虛擬機(jī)監(jiān)控器 (co-designed Virtual machine monitor),實(shí)現(xiàn)x86操作系統(tǒng)和應(yīng)用程序在申威平臺(tái)上的透明高效運(yùn)行。
目前,ARCH-BRIDGE運(yùn)行于采用SW處理器的神威服務(wù)器平臺(tái),支持Intel P6處理器定義的全部定點(diǎn)指令、FPU指令和 MMX指令,支持PCI總線、南北橋、IDE、VGA、APIC等典型x86接口,能夠運(yùn)行基于x86Linux 2.6內(nèi)核的操作系統(tǒng),能夠運(yùn)行BusyBox工具集中的全部應(yīng)用程序,通過了SPEC CPU 2006測(cè)試集中全部定點(diǎn)程序和12個(gè)浮點(diǎn)程序的測(cè)試 (另外6個(gè)浮點(diǎn)程序?yàn)镕ortran程序,由于虛擬機(jī)映像內(nèi)運(yùn)行時(shí)庫(kù)問題暫未測(cè)試)。支持Windows操作系統(tǒng)運(yùn)行以及軟硬件協(xié)同設(shè)計(jì)虛擬機(jī)的工作正在進(jìn)行中。
ARCH-BRIDGE的設(shè)計(jì)方案如圖1所示,下面從x86處理器虛擬化、內(nèi)存虛擬化和I/O虛擬化3個(gè)方面介紹其設(shè)計(jì)。
動(dòng)態(tài)二進(jìn)制翻譯技術(shù)是在異構(gòu)平臺(tái)上進(jìn)行x86處理器虛擬化的關(guān)鍵技術(shù)。ARCH-BRIDGE的利用DBT引擎完成動(dòng)態(tài)二進(jìn)制工作,其主要設(shè)計(jì)要點(diǎn)如下:
圖1 ARCH-BRIDGE設(shè)計(jì)方案
(1)DBT引擎以動(dòng)態(tài)基本塊為翻譯單位。為提高翻譯效率,采用x86指令到SW指令直接翻譯和寄存器靜態(tài)映射的方式,沒有采用其它虛擬機(jī)監(jiān)控器所采用的中間表示以及動(dòng)態(tài)寄存器分配方案。某些x86指令 (如INT指令)的操作十分復(fù)雜,ARCH-BRIDGE利用輔助的C代碼仿真這些指令。
(2)為提高翻譯代碼的重用率,DBT引擎采用了代碼緩存 (code cache)機(jī)制來保存翻譯過的x86基本塊,當(dāng)代碼緩存滿時(shí),采用簡(jiǎn)單的全清空策略清除所有翻譯塊。
(3)為降低DBT引擎與翻譯塊間的上下文切換開銷,DBT引擎采用了翻譯塊鏈 (Block Chaining)機(jī)制來鏈接翻譯過的代碼塊,為避免構(gòu)成循環(huán)的翻譯塊阻礙對(duì)中斷的響應(yīng),需定期將當(dāng)前正在執(zhí)行的翻譯塊從塊鏈中移除,以便返回執(zhí)行引擎檢查中斷。
(4)在取指令 (實(shí)際是訪存的一種形式)或翻譯塊執(zhí)行過程中檢測(cè)到x86異常時(shí),采用longjmp()將流程轉(zhuǎn)移到DBT引擎入口位置,進(jìn)行異常檢查和派發(fā)工作。ARCHBRIGE支持精確異常,可確保在異常派發(fā)前將機(jī)器狀態(tài)(包括通用寄存器、標(biāo)志寄存器、EIP、內(nèi)存內(nèi)容)恢復(fù)到異常指令執(zhí)行前的狀態(tài)。
(5)采用懶惰計(jì)算思想,在執(zhí)行翻譯塊時(shí)不更新EIP的值,僅在塊尾部或遇到異常時(shí)才恢復(fù)EIP的值;在翻譯影響標(biāo)志位的指令時(shí),僅插入SW指令保存x86指令的操作、執(zhí)行結(jié)果和源操作數(shù) (目的操作數(shù)可以由上面3個(gè)信息恢復(fù)出來),僅在需要引用標(biāo)志位時(shí)才計(jì)算標(biāo)志位的值。
內(nèi)存虛擬化包括兩個(gè)任務(wù):一是MMU虛擬化,主要是模擬x86對(duì)頁(yè)表和TLB的相關(guān)操作,完成客戶虛擬地址(guest virtual address,GVA)到 客 戶 物 理 地 址 (guest physical address,GPA)的轉(zhuǎn)換。由于頁(yè)表屬于x86ISA的一部分,因此ARCH-BRIDGE需精確模擬頁(yè)表的查找過程。由于x86TLB對(duì)軟件透明,因此TLB虛擬化不受實(shí)際硬件的限制,ARCH-BRIDGE以HASH表的形式對(duì)TLB進(jìn)行模擬;二是物理內(nèi)存虛擬化,ARCH-BRIDGE使用進(jìn)程地址空間的一部分來模擬虛擬機(jī)的物理內(nèi)存,因此需要建立客戶物理地址GPA到宿主機(jī)虛擬地址 (host virtual address,HVA)間的映射。由于x86的物理地址空間很可能存在空洞,并考慮到對(duì)PAE機(jī)制 (36位物理地址)的支持,ARCH-BRIDGE采用3級(jí)目錄結(jié)構(gòu)來保存這種映射關(guān)系。每個(gè)映射關(guān)系將一個(gè)4KB的虛擬機(jī)物理頁(yè)面映射到一個(gè)4KB的宿主機(jī)虛擬頁(yè)面。若x86物理頁(yè)面為RAM或ROM,則映射關(guān)系給出物理頁(yè)面對(duì)應(yīng)的HVA。若x86物理頁(yè)面以MMIO方式映射到I/O設(shè)備的存儲(chǔ)區(qū)域,則映射關(guān)系以回調(diào)函數(shù)方式給出訪問設(shè)備存儲(chǔ)區(qū)域?qū)?yīng)的I/O動(dòng)作。
I/O虛擬化主要工作有四方面:一是I/O寄存器模擬;二是內(nèi)存映射 (MMIO)的設(shè)備存儲(chǔ)模擬;三是設(shè)備中斷;四是設(shè)備的DMA操作。除此之外,ARCH-BRIDGE還實(shí)現(xiàn)了軟時(shí)鐘、字符設(shè)備抽象層、塊設(shè)備抽象層等模塊,以提供對(duì)設(shè)備仿真的共性支持。ARCH-BRIDGE的I/O仿真的主要做法是:
(1)在設(shè)備初始化時(shí)向ARCH-BRIDGE注冊(cè)I/O端口或MMIO存儲(chǔ)的訪問回調(diào)函數(shù);
(2)在翻譯塊執(zhí)行過程中,若訪問I/O端口或 MMIO存儲(chǔ),上述回調(diào)函數(shù)將被調(diào)用,I/O操作得到同步處理;
(3)ARCH-BRIDGE以定時(shí)輪詢的方式檢測(cè)鍵盤輸入、定時(shí)器超時(shí)等I/O事件,并在必要時(shí)以中斷注入的方式通知虛擬機(jī);
(4)ARCH-BRIDGE在基本塊的邊界檢測(cè)外部中斷并進(jìn)行中斷派發(fā)。
ARCH-BRIDGE對(duì)訪存指令的翻譯工作可以分為兩個(gè)部分:
(1)根據(jù)指令指定的尋址方式生成用于計(jì)算x86線性地址的SW指令序列;
(2)生成調(diào)用mmu_rd或mmu_wt所需的SW指令序列。其中mmu_rd和mmu_wt為C函數(shù),用于進(jìn)行訪存涉及的復(fù)雜的TLB查詢、地址轉(zhuǎn)換和訪問宿主機(jī)內(nèi)存的操作。
ARCH-BRIDGE前期的實(shí)驗(yàn)數(shù)據(jù)表明,在引導(dǎo)Linux-2.6.38內(nèi)核時(shí),從開機(jī)到出現(xiàn)登錄界面總消耗時(shí)間約為65s左右,由于采用指令直接翻譯和寄存器靜態(tài)映射技術(shù),指令翻譯效率較高,僅占用了2.1s,但訪存時(shí)間消耗高達(dá)31.7s,約占到了虛擬機(jī)總執(zhí)行時(shí)間的48.8%,對(duì)虛擬機(jī)的性能影響很大,存在很大的優(yōu)化價(jià)值。分析發(fā)現(xiàn),ARCH-BRIDGE的訪存操作至少存在如下一些優(yōu)化機(jī)會(huì):
(1)x86訪存操作存在復(fù)雜的段級(jí)存儲(chǔ)管理階段,每個(gè)訪存操作都需要將有效地址加上段基址來生成線性地址并進(jìn)行段邊界檢查,精確模擬上述機(jī)制需要一定數(shù)量的SW指令。但由于x86操作系統(tǒng)大多繞過了段級(jí)機(jī)制,采用平面模式內(nèi)存管理 (段基址為0,段界限為0xFFFFFFFF),精確模擬沒有實(shí)際意義,存在優(yōu)化機(jī)會(huì)。
(2)如圖2所示,DBT引擎與翻譯塊共用一套SW結(jié)構(gòu)寄存器,從DBT引擎切換到翻譯塊執(zhí)行需要一次上下文切換;當(dāng)遇到訪存操作時(shí) (翻譯塊內(nèi)往往存在多次訪存),從翻譯塊中調(diào)用mmu_rd和mmu_wt又引入了額外的上下文切換。另外,利用C函數(shù)實(shí)現(xiàn)mmu_rd和mmu_wt的效率也不高。mmu_rd和mmu_wt的3項(xiàng)主要工作是TLB查詢、TLB脫靶情況下的頁(yè)表查詢、以及宿主存儲(chǔ)器訪問,其中第1、3項(xiàng)工作比較簡(jiǎn)單。測(cè)試表明,ARCH-BRIDGE的TLB命中率為99.4%,大多數(shù)情況下無需頁(yè)表查詢操作,因此可考慮利用較短的SW指令序列對(duì)頁(yè)級(jí)存儲(chǔ)仿真進(jìn)行優(yōu)化。
圖2 訪存時(shí)調(diào)用mmu_rd和mmu_wt的流程
(3)x86提供了 MOVS、SCAS、INS/OUTS等串指令,并且與REP等指令前綴配合來完成串操作。如表1所示,在系統(tǒng)引導(dǎo)過程中觀測(cè)到的約1.2×108次訪存中,串操作的訪存次數(shù)總和為53 732 810次,約占總訪存次數(shù)的44.7%。QEMU、Valgrind[9,10]等跨平臺(tái)虛擬機(jī)采用比較簡(jiǎn)單的仿真方法,將串指令包含在一個(gè)循環(huán)內(nèi)實(shí)現(xiàn)串操作,每次循環(huán)都需要進(jìn)行虛實(shí)地址轉(zhuǎn)換工作??紤]到串操作具有連續(xù)訪問存儲(chǔ)器的特點(diǎn),一旦確定了某個(gè)訪存操作對(duì)應(yīng)的宿主機(jī)內(nèi)存地址,只要不超出當(dāng)前頁(yè)面,對(duì)后續(xù)的訪問無須進(jìn)行GVA到HVA的代換,可以進(jìn)一步省去TLB查詢的開銷。
表1 引導(dǎo)過程中的串指令訪存頻次
針對(duì)上述優(yōu)化機(jī)會(huì),本文分別提出了段級(jí)存儲(chǔ)仿真優(yōu)化、頁(yè)級(jí)存儲(chǔ)仿真優(yōu)化、連續(xù)內(nèi)存訪問優(yōu)化等方法,并在ARCH-BRIDGE進(jìn)行了實(shí)現(xiàn),具體做法將在第3節(jié)中介紹。
為優(yōu)化對(duì)段級(jí)存儲(chǔ)的仿真,ARCH-BRIDGE在翻譯基本塊前檢查段寄存器的狀態(tài),并將檢查結(jié)果記錄在翻譯塊描述信息中,每個(gè)段寄存器只需2位信息即可,分別表示段基址是否為0以及段邊界是否為0xFFFFFFFF。x86的6個(gè)段寄存器用一個(gè)12位的位圖描述即可。
當(dāng)翻譯基本塊內(nèi)的訪存指令時(shí),若所使用的段基址為0,則無需生成SW指令進(jìn)行有效地址與段基址的加法操作;若段界限為0xFFFFFFFF,則無需生成SW指令進(jìn)行段界限保護(hù)檢查。由于訪存指令普遍存在,因此該優(yōu)化可在一定程度上去除翻譯塊中的無效指令。
在存在代碼緩存和翻譯塊鏈的情況下,需要防止翻譯塊在段寄存器配置發(fā)生變化的情況下被執(zhí)行。為此,ARCH-BRIDGE采用了以下兩點(diǎn)措施:首先,在進(jìn)行代碼緩存查找時(shí),除基本塊地址外,還比對(duì)段寄存器的當(dāng)前配置與基本塊在翻譯時(shí)的段寄存器配置,若發(fā)生變化 (幾率很?。?,需在新的段寄存器配置下重新翻譯基本塊。其次,將所有修改段寄存器的指令視為基本塊結(jié)束條件,并且僅在塊以直接跳轉(zhuǎn)或直接函數(shù)調(diào)用指令結(jié)束時(shí)才與后續(xù)的塊建立塊鏈,任何修改段寄存器的指令執(zhí)行后將返回DBT引擎,這保證了在構(gòu)成塊鏈的一組基本塊中不可能存在修改段寄存器的指令,也就是說構(gòu)成塊鏈的一組基本塊具有相同的段寄存器配置,在從代碼緩存中查找到一個(gè)翻譯塊進(jìn)而進(jìn)入塊鏈中執(zhí)行后,無需擔(dān)心會(huì)執(zhí)行到段寄存器配置與其初始翻譯時(shí)不符的翻譯塊。該過程如圖3所示。
圖3 ARCH-BRIDGE的基本塊終止和塊鏈退出
為進(jìn)行頁(yè)級(jí)存儲(chǔ)仿真優(yōu)化,ARCH-BRIDGE引入了指令片段mmu_rd_fast和mmu_wt_fast,負(fù)責(zé)TLB查詢以及TLB命中后的宿主存儲(chǔ)器訪問,大小為20條指令左右。在指令中的翻譯訪存操作時(shí),會(huì)首先生成對(duì)mmu_rd_fast和mmu_wt_fast的調(diào)用指令,之后再生成對(duì)mmu_rd和mmu_wt的調(diào)用指令,僅當(dāng)TLB未命中時(shí),mmu_rd和mmu_wt才會(huì)得到執(zhí)行。對(duì)mmu_rd_fast和mmu_wt_fast的調(diào)用只需增加3條指令,代碼膨脹很小。
ARCH-BRIDGE采用靜態(tài)寄存器分配,在翻譯塊中不會(huì)使用處理器 ABI(application binary interface)約定的參數(shù)傳遞寄存器 (r16~r21)和返回值寄存器 (r0)。由于mmu_rd_fast和mmu_wt_fast的任務(wù)比較簡(jiǎn)單,僅使用寄存器r16~r21和r0即可完成工作,因此在調(diào)用這兩段指令片段時(shí),而無需進(jìn)行上下文切換。如前所述,TLB命中率很高,因此絕大部分訪存操作都可由mmu_rd_fast和mmu_wt_fast完成,可以在很大程度上提升訪存效率。
為簡(jiǎn)化實(shí)現(xiàn),mmu_rd_fast和mmu_wt_fast僅處理TLB命中的、不跨頁(yè)的、非MMIO的訪存操作,其它類型的訪存操作仍交由mmu_rd和mmu_wt處理。
為進(jìn)行連續(xù)內(nèi)存訪問優(yōu)化,ARCH-BRIDGE以C函數(shù)方式來仿真串指令,僅在串指令進(jìn)入新的頁(yè)面時(shí),才進(jìn)行一次GVA到HVA的代換,得到訪存所對(duì)應(yīng)的頁(yè)面的基址。只要不離開該頁(yè)面,后續(xù)的訪存操作只要修正一個(gè)位移量就可以到所需要的HVA,之后進(jìn)行內(nèi)存讀寫操作。
以rep stos為例,優(yōu)化后的串操作執(zhí)行步驟如下:
(1)獲取 ECX/EDI/EAX的值;
(2)若ECX為0,轉(zhuǎn)第 (7)步;
(3)根據(jù)EDI進(jìn)行地址代換,確定頁(yè)面的HVA;
(4)計(jì)算本頁(yè)面內(nèi)可進(jìn)行最小操作次數(shù);
(5)將EAX的值循環(huán)存入本頁(yè)面內(nèi)存區(qū)域;
(6)修正ECX/EDI的值,轉(zhuǎn)第 (2)步;
(7)結(jié)束。
對(duì)于大批量的內(nèi)存初始化操作而言,rep stos的主要操作集中在了第v步,此時(shí)頁(yè)面內(nèi)串指令的訪存速度可以接近宿主機(jī)本地的訪存速度。為簡(jiǎn)化實(shí)現(xiàn),我們僅對(duì)正向的(DF標(biāo)志為1)、對(duì)齊的、且采用32位地址的串指令采用上述優(yōu)化措施。
本文對(duì)上述優(yōu)化措施的適用性以及優(yōu)化后的存儲(chǔ)系統(tǒng)效率和操作系統(tǒng)引導(dǎo)效率進(jìn)行了測(cè)試。主要測(cè)試環(huán)境如下:虛擬機(jī)監(jiān)控器為ARCH-BRIDGE,宿主機(jī)為運(yùn)行中標(biāo)麒麟操作系統(tǒng)的SW-410平臺(tái),虛擬機(jī)操作系統(tǒng)為經(jīng)過服務(wù)裁剪的tty-linux (內(nèi)核版本為2.6.38)。
我們通過采樣操作系統(tǒng)引導(dǎo)過程中的訪存操作來評(píng)估上述優(yōu)化措施的適用性,見表2。其中,在指令流中 (靜態(tài))存在的337 623處線性地址計(jì)算操作中,97.3%的操作可以被優(yōu)化掉;在指令流中 (靜態(tài))存在的337 133處段界限檢查操作中,99.9%的操作可以被優(yōu)化掉。在動(dòng)態(tài)監(jiān)測(cè)到的25 770萬次訪存操作中,99.3%的操作可在mmu_rd_fast和mmu_wt_fast中完成。在以rep stos為例的44 692 206次串操作中,99.8%的訪存操作可以得到優(yōu)化。因此上述優(yōu)化措施具有很好的適用性。
表2 各個(gè)優(yōu)化措施的適用性
本文采用STEAM內(nèi)存帶寬測(cè)試程序來測(cè)試優(yōu)化措施對(duì)訪存帶寬的影響。優(yōu)化前后的ARCH-BRIDGE虛擬機(jī)訪存帶寬如圖4所示。由于STREAM中沒有采用串指令,因此我們忽略了對(duì)連續(xù)內(nèi)存訪問優(yōu)化的測(cè)試。測(cè)試表明,在啟用段級(jí)和頁(yè)級(jí)存儲(chǔ)仿真優(yōu)化的情況下,虛擬機(jī)的訪存帶寬提升了2.4~3倍。
ARCH-BRIDGE在采用優(yōu)化措施前后的操作系統(tǒng)平均引導(dǎo)時(shí)間如圖5所示,當(dāng)綜合采用上述3種優(yōu)化措施后,虛擬機(jī)的操作系統(tǒng)引導(dǎo)時(shí)間由65s降低為45.2s,速度提升了約30.4%。利用QEMU 0.10提供的TCG基址,我們將QEMU移植到了SW平臺(tái),移植后的操作系統(tǒng)平均引導(dǎo)時(shí)間為48.7s,在僅采用訪存優(yōu)化措施的情況下,ARCHBRIDGE的性能相比QEMU提升了7%。
圖4 采用優(yōu)化措施前后的虛擬機(jī)訪存帶寬
圖5 采用優(yōu)化措施前后的虛擬機(jī)OS平均引導(dǎo)時(shí)間
本文介紹了基于申威處理器的跨平臺(tái)系統(tǒng)虛擬機(jī)ARCH-BRIDGE及其設(shè)計(jì),對(duì)其存儲(chǔ)子系統(tǒng)的性能瓶頸進(jìn)行了識(shí)別和分析,并提出了x86段級(jí)存儲(chǔ)仿真優(yōu)化、頁(yè)級(jí)存儲(chǔ)仿真優(yōu)化、連續(xù)內(nèi)存訪問優(yōu)化等方法,使ARCHBRIDGE的訪存性能提升了2.4~3倍,操作系統(tǒng)引導(dǎo)速度提升了約30.4%。
相比典型的跨平臺(tái)系統(tǒng)虛擬機(jī)QEMU,本文的段級(jí)存儲(chǔ)仿真優(yōu)化可以在確保兼容的情況下提升訪存效率,而QEMU為了換取性能,在訪存時(shí)并不進(jìn)行段界限檢查,損失了兼容性;頁(yè)級(jí)存儲(chǔ)仿真優(yōu)化利用宿主機(jī)的ABI特性,可在不增加上下文切換開銷和較小代碼膨脹的情況下提升訪存效率,而QEMU將每條x86訪存指令翻譯為幾十條宿主機(jī)指令并內(nèi)聯(lián)在翻譯塊中,導(dǎo)致了很大的代碼膨脹,另外其寄存器動(dòng)態(tài)分配機(jī)制還會(huì)導(dǎo)致訪存過程中的寄存器溢出,降低效率;連續(xù)內(nèi)存訪問優(yōu)化可以使串指令以接近本地的效率進(jìn)行訪存,而QEMU只是簡(jiǎn)單地將串指令的單次操作嵌套在循環(huán)中重復(fù)執(zhí)行,帶來很多冗余操作,操作系統(tǒng)中存在許多使用串指令的任務(wù),如C2級(jí)操作系統(tǒng)一般都存在將內(nèi)存頁(yè)面清0的線程,因此該優(yōu)化措施有助于提升系統(tǒng)性能。測(cè)試表明,在僅采用訪存優(yōu)化措施的情況下,ARCHBRIDGE的操作系統(tǒng)引導(dǎo)性能相比QEMU提升了7%。
[1]CHEN Wei.Research on dynamic binary translation based codesigned virtual machine [D].Changsha:National University of Defense Technology,2010 (in Chinese).[陳微.基于動(dòng)態(tài)二進(jìn)制翻譯的協(xié)同設(shè)計(jì)虛擬機(jī)關(guān)鍵技術(shù)研究 [D].長(zhǎng)沙:國(guó)防科學(xué)技術(shù)大學(xué),2010.]
[2]Tong X,Luo J,Moshovos A.QTrace:An interface for customizable full system instrumentation [C]//IEEE International Symposium on Performance Analysis of System and Software,2013:132-133.
[3]Yin Heng,Song Dawn.TEMU-binary code analysis via wholesystem layered annotative execution [R].Berkeley: UC Berkeley,2010.
[4]Wang Z,Liu R,Chen Y.Coremu:A scalable and portable parallel full-system emulator [C]//Proceedings of the 16th ACM symposium on Principles and Practice of Parallel Programming.ACM,2011:213-222.
[5]El Ferezli E.FAx86:An open-source FPGA-accelerated x86 full-system emulator [D].University of Toronto,2011.
[6]Hu W,Wang J,Gao X.Godson-3:A scalable multicore RISC processor with X86emulation [J].Micro,IEEE,2009,29 (2):17-29.
[7]Guan HB,Ma RH,Yang HB.MTCrossBit:A dynamic binary translation system based on multithreaded optimization [J].Science China Information Sciences,2011,54 (10):2064-2078.
[8]Sridhar S,Shapiro JS,Bungale PP.HDTrans:A low-overhead dynamic translator [J].ACM SIGARCH Computer Architecture News,2007,35 (1):135-140.
[9]Ding JH,Chang PC,Hsu WC.PQEMU:A parallel system emulator based on QEMU [C]//IEEE 17th International Conference on Parallel and Distributed Systems,2011:276-283.
[10]Nicholas N,Seward J.Valgrind:A framework for heavyweight dynamic binary instrumentation [C]//ACM Sigplan Notices.ACM,2007,42 (6):89-100.