• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      MIPS VZ 虛擬化環(huán)境中透明大頁(yè)性能的優(yōu)化①

      2021-02-11 05:01:20毛碧波楊小娟
      高技術(shù)通訊 2021年11期
      關(guān)鍵詞:頁(yè)表宿主機(jī)表項(xiàng)

      朱 琛 王 劍 高 翔 毛碧波 楊小娟

      (*計(jì)算機(jī)體系結(jié)構(gòu)國(guó)家重點(diǎn)實(shí)驗(yàn)室(中國(guó)科學(xué)院計(jì)算技術(shù)研究所) 北京100190)

      (**中國(guó)科學(xué)院計(jì)算技術(shù)研究所 北京100190)

      (***中國(guó)科學(xué)院大學(xué) 北京100049)

      (****龍芯中科技術(shù)有限公司 北京100190)

      0 引言

      內(nèi)存管理是影響計(jì)算機(jī)性能的重要因素之一,操作系統(tǒng)的虛實(shí)地址轉(zhuǎn)換依賴(lài)于CPU 的內(nèi)存管理單元(memory management unit,MMU),在訪存密集型應(yīng)用中MMU 重填地址轉(zhuǎn)換緩沖器(translation lookaside buffer,TLB) 的開(kāi)銷(xiāo)容易成為性能瓶頸[1-2]。在硬件輔助虛擬化環(huán)境中,為了減少虛擬機(jī)內(nèi)存缺頁(yè)的次數(shù),往往采用兩級(jí)TLB,一個(gè)虛擬機(jī)的虛擬地址轉(zhuǎn)換需要兩個(gè)TLB 表項(xiàng),這進(jìn)一步加重了該問(wèn)題。采用內(nèi)存大頁(yè)技術(shù)可以明顯增大TLB對(duì)內(nèi)存的覆蓋率,通??梢詼p少TLB 的缺頁(yè)次數(shù),因此常被用于優(yōu)化虛擬機(jī)訪存[3]。現(xiàn)有很大一部分處理器采用分組TLB 實(shí)現(xiàn)對(duì)大小頁(yè)的支持。透明大頁(yè)分配機(jī)制在面對(duì)使用大容量連續(xù)數(shù)據(jù)集、訪存頻繁且局部性差的程序時(shí)會(huì)造成這類(lèi)處理器的TLB 負(fù)載不均衡,影響系統(tǒng)性能。本文針對(duì)這一問(wèn)題提出了一種優(yōu)化TLB 負(fù)載均衡度的方法,并創(chuàng)新地提出了一種高效的TLB 負(fù)載均衡度監(jiān)測(cè)機(jī)制和基于負(fù)載不均衡度的大頁(yè)調(diào)度策略。

      本文的內(nèi)容如下,第1 節(jié)以MIPS 處理器為例介紹了MMU 中內(nèi)存硬件輔助虛擬化的方法和MMU 對(duì)大頁(yè)的支持。第2 節(jié)以包含虛擬化組件(virtualization module,VZ)擴(kuò)展的龍芯3A4000 處理器為平臺(tái),通過(guò)實(shí)驗(yàn)對(duì)比了MIPS 處理器在虛擬化環(huán)境下啟動(dòng)大頁(yè)前后SPEC CPU 2006 測(cè)試中的性能。第3 節(jié)對(duì)SPEC CPU 2006 測(cè)試中性能異常的項(xiàng)目進(jìn)行了分析。第4 節(jié)對(duì)現(xiàn)有的內(nèi)存分頁(yè)策略進(jìn)行了改進(jìn)。第5 節(jié)對(duì)改進(jìn)后的KVM 虛擬機(jī)進(jìn)行了性能測(cè)試。第6 節(jié)總結(jié)了全文并展望了未來(lái)工作。

      1 背景

      1.1 虛擬機(jī)的地址翻譯

      內(nèi)存頁(yè)是操作系統(tǒng)分配內(nèi)存的最小單位,為了保護(hù)不同進(jìn)程的數(shù)據(jù),用戶(hù)進(jìn)程使用虛擬地址,MMU 查詢(xún)TLB,將虛擬地址翻譯為物理地址進(jìn)行訪問(wèn)。如果TLB 中未命中,頁(yè)表遍歷器(pagewalk)會(huì)查詢(xún)頁(yè)表并將對(duì)應(yīng)的表項(xiàng)填入TLB 中。

      虛擬化需要使用兩級(jí)頁(yè)表完成虛擬機(jī)的地址翻譯,一級(jí)是虛擬機(jī)維護(hù)的客模式虛擬地址(guest virtual address,GVA)到客模式物理地址(guest physcial address,GPA)的頁(yè)表。一級(jí)是虛擬機(jī)管理器(virtual machine monitor,VMM),本文使用KVM 作為VMM維護(hù)GPA 到宿主機(jī)物理地址(host physical address,HPA)的翻譯[4]。除此之外,虛擬機(jī)的虛擬外設(shè)也會(huì)使用正常的宿主機(jī)虛擬機(jī)地址(host virtual address,HVA)到HPA 的頁(yè)表項(xiàng)。

      虛擬機(jī)地址翻譯依賴(lài)于MMU 和TLB 的硬件輔助。常見(jiàn)的虛擬機(jī)內(nèi)存地址翻譯的硬件輔助根據(jù)使用TLB 的層級(jí)可分為兩種。

      第一種方式是虛擬機(jī)使用一級(jí)TLB 完成虛擬機(jī)的地址翻譯,虛擬機(jī)的TLB 表項(xiàng)中只記錄GVA或GPA 到HPA 的轉(zhuǎn)化。所有的TLB 操作由宿主機(jī)內(nèi)核態(tài)完成[5]。早期的X86處理器、龍芯的GS464E 處理器核使用的虛擬化擴(kuò)展采用這種方式。一次虛擬機(jī)TLB 重填的流程如圖1 所示。

      圖1 虛擬機(jī)地址翻譯流程

      這種方式下,每次TLB 重填需要先產(chǎn)生宿主機(jī)例外,查詢(xún)KVM 中的GVA→GPA 影子頁(yè)表,如影子頁(yè)表未命中需要返回客模式通過(guò)GVA 查詢(xún)GPA,最終再回到VMM 通過(guò)GPA 找到HPA,并將GVA 到HPA 的對(duì)應(yīng)關(guān)系填入頁(yè)表。這種方式的優(yōu)點(diǎn)是硬件實(shí)現(xiàn)較為簡(jiǎn)單,占用TLB 表項(xiàng)少,只需對(duì)TLB 和MMU 做少量更改就可實(shí)現(xiàn)虛擬機(jī)的內(nèi)存虛擬化;缺點(diǎn)也很明顯,一次頁(yè)表的填入經(jīng)常需要在客模式和根模式下多次切換,每次切換CPU 都需要保存大量的狀態(tài)信息,開(kāi)銷(xiāo)較大。

      另一種方式是使用兩級(jí)TLB 完成虛擬機(jī)地址的翻譯,其中一級(jí)記錄GVA 到GPA 的轉(zhuǎn)化,這一級(jí)TLB 的操作在客模式內(nèi)核態(tài)完成。第二級(jí)記錄GPA 到HPA 的轉(zhuǎn)化,這一級(jí)的TLB 操作由宿主機(jī)內(nèi)核態(tài)完成[6]。Intel 的擴(kuò)展頁(yè)表(extended page tables,EPT)、AMD 的嵌套頁(yè)表(nested page tables,NPT)和MIPS 的VZ 都使用這一方式。MIPS VZ 中的地址翻譯邏輯如圖2 所示。

      圖2 VZ 虛擬機(jī)地址翻譯流程

      在這種模式下,pagewalk 分別查詢(xún)虛擬機(jī)和VMM 的頁(yè)表完成各自的TLB 重填操作。兩個(gè)表項(xiàng)一個(gè)記錄GVA →GPA,一個(gè)記錄GPA →HPA,由MMU 根據(jù)兩個(gè)表項(xiàng)完成地址的翻譯。這樣在一定程度上避免了多次切換CPU 狀態(tài)的問(wèn)題。除此之外,由于GVA→GPA、GPA→HPA 的映射是完全相互獨(dú)立的,兩級(jí)地址翻譯之間實(shí)現(xiàn)了解耦,方便使用透明大頁(yè)等內(nèi)核的內(nèi)存優(yōu)化技術(shù)。

      使用兩級(jí)TLB 后虛擬機(jī)環(huán)境地址翻譯的代價(jià)仍然明顯高于非虛擬機(jī)環(huán)境。在客模式內(nèi)核態(tài)查找GVA→GPA 的過(guò)程中,需要查詢(xún)虛擬機(jī)的各級(jí)頁(yè)表,如果頁(yè)表所在GPA 對(duì)應(yīng)的GPA→HPA 表項(xiàng)不在TLB 中時(shí),會(huì)產(chǎn)生額外的VMM 缺頁(yè)異常,返回VMM 填入對(duì)應(yīng)的GPA→HPA 頁(yè)表項(xiàng),每訪問(wèn)一級(jí)客模式頁(yè)表都可能產(chǎn)生額外的重填,每次額外重填會(huì)帶來(lái)1 次客模式到根模式的切換和數(shù)次訪存。一次重填最多會(huì)產(chǎn)生M × N+M+N次訪存,其中M和N分別為宿主機(jī)和虛擬機(jī)的頁(yè)表級(jí)數(shù)[7]。如圖3所示,如果M和N都為4,一次重填最多需要24 次訪存。

      圖3 虛擬機(jī)兩級(jí)頁(yè)表的遍歷過(guò)程

      1.2 操作系統(tǒng)和處理器對(duì)大頁(yè)的支持

      操作系統(tǒng)在多級(jí)頁(yè)表中習(xí)慣于用一個(gè)內(nèi)存頁(yè)存儲(chǔ)一個(gè)目錄級(jí),以4 kB 頁(yè)為例,在64 位地址的條件下,一個(gè)4 kB 頁(yè)可以?xún)?chǔ)存512 個(gè)64 位地址,即頁(yè)表項(xiàng)(page table entry,PTE) 的上一級(jí)頁(yè)中間目錄(page middle directory,PMD)可以覆蓋512 ×4 kB=2 MB 的地址空間,上一級(jí)的頁(yè)上級(jí)目錄(page upper directory,PUD)為512 ×2 MB 即1 GB,為了管理方便,一般一個(gè)大頁(yè)直接對(duì)應(yīng)其中一個(gè)目錄項(xiàng)。如X86-64 使用4 kB 小頁(yè)對(duì)應(yīng)的大頁(yè)即為2 MB 和1 GB。

      MMU 根據(jù)設(shè)計(jì)可以支持一種或幾種不同規(guī)格的內(nèi)存頁(yè)大小,對(duì)應(yīng)的TLB 也支持相應(yīng)的頁(yè)大小。較小的頁(yè)大小能夠避免內(nèi)存的浪費(fèi),但由于TLB 的數(shù)量限制,能夠覆蓋的內(nèi)存范圍有限,因此在一些特定的應(yīng)用場(chǎng)景,采用更大的內(nèi)存頁(yè)(即大頁(yè))能夠有效提升TLB 的內(nèi)存覆蓋率,提升性能。

      MIPS 處理器一般有4 種不同的TLB,分別是指令TLB(ITLB)、數(shù)據(jù)TLB(DTLB)、固定頁(yè)大小TLB(FTLB)和可變頁(yè)大小TLB(VTLB)。ITLB 和DTLB統(tǒng)稱(chēng)為微TLB(μTLB),FTLB 和VTLB 統(tǒng)稱(chēng)為聯(lián)合TLB(JTLB)。μTLB 對(duì)軟件透明,由硬件從JTLB 中查詢(xún)后填入,因此其內(nèi)容是JTLB 的子集[8]。JTLB中FTLB 同時(shí)只能使用一種頁(yè)大小,VTLB 同時(shí)支持不同頁(yè)大小(步進(jìn)與μTLB 相同)。VTLB 使用全相連結(jié)構(gòu)支持不同頁(yè)大小,由于結(jié)構(gòu)限制其項(xiàng)數(shù)較少。以龍芯3A4000 使用的GS464V 處理器核為例,ITLB和VTLB 為64 項(xiàng),DTLB 為32 項(xiàng),FTLB 為2048 項(xiàng)。

      在VZ 模式下,JTLB 中有GVA→GPA、GPA→HPA 2 種表項(xiàng),由軟件頁(yè)表遍歷器填入,MMU 的硬件邏輯將2 種表項(xiàng)翻譯成GVA→HPA 的單一表項(xiàng)填入μTLB。JTLB 中的FTLB 項(xiàng)數(shù)較多,一般用于小頁(yè),VTLB 一般用于大頁(yè)。其他架構(gòu)的處理器,如X86 和Sparc 的部分處理器也使用了大小頁(yè)TLB 分組的結(jié)構(gòu)[9-10]。

      2 VZ 虛擬化環(huán)境下的大頁(yè)性能測(cè)試

      Linux 系統(tǒng)中對(duì)大頁(yè)的應(yīng)用主要分為2 種模式,即大頁(yè)文件系統(tǒng)(Hugetlbfs)和透明大頁(yè)(transparent huge pages,THP)。Hugetlbfs 需要操作系統(tǒng)手動(dòng)預(yù)先分配大頁(yè)并映射為一個(gè)文件,用戶(hù)程序可以通過(guò)該文件獲取按大頁(yè)預(yù)分配的內(nèi)存。THP 是一種用戶(hù)透明的大頁(yè)優(yōu)化,內(nèi)核會(huì)根據(jù)進(jìn)程的內(nèi)存使用情況,自動(dòng)分配大頁(yè)或?qū)?nèi)存中的小頁(yè)合并成大頁(yè)。THP 避免了Hugetlbfs 需要應(yīng)用程序顯式調(diào)用的問(wèn)題,使大頁(yè)的應(yīng)用更為廣泛[11]。

      MMU 使用大頁(yè)需要被翻譯的地址和翻譯的地址同時(shí)滿(mǎn)足大頁(yè)的對(duì)齊要求,KVM 使用的內(nèi)存是在根模式用戶(hù)態(tài)申請(qǐng)的,根內(nèi)核THP 的分配規(guī)則是將HVA 和HPA 按大頁(yè)對(duì)齊,卻沒(méi)有維護(hù)HPA 和GPA的對(duì)齊關(guān)系。如果HVA、HPA 和GPA 三者不能同時(shí)滿(mǎn)足大頁(yè)對(duì)齊時(shí),即使根文件系統(tǒng)和虛擬機(jī)都使用了透明大頁(yè),最終KVM 在TLB 中填入的表項(xiàng)仍是小頁(yè)。如圖4 所示,HVA 的013FFC000 對(duì)應(yīng)GPA的0xA000000,雖然根模式和虛擬機(jī)內(nèi)核都使用了大頁(yè),最終TLB 填入的仍是小頁(yè)。該問(wèn)題解決辦法是在用戶(hù)態(tài)啟動(dòng)時(shí)考慮對(duì)齊問(wèn)題,申請(qǐng)?zhí)摂M機(jī)內(nèi)存對(duì)應(yīng)的HVA 地址時(shí)額外增加一個(gè)大頁(yè)大小的虛擬地址空間,取第一個(gè)大頁(yè)對(duì)齊的HVA 地址為客戶(hù)機(jī)GPA 的起始地址。

      圖4 HVA 和GPA 不對(duì)齊時(shí)頁(yè)表的狀態(tài)

      測(cè)試中虛擬機(jī)和KVM 都通過(guò)THP 的方式使用大頁(yè),使用SPEC CPU 2006 測(cè)試作為對(duì)比基準(zhǔn)。CPU 為龍芯3A4000 處理器,主頻1.8 GHz。物理機(jī)和虛擬機(jī)都設(shè)置為雙核,內(nèi)存均為4 GB,測(cè)試中未開(kāi)啟3A4000 的向量?jī)?yōu)化。測(cè)試中涉及4 種組合:物理機(jī)不開(kāi)啟透明大頁(yè),物理機(jī)開(kāi)啟透明大頁(yè),虛擬機(jī)和KVM 不開(kāi)啟透明大頁(yè),虛擬機(jī)和KVM 開(kāi)啟透明大頁(yè),測(cè)試成績(jī)對(duì)比如圖5 所示。

      圖5 龍芯3A4000 在不同組合情況下的SPEC2006 CPU 性能對(duì)比

      可見(jiàn)使用大頁(yè)后,SPEC CPU 2006 中Gems-FDTD、cactusADM、bwaves、xalancbmk、astar、omnetpp、sjeng 都有較大幅度的性能提升,且宿主機(jī)和虛擬機(jī)使用大頁(yè)前后的性能變化趨勢(shì)一致。但mcf程序的成績(jī)出現(xiàn)了異常,物理機(jī)使用大頁(yè)提升了16.2%,但虛擬機(jī)使用大頁(yè)卻下降了9.2%。除此之外的其他測(cè)試項(xiàng)目,大頁(yè)的影響較小。

      3 測(cè)試項(xiàng)性能下降的原因分析

      現(xiàn)有研究認(rèn)為透明大頁(yè)的性能問(wèn)題主要來(lái)源于以下幾個(gè)方面:(1)內(nèi)存碎片化和多虛擬機(jī)內(nèi)存超分造成的大頁(yè)分配困難[11];(2)透明大頁(yè)分配、合并和拆分的開(kāi)銷(xiāo)造成的性能抖動(dòng);(3)多個(gè)虛擬機(jī)或進(jìn)程頻繁切換引起的TLB 失效[12]。針對(duì)上述問(wèn)題作了如下實(shí)驗(yàn),宿主機(jī)只啟動(dòng)一臺(tái)虛擬機(jī)且沒(méi)有其他活躍進(jìn)程。虛擬機(jī)啟動(dòng)時(shí)使用Hugetlbfs 預(yù)分配大頁(yè),確保虛擬機(jī)在GPA→HPA 轉(zhuǎn)換時(shí)一定是大頁(yè),且虛擬機(jī)使用時(shí)沒(méi)有大頁(yè)分配、合并的相關(guān)開(kāi)銷(xiāo)。同時(shí)監(jiān)測(cè)mcf 測(cè)試運(yùn)行時(shí)進(jìn)程的大頁(yè)使用情況,確定mcf 運(yùn)行時(shí)成功分配了大頁(yè)。這種情況下,mcf 的測(cè)試成績(jī)?yōu)?.84,與使用兩級(jí)透明大頁(yè)時(shí)的測(cè)試分值7.79 相差僅為0.6%,因此可以排除是因?yàn)榇箜?yè)分配失敗引起的性能下降。在該實(shí)驗(yàn)的基礎(chǔ)上修改了TLB 重填例外代碼,對(duì)TLB 的重填來(lái)源進(jìn)行了統(tǒng)計(jì),結(jié)果顯示測(cè)試時(shí)虛擬機(jī)99%以上的重填都來(lái)自于mcf 測(cè)試進(jìn)程,宿主機(jī)99%以上的重填都來(lái)自于運(yùn)行mcf 的虛擬機(jī),排除了多個(gè)虛擬機(jī)或進(jìn)程頻繁切換引發(fā)的TLB 失效。最后通過(guò)perf 統(tǒng)計(jì)了虛擬機(jī)透明大頁(yè)分配、合并和拆分相關(guān)函數(shù)的時(shí)間占比,統(tǒng)計(jì)結(jié)果顯示透明大頁(yè)相關(guān)函數(shù)的時(shí)間占比小于總時(shí)間的0.1%。因此現(xiàn)有研究不能夠解釋mcf 測(cè)試在龍芯3A4000 虛擬機(jī)使用透明大頁(yè)時(shí)性能下降的原因。

      為了進(jìn)一步分析mcf,在圖5 的組合基礎(chǔ)上,增加了關(guān)閉KVM 透明大頁(yè)保留客模式透明大頁(yè)和保留KVM 透明大頁(yè)關(guān)閉客模式透明大頁(yè)2 種情況的測(cè)試。測(cè)試結(jié)果如圖6 所示。測(cè)試結(jié)果中可以看到,無(wú)論是GVA→GPA 還是GPA→HPA 使用大頁(yè)對(duì)性能的影響都是正向的。但同時(shí)對(duì)GVA→GPA 和GPA→HPA 使用大頁(yè)時(shí),卻產(chǎn)生了明顯的負(fù)面影響。

      圖6 不同大頁(yè)策略下的mcf 分值對(duì)比

      mcf 是一個(gè)C 語(yǔ)言實(shí)現(xiàn)的,用于大型公共交通中的單站車(chē)輛調(diào)度的程序,實(shí)測(cè)在64 位系統(tǒng)中占用約1.6 GB 的連續(xù)內(nèi)存地址,訪存頻繁且訪存局部性差。測(cè)試系統(tǒng)默認(rèn)使用16 kB 小頁(yè),對(duì)應(yīng)的PMD 尺寸為32 MB。GS464V 用于大頁(yè)的TLB 為VTLB,共有64 項(xiàng)。在物理機(jī)運(yùn)行時(shí),64 項(xiàng)大頁(yè)可覆蓋2 GB的地址空間。在虛擬機(jī)模式下運(yùn)行時(shí),由于使用兩級(jí)頁(yè)表,需要VTLB 中同時(shí)用2 個(gè)頁(yè)表項(xiàng)才能完成一次地址翻譯,因此最大覆蓋的不需要替換的地址范圍為1 GB。這意味著GS464V 在默認(rèn)情況下,使用大頁(yè)能覆蓋mcf 測(cè)試的全部?jī)?nèi)存地址,在虛擬機(jī)模式下則不能全部覆蓋。這在mcf 程序中會(huì)帶來(lái)頻繁的TLB 重填影響性能。為了進(jìn)一步驗(yàn)證,在Linux 內(nèi)核通用(物理機(jī)和虛擬機(jī)復(fù)用,負(fù)責(zé)填入HVA→HPA 或GVA→GPA 的頁(yè)表項(xiàng))和KVM 模塊專(zhuān)用(負(fù)責(zé)填入GPA→HPA 的頁(yè)表項(xiàng))的TLB 重填例外入口加入了計(jì)數(shù),并區(qū)分大小頁(yè),統(tǒng)計(jì)不同條件下測(cè)試mcf 每秒鐘TLB 重填的次數(shù)。測(cè)試分值和重填次數(shù)見(jiàn)圖7。圖中曲線對(duì)應(yīng)測(cè)試分值,左邊的縱坐標(biāo)標(biāo)示每秒鐘重填次數(shù),右邊的縱坐標(biāo)標(biāo)示測(cè)試分值。從左到右測(cè)試環(huán)境依次為宿主機(jī)關(guān)閉透明大頁(yè)、宿主機(jī)開(kāi)啟透明大頁(yè),虛擬機(jī)環(huán)境關(guān)閉所有透明大頁(yè),虛擬化環(huán)境只使用虛擬機(jī)透明大頁(yè)和虛擬機(jī)環(huán)境開(kāi)啟兩級(jí)透明大頁(yè)。

      圖7 不同環(huán)境下mcf 測(cè)試的TLB 重填次數(shù)和分值

      可見(jiàn)測(cè)試分值與重填次數(shù)呈明顯相關(guān)性,重填次數(shù)越多,測(cè)試分值越低。使用透明大頁(yè)時(shí),Linux的內(nèi)存管理器傾向于盡可能分配大頁(yè)[11],因此在兩級(jí)內(nèi)存管理都開(kāi)啟THP 時(shí),所有的頁(yè)面都使用大頁(yè),TLB 的重填主要局限于大頁(yè)的VLTB,達(dá)218 萬(wàn)次/s,而FTLB 僅重填不到450 次/s。手動(dòng)關(guān)閉KVM 的THP 后總重填次數(shù)下降到128 萬(wàn)次。這表明2 種TLB 之間的負(fù)載不均衡,資源沒(méi)有得到充分利用。

      4 基于TLB 負(fù)載均衡的虛擬機(jī)性能優(yōu)化

      由上述分析可知,現(xiàn)有的Linux 透明大頁(yè)分配機(jī)制會(huì)造成面對(duì)使用大容量連續(xù)數(shù)據(jù)集、訪存頻繁且局部性差的應(yīng)用程序時(shí),當(dāng)大頁(yè)的表項(xiàng)不足以覆蓋熱點(diǎn)內(nèi)存區(qū)域會(huì)產(chǎn)生對(duì)TLB 表項(xiàng)的劇烈競(jìng)爭(zhēng),造成應(yīng)用程序使用大頁(yè)后性能下降。硬件上解決這一問(wèn)題最直接的辦法是增加表項(xiàng)數(shù)量,但TLB 的數(shù)量增加受時(shí)序限制,也會(huì)增加硬件成本。與此同時(shí)用于小頁(yè)的TLB 表項(xiàng)在mcf 測(cè)試中處于空閑狀態(tài)沒(méi)有充分利用。使用單級(jí)大頁(yè)后性能提升的實(shí)驗(yàn)結(jié)果表明,如果充分利用空閑的TLB 資源,可以減少TLB 替換次數(shù),提升性能。

      優(yōu)化該問(wèn)題需要通過(guò)對(duì)TLB 的重填狀況進(jìn)行監(jiān)測(cè),識(shí)別出不平衡狀態(tài)。現(xiàn)有的相關(guān)性能計(jì)數(shù)器只提供了總的TLB 重填次數(shù),但MIPS 的TLB 軟件重填機(jī)制和核內(nèi)空閑寄存器為高效統(tǒng)計(jì)大頁(yè)重填的次數(shù)提供了可能。通過(guò)大頁(yè)重填次數(shù)和總的重填次數(shù),就能夠得到TLB 的負(fù)載不均衡度。在物理機(jī)上一般同時(shí)運(yùn)行數(shù)百個(gè)到上萬(wàn)個(gè)進(jìn)程,對(duì)之進(jìn)行監(jiān)控代價(jià)較高。同時(shí)由于物理機(jī)運(yùn)行的負(fù)載較為復(fù)雜,行為模式經(jīng)常發(fā)生變化。同時(shí)在一個(gè)物理機(jī)上運(yùn)行的虛擬機(jī)數(shù)目有限,且虛擬機(jī)通常長(zhǎng)時(shí)間運(yùn)行穩(wěn)定負(fù)載,因此在KVM 中對(duì)虛擬機(jī)進(jìn)行監(jiān)控和優(yōu)化更為合理。利用現(xiàn)有硬件資源在KVM 中設(shè)計(jì)一個(gè)高效的TLB 負(fù)載檢測(cè)機(jī)制,并根據(jù)TLB 負(fù)載不均衡度調(diào)整大頁(yè)分配比例,可以提高TLB 的命中率,提升系統(tǒng)性能。

      4.1 TLB 負(fù)載檢測(cè)機(jī)制

      TLB 重填是影響CPU 性能的關(guān)鍵路徑,因此需要一個(gè)高效的TLB 負(fù)載檢測(cè)機(jī)制,以避免對(duì)系統(tǒng)產(chǎn)生負(fù)面影響。本文中使用的檢測(cè)方法,充分利用龍芯GS464V 處理器核的硬件資源,實(shí)現(xiàn)了可開(kāi)關(guān)的軟件大頁(yè)重填計(jì)數(shù)器,避免了在TLB refill 中增加訪存,具體結(jié)構(gòu)如圖8 所示。

      圖8 TLB 負(fù)載檢測(cè)機(jī)制

      該檢測(cè)方法利用了龍芯3A4000 處理器中的以下硬件資源:硬件TLB 重填計(jì)數(shù)器(以下簡(jiǎn)稱(chēng)TLB計(jì)數(shù)器)和2 個(gè)空閑的Kscratch 寄存器。

      硬件TLB 重填計(jì)數(shù)器是GS464V 中的一個(gè)性能計(jì)數(shù)器,能夠統(tǒng)計(jì)總的宿主機(jī)TLB 重填次數(shù),但無(wú)法區(qū)分大小頁(yè)。Kscratch 寄存器是GS464V 中的一組64 位可讀寫(xiě)寄存器,用于存放核心態(tài)軟件的暫存數(shù)據(jù)。GS464V 中一共有6 個(gè)Kscratch 寄存器,為Kscratch 1~6。在現(xiàn)有的Linux 內(nèi)核中,除了KSratch 1,其余5 個(gè)沒(méi)有使用。本文使用了Kscratch 5和Kscratch 6 兩個(gè)寄存器。其中Kscratch 5 用于開(kāi)關(guān)軟件大頁(yè)重填計(jì)數(shù)器,Kscratch 6 用于軟件大頁(yè)重填計(jì)數(shù)器存放計(jì)數(shù)值。

      軟件上增加2 個(gè)模塊,TLB 負(fù)載監(jiān)控程序和軟件大頁(yè)重填計(jì)數(shù)器(以下簡(jiǎn)稱(chēng)大頁(yè)計(jì)數(shù)器)。TLB負(fù)載監(jiān)測(cè)程序在時(shí)鐘中斷例外中執(zhí)行,軟件大頁(yè)重填計(jì)數(shù)器位于TLB 重填例外函數(shù)中。除此之外對(duì)內(nèi)核的內(nèi)存管理單元進(jìn)行了少量修改,增加了限制虛擬機(jī)大頁(yè)分配數(shù)量的邏輯。該邏輯中使用了2 個(gè)參數(shù):當(dāng)前虛擬機(jī)允許分配的大頁(yè)數(shù)Nhl和當(dāng)前虛擬機(jī)使用的大頁(yè)數(shù)Nhc。Nhl的初始值設(shè)定為虛擬機(jī)內(nèi)存大小除以系統(tǒng)大頁(yè)尺寸,即虛擬機(jī)所有的內(nèi)存都可使用大頁(yè)。Nhc的值由內(nèi)存管理單元維護(hù),記錄當(dāng)前虛擬機(jī)使用的大頁(yè)數(shù)。

      具體流程如圖8 所示。

      (1)TLB負(fù)載監(jiān)控程序通過(guò)讀取硬件TLB重填計(jì)數(shù)器和Nhc、Nhl,統(tǒng)計(jì)當(dāng)前MMU 的負(fù)載和大頁(yè)使用情況。

      (2)當(dāng)監(jiān)控程序判別有必要監(jiān)測(cè)大頁(yè)重填計(jì)數(shù)時(shí),向Kscratch 5 寄存器寫(xiě)入非零值。

      (3)TLB 重填時(shí)讀取Kscratch 5 寄存器,當(dāng)值為非零時(shí),開(kāi)啟軟件大頁(yè)計(jì)數(shù)器。

      (4)當(dāng)前填入的頁(yè)為大頁(yè)時(shí),軟件計(jì)數(shù)器更新Kscratch 6 寄存器的計(jì)數(shù)值。

      (5)監(jiān)控程序根據(jù)實(shí)時(shí)的總重填計(jì)數(shù)和大頁(yè)重填計(jì)數(shù),判斷是否處于負(fù)載不均衡的狀態(tài)。

      (6)當(dāng)監(jiān)控程序判別不均衡需要調(diào)整透明大頁(yè)分配策略時(shí),步進(jìn)式調(diào)整Nhl。

      4.2 基于負(fù)載不均衡度的大頁(yè)調(diào)度策略

      監(jiān)控程序通過(guò)TLB 重填頻率,結(jié)合處理器單次TLB 重填耗時(shí),可以判斷TLB 重填在CPU 運(yùn)行中的耗時(shí)占比。當(dāng)耗時(shí)占比高于閾值時(shí),并不會(huì)馬上啟動(dòng)后續(xù)流程,而是會(huì)更新一個(gè)計(jì)數(shù)器(以下稱(chēng)該計(jì)數(shù)器為CL)。當(dāng)連續(xù)高于閾值時(shí)CL會(huì)逐次累加,而中間有不滿(mǎn)足閾值的情況時(shí)CL會(huì)逐次遞減直至為0,當(dāng)CL累加到一定數(shù)量時(shí),監(jiān)控程序才會(huì)啟動(dòng)大頁(yè)計(jì)數(shù)器。本文將啟動(dòng)條件設(shè)為CL≥2560,這意味著TLB 連續(xù)處于高負(fù)載10 s 以上。這樣做是為了避免調(diào)度算法過(guò)于敏感,頻繁切換狀態(tài)造成系統(tǒng)性能擾動(dòng)。

      啟動(dòng)大頁(yè)計(jì)數(shù)器后,獲取一個(gè)時(shí)鐘中斷間隔內(nèi)的大頁(yè)重填次數(shù)Nhr和總的重填次數(shù)Nr。由于大頁(yè)和小頁(yè)的TLB 項(xiàng)數(shù)不同,用Nhr和Nr -Nhr分別除以大頁(yè)和小頁(yè)的TLB 項(xiàng)數(shù),得到平均每個(gè)大頁(yè)TLB 表項(xiàng)重填的頻率fh和平均每個(gè)小頁(yè)TLB 表項(xiàng)的重填頻率fs,不平衡程度y通過(guò)下列函數(shù)衡量:

      y連續(xù)計(jì)算3 次,求取其算術(shù)平均值。當(dāng)不平衡度大于閾值時(shí),啟動(dòng)大頁(yè)調(diào)度程序,本文實(shí)驗(yàn)使用的不平衡度閾值為20。

      在y超出閾值且fh>fs時(shí),表明負(fù)載主要集中于大頁(yè)使用的VTLB。監(jiān)控程序?qū)hl更新為Nhc -1。此時(shí),Linux 內(nèi)存管理單元檢測(cè)到Nhc >Nhl,會(huì)拆分大頁(yè)至Nhl=Nhc。如果此時(shí)fh和fs大小關(guān)系沒(méi)有發(fā)生翻轉(zhuǎn)且y仍高于閾值,會(huì)進(jìn)一步減小Nhl,直至fh和fs大小關(guān)系發(fā)生翻轉(zhuǎn)或y降低到閾值以下。此后監(jiān)控程序會(huì)關(guān)閉大頁(yè)計(jì)數(shù)器,并將CL清零。

      如果負(fù)載集中于FTLB 且Nhc <Nhl,表明虛擬機(jī)此時(shí)需要等待內(nèi)存管理程序合并透明大頁(yè),且內(nèi)存管理程序本身具有權(quán)限,此時(shí)監(jiān)控程序會(huì)關(guān)閉大頁(yè)計(jì)數(shù)器,并將CL清零。如果Nhc=Nhl,且Nhl覆蓋范圍比虛擬機(jī)物理內(nèi)存小,將擴(kuò)大Nhl。

      5 優(yōu)化后的性能測(cè)試

      為了驗(yàn)證改進(jìn)的效果,優(yōu)化后重新測(cè)試了mcf,并對(duì)TLB 重填次數(shù)進(jìn)行了重新統(tǒng)計(jì),結(jié)果如圖9 所示。可見(jiàn)在開(kāi)啟兩級(jí)透明大頁(yè)的情況下,優(yōu)化后的虛擬機(jī)的分值相較于優(yōu)化前提升了45.1%,超過(guò)了虛擬機(jī)手動(dòng)關(guān)閉一級(jí)大頁(yè)的分值,也超過(guò)了宿主機(jī)使用小頁(yè)時(shí)的分值。

      圖9 優(yōu)化后的mcf 測(cè)試分值

      在此基礎(chǔ)上,對(duì)SPEC 2006 整體地重新測(cè)試,測(cè)試結(jié)果如圖10 所示。除mcf 外astar、cactusADM 和GemsFDTD 有1%~2%的性能提升,其他測(cè)試項(xiàng)變化不明顯。沒(méi)有出現(xiàn)性能下降超過(guò)1%的項(xiàng),表明新分配機(jī)制引入的開(kāi)銷(xiāo)沒(méi)有對(duì)其他測(cè)試的性能產(chǎn)生明顯影響。

      圖10 龍芯3A4000 優(yōu)化前后的SPEC CPU 2006 性能對(duì)比

      為了進(jìn)一步驗(yàn)證優(yōu)化效果,使用sysbench 對(duì)優(yōu)化前后的數(shù)據(jù)庫(kù)性能進(jìn)行了對(duì)比。sysbench是一個(gè)模塊化跨平臺(tái)多線程的基準(zhǔn)測(cè)試工具,可以評(píng)估不同系統(tǒng)參數(shù)下的數(shù)據(jù)庫(kù)負(fù)載情況。對(duì)比測(cè)試的數(shù)據(jù)庫(kù)和測(cè)試均在本地運(yùn)行,測(cè)試數(shù)據(jù)庫(kù)含800 萬(wàn)個(gè)條目,測(cè)試使用2 個(gè)線程,最大數(shù)據(jù)庫(kù)事務(wù)次數(shù)50 000次,測(cè)試時(shí)兩級(jí)透明大頁(yè)均開(kāi)啟。測(cè)試結(jié)果如表1 所示,優(yōu)化后的測(cè)試成績(jī)有12%左右的性能提升。

      表1 sysbench 數(shù)據(jù)庫(kù)測(cè)試成績(jī)對(duì)比

      6 結(jié)論

      本文利用龍芯3A4000 處理器和SPEC CPU 2006 性能測(cè)試工具分析了MIPS VZ 虛擬化環(huán)境下大頁(yè)的性能,并針對(duì)發(fā)現(xiàn)的分組TLB 負(fù)載不均衡的問(wèn)題提出了改進(jìn)方法,經(jīng)測(cè)試改進(jìn)后的透明大頁(yè)性能在部分場(chǎng)景中有了明顯提高。

      本文提到的方法還有進(jìn)一步改進(jìn)的空間。本文使用的隨機(jī)拆分大頁(yè)的方式可能帶來(lái)性能抖動(dòng),未來(lái)通過(guò)進(jìn)一步改良TLB 負(fù)載監(jiān)測(cè)機(jī)制可以獲得更細(xì)粒度的信息,實(shí)現(xiàn)對(duì)熱點(diǎn)大頁(yè)的識(shí)別和有針對(duì)性的拆分。同時(shí)運(yùn)行多虛擬機(jī)時(shí),不僅存在處理器核TLB 負(fù)載不均衡的問(wèn)題,還存在著不同虛擬機(jī)之間大頁(yè)分配不均衡的問(wèn)題;系統(tǒng)長(zhǎng)時(shí)間運(yùn)行后,由于不可移動(dòng)的頁(yè)面存在會(huì)使物理地址空間不連續(xù)難以分出大頁(yè)[13]。這些問(wèn)題有待后續(xù)研究。

      猜你喜歡
      頁(yè)表宿主機(jī)表項(xiàng)
      一種改進(jìn)的TCAM路由表項(xiàng)管理算法及實(shí)現(xiàn)
      更正
      作者更正
      基于ARMA模型預(yù)測(cè)的交換機(jī)流表更新算法
      勘 誤
      更正
      虛擬網(wǎng)絡(luò)實(shí)驗(yàn)室在農(nóng)村職校計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)教學(xué)中的應(yīng)用研究
      嵌入式計(jì)算機(jī)軟件測(cè)試關(guān)鍵技術(shù)的思考
      SDN數(shù)據(jù)中心網(wǎng)絡(luò)基于流表項(xiàng)轉(zhuǎn)換的流表調(diào)度優(yōu)化
      嵌入式計(jì)算機(jī)軟件測(cè)試關(guān)鍵技術(shù)研究
      水城县| 永平县| 米泉市| 花垣县| 临海市| 辽中县| 长葛市| 青海省| 巴楚县| 辽阳市| 碌曲县| 长白| 望城县| 巴彦县| 贺州市| 辰溪县| 长垣县| 墨脱县| 正阳县| 黎川县| 巴东县| 西平县| 湖北省| 云和县| 南丹县| 普宁市| 商南县| 龙江县| 开鲁县| 常熟市| 昌邑市| 玛纳斯县| 太仆寺旗| 延津县| 黔西县| 长武县| 贡嘎县| 黔江区| 青神县| 申扎县| 永清县|