沙 賽 杜翰霖 羅英偉 汪小林 王振林
1(北京大學(xué)計(jì)算機(jī)科學(xué)技術(shù)系 北京 100871)
2(鵬城實(shí)驗(yàn)室 廣東深圳 518000)
3(密歇根理工大學(xué) 美國(guó)密歇根州霍頓市 49931)
(ss_boom@pku.edu.cn)
申威處理器采用自主指令集,是我國(guó)具有完全自主知識(shí)產(chǎn)權(quán)的處理器系列[1].初代申威指令集是在Alpha指令集的基礎(chǔ)上進(jìn)行擴(kuò)展的,但經(jīng)過(guò)不斷發(fā)展與完善,現(xiàn)在已經(jīng)成為獨(dú)立的自主可控的指令集.申威處理器最為典型的應(yīng)用場(chǎng)景是我國(guó)自主研發(fā)的神威·太湖之光超級(jí)計(jì)算機(jī).太湖之光超級(jí)計(jì)算機(jī)搭載了40 960個(gè)申威26010眾核處理器,其性能十分優(yōu)越,已蟬聯(lián)多次全球超算冠軍[2].申威架構(gòu)的應(yīng)用除眾核超級(jí)計(jì)算機(jī)之外,還有多核服務(wù)器,如申威1621服務(wù)器.本文的研究工作主要針對(duì)1621型服務(wù)器展開(kāi),探討申威處理器上高效的內(nèi)存虛擬化解決方案.該解決方案依托申威架構(gòu)特性,并適合在同一架構(gòu)下的多種型號(hào)的服務(wù)器上進(jìn)行推廣.虛擬化技術(shù)是云服務(wù)產(chǎn)業(yè)的核心支持技術(shù)之一,可以有效提高物理資源的利用率和系統(tǒng)的安全性[3-4].申威架構(gòu)下的虛擬化解決方案并不完善,仍處于發(fā)展階段.經(jīng)過(guò)近年來(lái)的不斷發(fā)展,申威架構(gòu)已經(jīng)形成了基本的虛擬化框架.虛擬化技術(shù)分為3個(gè)主要方面:CPU虛擬化、內(nèi)存虛擬化和I/O虛擬化[3].申威在CPU虛擬化和I/O虛擬化已經(jīng)有了較為完善的解決方案.而內(nèi)存虛擬化方面,當(dāng)前申威虛擬機(jī)采用固定大小的預(yù)留段式內(nèi)存進(jìn)行直接映射,虛擬機(jī)使用固定的物理內(nèi)存空間,虛擬機(jī)的數(shù)量及整個(gè)物理機(jī)內(nèi)存的使用極其受限,并不是真正意義上的內(nèi)存虛擬化[5].計(jì)算機(jī)系統(tǒng)中,CPU訪(fǎng)問(wèn)內(nèi)存首先需要進(jìn)行地址轉(zhuǎn)換,即虛擬地址轉(zhuǎn)換成物理地址.非虛擬化環(huán)境下只需要1維地址轉(zhuǎn)換.當(dāng)前申威虛擬機(jī)的內(nèi)存訪(fǎng)問(wèn)和非虛擬化環(huán)境下相似,只是一種權(quán)宜的解決方案.
作為最為復(fù)雜的虛擬化技術(shù),內(nèi)存虛擬化需要完成2維(2D)地址轉(zhuǎn)換,即客戶(hù)機(jī)虛擬地址(guest virtual address, gVA)到客戶(hù)機(jī)物理地址(guest physical address, gPA)再到宿主機(jī)物理地址(host physical address, hPA)的轉(zhuǎn)換(gVA→gPA→hPA).現(xiàn)有的內(nèi)存虛擬化解決方案主要包括3類(lèi):影子頁(yè)表(shadow page table, sPT)模型、嵌套頁(yè)表(nested page table, NPT)模型以及直接頁(yè)表[3].前2種屬于完全內(nèi)存虛擬化,虛擬機(jī)操作系統(tǒng)無(wú)需做任何修改;第3種屬于半虛擬化,需要修改虛擬機(jī)操作系統(tǒng)的源代碼.
本文工作主要針對(duì)完全虛擬化解決方案.影子頁(yè)表模型屬于軟件內(nèi)存虛擬化,不需要硬件支持.該模型的主要思想是采用一個(gè)頁(yè)表(即影子頁(yè)表)來(lái)直接保存客戶(hù)機(jī)虛擬地址到宿主機(jī)物理地址(gVA→hPA)的映射.在虛擬機(jī)進(jìn)行地址轉(zhuǎn)換過(guò)程中,內(nèi)存管理單元(memory manage unit, MMU)直接加載當(dāng)前進(jìn)程的影子頁(yè)表,加速2級(jí)地址轉(zhuǎn)換.影子頁(yè)表依賴(lài)寫(xiě)保護(hù)機(jī)制來(lái)同步客戶(hù)機(jī)頁(yè)表(guest page table, gPT)和影子頁(yè)表(sPT),這種模式造成了嚴(yán)重的虛擬機(jī)退出(VMExit)開(kāi)銷(xiāo).
嵌套頁(yè)表模型屬于硬件輔助內(nèi)存虛擬化,需要有專(zhuān)門(mén)的硬件支持,其代表有Intel拓展頁(yè)表(extended page table, EPT)和AMD嵌套頁(yè)表,兩者在原理和實(shí)現(xiàn)上基本一致[6].嵌套頁(yè)表保存了虛擬機(jī)物理地址到宿主機(jī)物理地址的映射關(guān)系.嵌套頁(yè)表模型的核心思想是MMU加載虛擬機(jī)進(jìn)程頁(yè)表,在頁(yè)表查詢(xún)(page walk)的過(guò)程中,從進(jìn)程頁(yè)表中獲取虛擬機(jī)物理地址,然后立即訪(fǎng)問(wèn)嵌套頁(yè)表,轉(zhuǎn)換成宿主機(jī)物理地址,再進(jìn)內(nèi)存訪(fǎng)問(wèn).嵌套頁(yè)表模型實(shí)現(xiàn)了地址轉(zhuǎn)換過(guò)程中的2維頁(yè)表代換,避免了影子頁(yè)表模型因同步產(chǎn)生的開(kāi)銷(xiāo).然而64位機(jī)器在不開(kāi)啟大頁(yè)機(jī)制的情況下,都具有4級(jí)頁(yè)表結(jié)構(gòu).嵌套頁(yè)表模型會(huì)導(dǎo)致1次地址轉(zhuǎn)換中存在遠(yuǎn)超非虛擬化環(huán)境下的多次內(nèi)存訪(fǎng)問(wèn).若無(wú)硬件輔助支持,嵌套頁(yè)表模型在1次2維頁(yè)表查詢(xún)過(guò)程中需要24次訪(fǎng)存[7-8].因此,處理器采用必要的硬件進(jìn)行輔助加速.硬件主要包括頁(yè)表查詢(xún)緩存(page walk cache, PWC)和嵌套旁路轉(zhuǎn)換緩存(nested translation lookaside buffer, NTLB).PWC緩存了頁(yè)表項(xiàng)(包括頁(yè)表物理頁(yè)幀號(hào)和頁(yè)內(nèi)偏移)為索引、次級(jí)頁(yè)表頁(yè)物理頁(yè)幀號(hào)為值的映射.PWC可以減少頁(yè)表查詢(xún)產(chǎn)生的訪(fǎng)存次數(shù)[9].NTLB通過(guò)緩存gPA到hPA的映射來(lái)優(yōu)化4級(jí)嵌套頁(yè)表的查詢(xún)[6].雖然NTLB可以有效減少嵌套頁(yè)表查詢(xún)的訪(fǎng)存次數(shù),但是NTLB的大小十分有限,尤其是對(duì)于訪(fǎng)存局部性較差的程序,系統(tǒng)就會(huì)產(chǎn)生較多的NTLB miss,2維4級(jí)頁(yè)表的嵌套查詢(xún)?nèi)詴?huì)造成顯著的性能開(kāi)銷(xiāo).
目前申威架構(gòu)缺乏嵌套頁(yè)表所需的硬件輔助,因此,難以實(shí)現(xiàn)傳統(tǒng)意義上的嵌套頁(yè)表模型.幸運(yùn)的是,申威架構(gòu)具有獨(dú)特的特權(quán)程序可編程接口(hardware mode code, HMcode),提供了底層軟件靈活性[10].在HMcode中,系統(tǒng)開(kāi)發(fā)者可以通過(guò)軟件實(shí)現(xiàn)豐富的類(lèi)硬件支持,特別是虛擬化支持,如虛擬中斷、虛擬機(jī)退出/陷入(VMExit/VMEntry)等.基于申威架構(gòu)這一特性,本文實(shí)現(xiàn)了申威架構(gòu)下的平滑嵌套頁(yè)表模型(swFNPT).該模型通過(guò)純軟件的優(yōu)化,彌補(bǔ)了申威架構(gòu)硬件不足的缺點(diǎn),實(shí)現(xiàn)了申威處理器上真正意義的內(nèi)存虛擬化.
申威處理器現(xiàn)有的內(nèi)存虛擬化方案采用了預(yù)留內(nèi)存的直接映射模型實(shí)現(xiàn)虛擬機(jī)的內(nèi)存訪(fǎng)問(wèn).該模型要求宿主機(jī)將物理內(nèi)存進(jìn)行預(yù)留,僅虛擬機(jī)可使用這部分內(nèi)存.因?yàn)橹苯邮褂谩盎?偏移”的方式進(jìn)行1維地址轉(zhuǎn)換,這種設(shè)計(jì)不存在額外的內(nèi)存虛擬化開(kāi)銷(xiāo).然而,這種實(shí)現(xiàn)既不符合內(nèi)存虛擬化的理念,在資源使用上也存在著資源利用率低、靈活性差等問(wèn)題.
Gandhi等人[7]也提出通過(guò)直接映射模型加速虛擬化環(huán)境下的地址轉(zhuǎn)換,從而減少頁(yè)表訪(fǎng)問(wèn)帶來(lái)的開(kāi)銷(xiāo).他們先是在非虛擬化環(huán)境下,針對(duì)大工作集程序?qū)崿F(xiàn)了一種段式內(nèi)存映射,然后將這種方案拓展到內(nèi)存虛擬化當(dāng)中.他們?yōu)?個(gè)虛擬機(jī)申請(qǐng)充足的連續(xù)物理內(nèi)存,該虛擬機(jī)的地址轉(zhuǎn)換就變成了簡(jiǎn)單的段基址加偏移,這樣直接避免了4級(jí)頁(yè)表的訪(fǎng)問(wèn),提高了轉(zhuǎn)換效率.但是,這種直接映射要求虛擬機(jī)的物理內(nèi)存是連續(xù)的,這可能導(dǎo)致一些內(nèi)存資源的損失,降低了內(nèi)存利用率;另一方面,這種設(shè)計(jì)直接喪失內(nèi)存虛擬化帶來(lái)的靈活性,不能夠根據(jù)應(yīng)用的需要調(diào)節(jié)虛擬機(jī)的內(nèi)存,也難以細(xì)粒度地進(jìn)行內(nèi)存管理.這種設(shè)計(jì)也難以和現(xiàn)有的一些虛擬機(jī)功能有效兼容,比如虛擬機(jī)熱遷移.
Ahn等人[11]提出將4級(jí)嵌套頁(yè)表改為1級(jí)嵌套頁(yè)表,即平滑嵌套頁(yè)表(flat nested page table).該設(shè)計(jì)將2維嵌套頁(yè)表查詢(xún)最壞情況下需要24次訪(fǎng)存縮減到最多9次訪(fǎng)存.該設(shè)計(jì)保留硬件輔助虛擬化支持,是通過(guò)全功能模擬器進(jìn)行評(píng)估,由于進(jìn)行了必要的硬件改造,無(wú)法在真機(jī)上實(shí)現(xiàn).HMcode恰好為申威處理器實(shí)現(xiàn)這一設(shè)計(jì)提供了條件.本文吸收了該工作的思想,在申威架構(gòu)下實(shí)現(xiàn)了平滑嵌套頁(yè)表來(lái)緩解頁(yè)表查詢(xún)壓力.
采用大頁(yè)機(jī)制可以有效緩解嵌套頁(yè)表查詢(xún)壓力.因?yàn)槭褂么箜?yè)可以將4級(jí)頁(yè)表縮短為3級(jí)甚至2級(jí)頁(yè)表,加快了頁(yè)表查詢(xún)的速度.同時(shí)每個(gè)映射都具有更大的映射空間,TLB miss率也會(huì)顯著下降.然而,大頁(yè)機(jī)制存在著碎片化嚴(yán)重、資源浪費(fèi)、靈活性差、不支持虛擬機(jī)熱遷移等諸多問(wèn)題.針對(duì)這些問(wèn)題,研究者們提出了一系列的解決方案來(lái)緩解大頁(yè)機(jī)制帶來(lái)的弊端.Guo等人[12]在VMware上提出了主動(dòng)積極拆分大頁(yè)的技術(shù)方案來(lái)緩解大頁(yè)導(dǎo)致的內(nèi)存資源浪費(fèi)問(wèn)題;針對(duì)大頁(yè)機(jī)制不適應(yīng)于NUMA架構(gòu)的問(wèn)題,Gaud等人[13]提出了改良版的Carrefour算法來(lái)保障大頁(yè)機(jī)制在NUMA架構(gòu)上的性能;Pham等人[14]則提出了一種推測(cè)式大頁(yè)機(jī)制來(lái)進(jìn)行大頁(yè)的輕量級(jí)管理.
研究者們?cè)趦?nèi)存虛擬化領(lǐng)域進(jìn)行諸多嘗試與探索,取得了一系列豐富成果.然而一方面,一些方法需要依賴(lài)一定的硬件改造;另一方面,由于申威架構(gòu)的特殊性,針對(duì)申威架構(gòu)的內(nèi)存虛擬化工作還存在很大的空白.本文借鑒吸收國(guó)內(nèi)外先進(jìn)的研究經(jīng)驗(yàn),提出了首個(gè)申威架構(gòu)下的純軟件的嵌套頁(yè)表內(nèi)存虛擬化解決方案.
本節(jié)主要介紹申威架構(gòu)虛擬化框架的相關(guān)實(shí)現(xiàn),主要包括申威架構(gòu)CPU特權(quán)級(jí)模型、虛擬化模型支持以及申威HMcode.
如圖1所示,申威CPU具有4個(gè)特權(quán)模式,由高到低分別是硬件模式(L-0)、虛擬模式、核心模式(L-1)以及用戶(hù)模式(L-2).特有的HMcode運(yùn)行在最高權(quán)限的硬件模式.該接口主要用于代替部分硬件功能,這些功能用硬件實(shí)現(xiàn)過(guò)于復(fù)雜,而又無(wú)法用常規(guī)程序?qū)崿F(xiàn),例如頁(yè)表代換、進(jìn)程上下文切換、TLB刷新等;也用于實(shí)現(xiàn)一些原子操作和一些兼容不同平臺(tái)的代碼.虛擬模式暫未啟用;核心模式類(lèi)似于X86架構(gòu)的內(nèi)核模式,操作系統(tǒng)運(yùn)行在該模式下;用戶(hù)模式具有最低的特權(quán)級(jí),用戶(hù)程序在該模式下執(zhí)行.其他非硬件模式都可以通過(guò)受限的系統(tǒng)調(diào)用(syscall)調(diào)用硬件模式下的特權(quán)指令實(shí)現(xiàn)一些底層支持.
Fig. 1 The privilege modes of Sunway CPU圖1 申威CPU特權(quán)模式
如圖2所示,申威CPU具有和Intel X86 VT-X根/非根模式(root/non-root mode)類(lèi)似的虛擬化模式.宿主機(jī)和客戶(hù)機(jī)分別在根/非根模式下運(yùn)行,但兩者都具有核心模式和用戶(hù)模式.宿主機(jī)操作系統(tǒng)及虛擬機(jī)管理器(virtual machine monitor, VMM,也稱(chēng)hypervisor)運(yùn)行在根模式下的內(nèi)核模式特權(quán)級(jí).VMEntry實(shí)現(xiàn)根模式到非根模式的切換,VMExit實(shí)現(xiàn)非根模式到根模式的切換.例如,虛擬機(jī)觸發(fā)時(shí)鐘中斷處理時(shí),虛擬機(jī)觸發(fā)1次VMExit.首先,系統(tǒng)保存客戶(hù)機(jī)上下文信息,其中包括主要的CPU寄存器狀態(tài)、棧指針、欲執(zhí)行的指令地址(PC)等.然后系統(tǒng)恢復(fù)宿主機(jī)上下文信息,陷入VMM進(jìn)行時(shí)鐘同步處理;處理結(jié)束后,CPU觸發(fā)VMEntry,恢復(fù)虛擬機(jī)上下文信息,進(jìn)入虛擬機(jī),繼續(xù)執(zhí)行指令.和X86不同的是,申威架構(gòu)具有最高權(quán)限的硬件模式,該模式不受根/非根虛擬化模式的限制,任何模式都可以通過(guò)受限的系統(tǒng)調(diào)用陷入硬件模式.
Fig. 2 The virtualization mode of Sunway CPU圖2 申威CPU虛擬化模式
HMcode運(yùn)行在最高特權(quán)的硬件模式(如圖1、圖2所示),該接口處于內(nèi)核和硬件之間,屬于固件.代碼保存在flash部件中,形式上類(lèi)似于RAM BIOS.特權(quán)程序可以以物理地址直接訪(fǎng)問(wèn)全局地址空間,也可以直接訪(fǎng)問(wèn)寄存器.特別地,申威架構(gòu)是軟件管理的TLB,這為實(shí)現(xiàn)內(nèi)存虛擬化提供了必要支持.TLB miss之后,特權(quán)入口TLB_MISS_ENTRY接管TLB miss處理,進(jìn)行頁(yè)表查詢(xún)和TLB填充.我們?cè)赥LB_MISS_ENTRY中實(shí)現(xiàn)嵌套頁(yè)表的相關(guān)邏輯,具體實(shí)現(xiàn)在第3節(jié)進(jìn)行詳細(xì)闡述.HMcode為上層應(yīng)用提供豐富的系統(tǒng)調(diào)用接口,但不同CPU模式具有不同的調(diào)用權(quán)限,例如內(nèi)核進(jìn)程可使用如進(jìn)程上下文切換、讀寄存器、TLB刷新等功能的系統(tǒng)調(diào)用;而用戶(hù)進(jìn)程無(wú)法使用此類(lèi)內(nèi)核級(jí)調(diào)用.
現(xiàn)有的完全內(nèi)存虛擬化模型包括影子頁(yè)表模型和嵌套頁(yè)表模型.圖3展示了2種模型的工作原理.
Fig. 3 The principles of shadow page table model and nested page table model圖3 影子頁(yè)表模型和嵌套頁(yè)表模型原理
圖3(a)是影子頁(yè)表模型的工作原理.VMM為每個(gè)虛擬機(jī)進(jìn)程建立一套影子頁(yè)表,用于保存客戶(hù)機(jī)虛擬地址到宿主機(jī)物理地址之間的映射.在地址轉(zhuǎn)換過(guò)程中,一旦發(fā)生TLB缺失,CPU觸發(fā)頁(yè)表查詢(xún)過(guò)程.實(shí)際加載到頁(yè)表基地址寄存器CR3中的是影子頁(yè)表基地址,所以MMU對(duì)影子頁(yè)表進(jìn)行頁(yè)表查詢(xún).影子頁(yè)表模型的優(yōu)點(diǎn)是通過(guò)1維頁(yè)表緩存2維地址轉(zhuǎn)換,提高了地址轉(zhuǎn)換的效率.然而,VMM需要維護(hù)影子頁(yè)表的正確性,一旦客戶(hù)機(jī)操作系統(tǒng)修改了客戶(hù)機(jī)進(jìn)程頁(yè)表,影子頁(yè)表也需要進(jìn)行相應(yīng)的修正.這就是影子頁(yè)表模型最大的開(kāi)銷(xiāo)所在,即如何同步客戶(hù)機(jī)進(jìn)程頁(yè)表和影子頁(yè)表.客戶(hù)機(jī)修改進(jìn)程頁(yè)表不是系統(tǒng)級(jí)事件,VMM無(wú)法感知這一操作.傳統(tǒng)的方式是寫(xiě)保護(hù)機(jī)制,VMM對(duì)所有的客戶(hù)機(jī)進(jìn)程頁(yè)表頁(yè)施加寫(xiě)保護(hù),一旦進(jìn)程頁(yè)表頁(yè)被修改,就會(huì)觸發(fā)寫(xiě)保護(hù)錯(cuò)誤,進(jìn)而觸發(fā)VMExit而陷入VMM.所以,影子頁(yè)表模型的缺點(diǎn)就是不適應(yīng)于高頻頁(yè)表修改的應(yīng)用程序(如gcc).過(guò)度的頁(yè)表修改會(huì)導(dǎo)致大量的VMExit,每一次VMExit/VMEntry都需要TLB清空、上下文切換等操作,開(kāi)銷(xiāo)十分顯著.
圖3(b)是嵌套頁(yè)表模型的工作原理.嵌套頁(yè)表模型的基本思想是通過(guò)嵌套頁(yè)表保存gPA到hPA的映射,虛擬機(jī)在進(jìn)程頁(yè)表查詢(xún)時(shí)獲取gPA,然后訪(fǎng)問(wèn)嵌套頁(yè)表進(jìn)行第2維的地址轉(zhuǎn)換(gPA→hPA).相較于影子頁(yè)表模型,嵌套頁(yè)表模型消除了因?yàn)橛白禹?yè)表同步造成的虛擬化開(kāi)銷(xiāo),并且有效降低了內(nèi)存虛擬化的復(fù)雜程度.然而,嵌套頁(yè)表模型會(huì)導(dǎo)致更多的頁(yè)表查詢(xún)開(kāi)銷(xiāo).64位系統(tǒng)具有4級(jí)頁(yè)表,每一級(jí)進(jìn)程頁(yè)表查詢(xún)都需要進(jìn)行1次嵌套頁(yè)表的查詢(xún),每一級(jí)嵌套頁(yè)表的查詢(xún)都需要1次訪(fǎng)存操作.頁(yè)表基地址寄存器(CR3)、4級(jí)進(jìn)程頁(yè)表及數(shù)據(jù)頁(yè)地址各1次轉(zhuǎn)換,因此在無(wú)硬件輔助支持的條件下共需24次訪(fǎng)存[15].為了緩解這一開(kāi)銷(xiāo),研究者們提出了NTLB的硬件部件,用于直接保存第2維的地址映射,其基本功能等同于CPU TLB.因?yàn)槭怯布考?,因此具有極高的查詢(xún)效率(數(shù)個(gè)CPU周期).NTLB可以顯著提高嵌套頁(yè)表的查詢(xún)效率.
但是,目前的申威芯片仍處于不斷發(fā)展與完善階段,很多相關(guān)的硬件支持(比如DMA等)均未實(shí)現(xiàn),嵌套頁(yè)表所需的相關(guān)硬件同樣也未提供.硬件支持的缺乏意味著如果在申威處理器上實(shí)現(xiàn)嵌套頁(yè)表模型,每次地址轉(zhuǎn)換都需要24次訪(fǎng)存,相較于非虛擬化環(huán)境的4次訪(fǎng)存,顯然這一開(kāi)銷(xiāo)是難以接受的.因此,我們改進(jìn)了傳統(tǒng)的嵌套頁(yè)表模型,基于申威架構(gòu)的HMcode,在申威處理器上實(shí)現(xiàn)了首個(gè)平滑嵌套頁(yè)表的內(nèi)存虛擬化解決方案.一方面為申威虛擬機(jī)實(shí)現(xiàn)真正意義的內(nèi)存虛擬化,另一方面我們也希望通過(guò)這一方案為新一代申威處理器的硬件輔助虛擬化設(shè)計(jì)提供相應(yīng)的理論和實(shí)驗(yàn)支持.
申威架構(gòu)缺少硬件上的內(nèi)存虛擬化支持,因此在地址轉(zhuǎn)換開(kāi)銷(xiāo)上難以接受.為了解決這一問(wèn)題,我們采用平滑(1級(jí))嵌套頁(yè)表機(jī)制來(lái)緩解開(kāi)銷(xiāo).圖4展示了平滑嵌套頁(yè)表基本原理.平滑嵌套頁(yè)表由一段連續(xù)的物理內(nèi)存存儲(chǔ),任何對(duì)于該頁(yè)表的查詢(xún)都只需要根據(jù)“基地址+偏移”的模式進(jìn)行訪(fǎng)問(wèn).平滑嵌套頁(yè)表以客戶(hù)機(jī)物理頁(yè)幀號(hào)(guest-physical frame number, GFN)為索引,其中每個(gè)條目保存著對(duì)應(yīng)的宿主機(jī)物理頁(yè)幀號(hào)(physical frame number, PFN).宿主機(jī)物理頁(yè)幀號(hào)和客戶(hù)機(jī)物理地址的頁(yè)內(nèi)偏移組成宿主機(jī)物理地址.相較于4級(jí)嵌套頁(yè)表,訪(fǎng)問(wèn)1次平滑嵌套頁(yè)表僅需要1次訪(fǎng)存,整個(gè)2維嵌套頁(yè)表查詢(xún)最多需要9次訪(fǎng)存.然而平滑嵌套頁(yè)表的設(shè)計(jì)需要重構(gòu)查詢(xún)嵌套頁(yè)表的MMU,這在X86服務(wù)器上無(wú)法實(shí)現(xiàn).而申威架構(gòu)HMcode提供了底層支持的軟件可編程性,我們可以在HMcode中軟件編程實(shí)現(xiàn)嵌套頁(yè)表所需的一些底層支持.
Fig. 4 The principle of flat nested page table圖4 平滑嵌套頁(yè)表原理
平滑嵌套頁(yè)表模型主要分為3部分:頁(yè)表初始化、頁(yè)表查詢(xún)和頁(yè)表缺頁(yè)處理.當(dāng)前的申威服務(wù)器以QEMU/KVM為基本虛擬化框架,底層的頁(yè)表查詢(xún)模塊實(shí)現(xiàn)在HMcode中.平滑嵌套頁(yè)表將依托于申威架構(gòu)特性來(lái)設(shè)計(jì),圖5展示了申威架構(gòu)下平滑嵌套頁(yè)表的基本框架.
Fig. 5 The framework of flat nested page table under Sunway architecture圖5 申威架構(gòu)平滑嵌套頁(yè)表框架
1) 平滑嵌套頁(yè)表的初始化.VMM需要根據(jù)虛擬機(jī)的物理內(nèi)存大小來(lái)申請(qǐng)相應(yīng)的連續(xù)內(nèi)存保存平滑嵌套頁(yè)表.
2) 平滑嵌套頁(yè)表的查詢(xún).查詢(xún)平滑嵌套頁(yè)表的MMU(FNPT MMU)應(yīng)實(shí)現(xiàn)于HMcode.目前申威的MMU是以軟件形式實(shí)現(xiàn)在HMcode中.Software MMU在訪(fǎng)問(wèn)每一級(jí)客戶(hù)機(jī)進(jìn)程頁(yè)表時(shí)需要通過(guò)FNPT MMU訪(fǎng)問(wèn)平滑嵌套頁(yè)表將gPA轉(zhuǎn)換成hPA.
3) 平滑嵌套頁(yè)表缺頁(yè)處理.FNPT MMU查詢(xún)頁(yè)表時(shí)可能觸發(fā)缺頁(yè)中斷,通過(guò)VMExit接口進(jìn)入VMM中進(jìn)行缺頁(yè)處理.缺頁(yè)處理結(jié)束之后,通過(guò)VMEntry接口重新進(jìn)入客戶(hù)機(jī)完成地址轉(zhuǎn)換.
我們?cè)谏晖?621服務(wù)器上實(shí)現(xiàn)了平滑嵌套頁(yè)表模型.在虛擬機(jī)運(yùn)行過(guò)程中,CPU根據(jù)客戶(hù)機(jī)虛擬地址查詢(xún)TLB進(jìn)行地址轉(zhuǎn)換.系統(tǒng)發(fā)生TLB缺失,立刻陷入TLB缺失處理入口進(jìn)行TLB缺失處理.MMU加載客戶(hù)機(jī)進(jìn)程頁(yè)表開(kāi)始進(jìn)行2維頁(yè)表查詢(xún),客戶(hù)機(jī)進(jìn)程頁(yè)表保存了gVA到gPA的映射關(guān)系,每一級(jí)頁(yè)表的頁(yè)表項(xiàng)都保存了1個(gè)客戶(hù)機(jī)物理頁(yè)幀號(hào)和對(duì)應(yīng)的權(quán)限位信息.首先,MMU訪(fǎng)問(wèn)FNPT MMU嘗試將進(jìn)程頁(yè)表基地址(gPA)轉(zhuǎn)換成hPA;然后,4級(jí)進(jìn)程頁(yè)表的每一輪查詢(xún)都需要訪(fǎng)問(wèn)FNPT MMU將gPA轉(zhuǎn)化成hPA;最后,MMU將gVA到hPA的映射使用軟件填充TLB.至此,1次虛擬化環(huán)境下的地址轉(zhuǎn)換完成.
在嵌套頁(yè)表模型中,系統(tǒng)可能發(fā)生2種缺頁(yè)中斷:1)客戶(hù)機(jī)進(jìn)程頁(yè)表不完整導(dǎo)致的缺頁(yè)中斷;2)嵌套頁(yè)表不完整導(dǎo)致的嵌套頁(yè)表缺頁(yè)中斷.當(dāng)MMU查詢(xún)客戶(hù)機(jī)進(jìn)程頁(yè)表時(shí),會(huì)檢查頁(yè)表項(xiàng)的權(quán)限位,若有效位為0,則觸發(fā)1次客戶(hù)機(jī)缺頁(yè)異常處理,系統(tǒng)進(jìn)入虛擬機(jī)內(nèi)核缺頁(yè)處理程序進(jìn)行缺頁(yè)處理,填充進(jìn)程頁(yè)表.缺頁(yè)中斷處理結(jié)束后,系統(tǒng)再次執(zhí)行產(chǎn)生TLB miss重新開(kāi)始地址轉(zhuǎn)換.當(dāng)FNPT MMU查詢(xún)平滑嵌套頁(yè)表時(shí),有可能發(fā)生缺頁(yè)中斷,此時(shí)觸發(fā)1次嵌套頁(yè)表缺頁(yè)處理.
系統(tǒng)通過(guò)VMExit接口進(jìn)行上下文切換,CPU進(jìn)入VMM進(jìn)行嵌套頁(yè)表缺頁(yè)處理.首先根據(jù)傳入的GFN調(diào)用_gfn_to_pfn_memslot()接口將GFN轉(zhuǎn)化成對(duì)應(yīng)的PFN.該接口首先將虛擬機(jī)物理頁(yè)幀號(hào)轉(zhuǎn)化成宿主機(jī)虛擬頁(yè)號(hào),因?yàn)樘摂M機(jī)物理地址空間和虛擬機(jī)管理進(jìn)程(QEMU進(jìn)程)的虛擬地址空間都是連續(xù)的,因此兩者之間通過(guò)“基地址+偏移”的方式直接轉(zhuǎn)換;其次,該接口查詢(xún)宿主機(jī)進(jìn)程頁(yè)表,將虛地址轉(zhuǎn)化成物理地址;最后VMM以GFN為索引,將對(duì)應(yīng)的PFN插入嵌套頁(yè)表.至此,1次嵌套頁(yè)表的缺頁(yè)處理完成,VMM調(diào)用VMEntry接口切換上下文,重新陷入虛擬機(jī),CPU再次執(zhí)行產(chǎn)生TLB缺失的指令,重新進(jìn)行地址轉(zhuǎn)換.
我們?cè)谡鏅C(jī)環(huán)境下評(píng)估了申威架構(gòu)下的平滑嵌套頁(yè)表模型.實(shí)驗(yàn)組物理機(jī)是申威1621服務(wù)器,該服務(wù)器具有16個(gè)物理核心,主頻約為1.6 GHz,搭載深度操作系統(tǒng)15.02.對(duì)照組物理機(jī)是基于X86架構(gòu)的Intel服務(wù)器,主頻約為2.1 GHz,搭載的是Ubuntu 16.04服務(wù)器版操作系統(tǒng).具體參數(shù)如表1所示.
Table 1 Experimental Machine Configuration表1 實(shí)驗(yàn)機(jī)參數(shù)配置
因?yàn)楝F(xiàn)有的申威服務(wù)器不具有真正意義的內(nèi)存虛擬化功能,所以對(duì)照組機(jī)器選擇相同軟件配置的Intel X86服務(wù)器.在X86架構(gòu)下,我們對(duì)影子頁(yè)表模型(X86-SP)和拓展頁(yè)表模型(X86-EPT)分別進(jìn)行了測(cè)試.
嵌套頁(yè)表模型需要預(yù)熱處理(warm-up).在每輪測(cè)試程序運(yùn)行前,需要首先運(yùn)行一個(gè)較大工作集程序進(jìn)行預(yù)熱處理,保證嵌套頁(yè)表完成缺頁(yè)處理.若在虛擬機(jī)啟動(dòng)初期直接運(yùn)行測(cè)試程序,系統(tǒng)會(huì)產(chǎn)生大量的嵌套頁(yè)表缺頁(yè)處理中斷,降低程序性能.這種處理是考慮到云服務(wù)器的應(yīng)用都具有較長(zhǎng)工作周期,嵌套頁(yè)表的缺頁(yè)處理一般只發(fā)生在虛擬機(jī)啟動(dòng)前期,預(yù)熱操作之后的實(shí)驗(yàn)結(jié)果更能體現(xiàn)虛擬機(jī)在一個(gè)長(zhǎng)周期內(nèi)的真實(shí)性能.
我們選擇了SPEC CPU 2006,SPEC CPU 2017,Graph500,Memcached等應(yīng)用作為測(cè)評(píng)程序.SPEC CPU 2006采用ref集進(jìn)行測(cè)試.SPEC CPU 2006測(cè)試程序工作集普遍較小(均低于3 GB),為進(jìn)一步驗(yàn)證模型的效果,我們從SPEC CPU 2017測(cè)試集中挑選了8個(gè)具有較大工作集的測(cè)試程序.表2展示了這8組程序的工作集信息.我們也選用了較為典型的云服務(wù)程序Memcached和Graph500測(cè)試swFNPT模型的性能.最后我們使用STREAM評(píng)估虛擬機(jī)系統(tǒng)內(nèi)存帶寬損失.
Table 2 Benchmarks of SPEC CPU 2017表2 SPEC CPU 2017測(cè)試程序 GB
4.3.1 內(nèi)存虛擬化整體性能測(cè)試
SPEC CPU 2006測(cè)試集具有多個(gè)測(cè)試子程序,不同程序具有不同的訪(fǎng)存特征,能夠較為全面地反映系統(tǒng)訪(fǎng)存性能.表3展示的是swFNPT,Intel X86-EPT,Intel X86-SP這3組模型使用SPEC CPU 2006測(cè)試集的實(shí)驗(yàn)結(jié)果.實(shí)驗(yàn)結(jié)果表明,適配swFNPT模型的申威虛擬機(jī)整體性能良好,SPEC CPU 2006全集平均性能開(kāi)銷(xiāo)僅為3.24%.申威服務(wù)器內(nèi)存虛擬化與Intel X86下2組模型的平均性能開(kāi)銷(xiāo)基本相當(dāng).
如第3節(jié)所述,相較于傳統(tǒng)的影子頁(yè)表模型,嵌套頁(yè)表的主要優(yōu)點(diǎn)是消除了頁(yè)表同步的開(kāi)銷(xiāo).這一優(yōu)點(diǎn)展現(xiàn)在具有頻繁修改頁(yè)表特性的測(cè)試程序(如403.gcc)上.如表3所示,基于嵌套頁(yè)表的X86-EPT和swFNPT在403.gcc程序的開(kāi)銷(xiāo)均低于基于影子頁(yè)表的X86-SP.
在SPEC CPU 2006的實(shí)驗(yàn)結(jié)果中429.mcf具有超過(guò)20%的性能開(kāi)銷(xiāo).且X86架構(gòu)下的Intel X86-EPT同樣具有高達(dá)8.39%的虛擬化開(kāi)銷(xiāo),但I(xiàn)ntel X86-SP的開(kāi)銷(xiāo)低于5%,這是由該程序的訪(fǎng)存特性所決定的.429.mcf是典型的局部性較差的程序,這導(dǎo)致該類(lèi)程序的TLB缺失率高,MMU壓力更大.在地址轉(zhuǎn)換過(guò)程中,該類(lèi)程序需要頻繁進(jìn)行頁(yè)表查詢(xún)操作.64位操作系統(tǒng)采用4級(jí)頁(yè)表,基于影子頁(yè)表模型的地址轉(zhuǎn)換最多產(chǎn)生5次存儲(chǔ)訪(fǎng)問(wèn),考慮到PWC硬件支持,這一開(kāi)銷(xiāo)會(huì)更小[9].相反地,采用嵌套頁(yè)表模型,無(wú)論是Intel EPT還是swFNPT都需要2維頁(yè)表查詢(xún),這大大加劇了頁(yè)表查詢(xún)的開(kāi)銷(xiāo).這一特性在之前的研究工作中也有明確體現(xiàn).Pham等人[14]指出使用嵌套頁(yè)表模型的虛擬化系統(tǒng)中運(yùn)行429.mcf,地址轉(zhuǎn)換在整個(gè)程序運(yùn)行周期中占比高達(dá)40%.我們?cè)贗ntel X86機(jī)器上通過(guò)硬件計(jì)數(shù)器統(tǒng)計(jì)地址轉(zhuǎn)換開(kāi)銷(xiāo)并建模實(shí)驗(yàn)獲得了近似的實(shí)驗(yàn)結(jié)果.此外,在非虛擬化環(huán)境下429.mcf仍有22%的執(zhí)行時(shí)間用于地址轉(zhuǎn)換.汪小林等人[16]的工作也明確指出429.mcf在使用嵌套頁(yè)表模型時(shí)具有明顯的內(nèi)存虛擬化開(kāi)銷(xiāo).
Table 3 Experimental Results of SPEC CPU 2006表3 SPEC CPU 2006測(cè)試結(jié)果 %
429.mcf實(shí)驗(yàn)結(jié)果表明,Intel X86-EPT比申威swFNPT內(nèi)存虛擬化開(kāi)銷(xiāo)更小.這一差距主要原因分為2個(gè)方面:1)硬件支持(PWC,NTLB)和TLB;2)Cache容量.PWC和NTLB可以有效減少2維頁(yè)表查詢(xún)中的訪(fǎng)存次數(shù),申威服務(wù)器暫未實(shí)現(xiàn)這2個(gè)功能部件.盡管swFNPT將每次頁(yè)表查詢(xún)中的訪(fǎng)存次數(shù)控制在9次,但是相較于具有硬件輔助的內(nèi)存虛擬化實(shí)現(xiàn),swFNPT平均的訪(fǎng)存次數(shù)仍然較高.由表1可知,Intel服務(wù)器的1級(jí)TLB容量為申威服務(wù)器的2倍,2級(jí)TLB容量為申威服務(wù)器的3倍.Intel服務(wù)器的2級(jí)Cache容量為申威服務(wù)器的2倍,且Intel服務(wù)器具有第3級(jí)Cache.更大的TLB容量將大大降低程序的TLB缺失率,緩解MMU壓力.更大的2級(jí)Cache容量將有助于提升地址轉(zhuǎn)換中訪(fǎng)存效率.
4.3.2 大工作集程序虛擬化性能測(cè)試
為進(jìn)一步驗(yàn)證平滑嵌套頁(yè)表模型的性能,我們?cè)谏晖?wù)器上運(yùn)行測(cè)試SPEC CPU 2017中8個(gè)內(nèi)存用量較大的程序.實(shí)驗(yàn)結(jié)果如表4所示,平滑嵌套頁(yè)表模型的平均開(kāi)銷(xiāo)僅為4.12%,最大開(kāi)銷(xiāo)不超過(guò)9.2%.這一實(shí)驗(yàn)結(jié)果說(shuō)明該模型在較大內(nèi)存壓力的情況下仍有較好的性能.特別地,結(jié)合4.3.1節(jié)SPEC CPU 2006的實(shí)驗(yàn)結(jié)果,我們發(fā)現(xiàn)605.mcf程序虛擬化開(kāi)銷(xiāo)明顯低于429.mcf程序的開(kāi)銷(xiāo).這是因?yàn)楹笳呔植啃愿睿@一特性也有相關(guān)研究給出[17].
Table 4 Experimental Results of SPEC CPU 2017表4 SPEC CPU 2017測(cè)試結(jié)果
4.3.3 典型云服務(wù)應(yīng)用內(nèi)存虛擬化性能測(cè)試
表5展示了Memcached和Graph500的2組典型云服務(wù)應(yīng)用的實(shí)驗(yàn)結(jié)果.Memcached使用memcslap腳本進(jìn)行測(cè)試,其中并發(fā)參數(shù)為100;Graph500使用OpenMPI框架運(yùn)行節(jié)點(diǎn)數(shù)為220.結(jié)果表明Memcached測(cè)試中,swFNPT和X86-EPT虛擬化開(kāi)銷(xiāo)均低于X86-SP.這是因?yàn)镸emcached程序具有較為頻繁的進(jìn)程切換,而影子頁(yè)表模型在進(jìn)程切換時(shí)都需要產(chǎn)生VMExit進(jìn)行頁(yè)目錄表寄存器的更新,開(kāi)銷(xiāo)較大.Graph500是較為典型的大規(guī)模并行程序,我們使用OpenMPI框架運(yùn)行.該程序在Intel X86-EPT模型上的開(kāi)銷(xiāo)約為5%,在Intel X86-SP模型上開(kāi)銷(xiāo)約為6%,在swFNPT模型上開(kāi)銷(xiāo)低于8%.
Table 5 Experimental Results of Memcached and Graph500表5 Memcached和Graph500測(cè)試結(jié)果 %
4.3.4 虛擬機(jī)內(nèi)存帶寬
STREAM是廣泛使用的用于測(cè)試系統(tǒng)內(nèi)存帶寬的工具.我們使用STREAM 2.0測(cè)試了虛擬化系統(tǒng)中的內(nèi)存帶寬.試驗(yàn)結(jié)果表明,相較于非虛擬化環(huán)境,swFNPT產(chǎn)生的內(nèi)存帶寬損失低于3%.我們?cè)谙嗤能浖h(huán)境下分別進(jìn)行了Intel X86-EPT和X86-SP的實(shí)驗(yàn),帶寬損失分別為2.88%和3.27%.
4.3.5 實(shí)驗(yàn)總結(jié)
4.3.1~4.3.4節(jié)的實(shí)驗(yàn)結(jié)果表明:swFNPT在大多數(shù)應(yīng)用程序上表現(xiàn)良好,諸如400.perlbench等18個(gè)程序虛擬化開(kāi)銷(xiāo)均低于3%.特別地,401.bzip2,435.gromacs,603.bwaves等程序的虛擬化開(kāi)銷(xiāo)低于1%.SPEC CPU 2017的實(shí)驗(yàn)表明swFNPT模型在較大內(nèi)存壓力下也能表現(xiàn)出良好的性能.在內(nèi)存帶寬方面,STREAM測(cè)試結(jié)果表明swFNPT內(nèi)存虛擬化造成的帶寬損失不高于3%;Memcached和Graph500的實(shí)驗(yàn)結(jié)果表明,swFNPT在支持進(jìn)程頻繁切換和大規(guī)模并行方面表現(xiàn)良好.但是申威swFNPT在執(zhí)行局部性較差的程序(如429.mcf)時(shí)虛擬化開(kāi)銷(xiāo)較大,這主要受限于申威服務(wù)器硬件支持上的不足,這一實(shí)驗(yàn)結(jié)果為申威服務(wù)器下一步的發(fā)展提供切實(shí)有效的實(shí)驗(yàn)支持.
本文在國(guó)產(chǎn)申威架構(gòu)上設(shè)計(jì)實(shí)現(xiàn)了首個(gè)軟件平滑嵌套頁(yè)表模型swFNPT,在申威1621服務(wù)器上的實(shí)驗(yàn)結(jié)果表明,swFNPT整體性能良好.這一工作為國(guó)產(chǎn)申威架構(gòu)的硬件輔助虛擬化下一步發(fā)展提供有價(jià)值的參考.一方面,申威架構(gòu)處理器要不斷完善MMU,NTLB,PWC等的硬件支持;另一方面,申威處理器要保留特權(quán)程序可編程接口以提供底層軟件靈活性.結(jié)合NTLB等硬件支持,未來(lái)軟硬件結(jié)合的swFNPT將更能充分發(fā)揮申威架構(gòu)的獨(dú)特優(yōu)勢(shì).
作者貢獻(xiàn)聲明:沙賽進(jìn)行了該論文相關(guān)的系統(tǒng)設(shè)計(jì)、代碼編寫(xiě)、論文撰寫(xiě)等工作;杜翰霖進(jìn)行了系統(tǒng)測(cè)試;羅英偉進(jìn)行了論文結(jié)構(gòu)設(shè)計(jì)和論文修改;汪小林制定了論文相關(guān)的實(shí)驗(yàn)方案;王振林參與進(jìn)行了系統(tǒng)設(shè)計(jì)和論文修改.