王睿伯,吳振偉,張文喆,鄔會軍,張于舒晴,盧 凱
(國防科技大學(xué)計(jì)算機(jī)學(xué)院,湖南 長沙 410073)
訪存監(jiān)控,即獲取程序訪問內(nèi)存的行為,在系統(tǒng)軟件和體系結(jié)構(gòu)研究中有著非常廣泛的應(yīng)用。當(dāng)前,實(shí)現(xiàn)訪存監(jiān)控的主流技術(shù)手段包括代碼插樁(Instrumentation)和頁保護(hù)(Page Protection)2大類。
代碼插樁是一種通用的程序分析手段。代碼插樁在保證目標(biāo)程序原始執(zhí)行邏輯完整性的基礎(chǔ)上,在目標(biāo)程序中插入一些額外的代碼片段用以收集程序的執(zhí)行信息,如程序的控制流、數(shù)據(jù)流等?;诖a插樁技術(shù)實(shí)現(xiàn)訪存監(jiān)控,即通過插樁程序中的內(nèi)存訪問指令監(jiān)控程序的內(nèi)存訪問行為。從插樁時機(jī)的角度看,代碼插樁技術(shù)可以分為靜態(tài)編譯插樁和動態(tài)二進(jìn)制插樁2大類。編譯插樁是指在目標(biāo)程序的編譯過程中注入插樁代碼,生成新的可執(zhí)行程序[1]。動態(tài)二進(jìn)制插樁則是在可執(zhí)行程序運(yùn)行期間動態(tài)注入插樁代碼。典型的動態(tài)二進(jìn)制插樁工具,如Intel的Pin[2]、QEMU(Quick EMUlator)[3]、DynamoRIO[4]等,采用即時編譯 (Just-In-Time Compilation) 技術(shù)對目標(biāo)二進(jìn)制代碼執(zhí)行動態(tài)重編譯,并在動態(tài)重編譯過程中實(shí)現(xiàn)代碼插樁。相比于編譯插樁,動態(tài)二進(jìn)制插樁通常會引入數(shù)十倍于前者的性能開銷。然而,動態(tài)二進(jìn)制插樁無需重新編譯目標(biāo)程序,可以靈活適用于無法獲得目標(biāo)程序源代碼的情形。此外,編譯插樁的監(jiān)控目標(biāo)通常局限于用戶態(tài)程序,而動態(tài)二進(jìn)制插樁普遍適用于監(jiān)控用戶態(tài)程序和操作系統(tǒng)內(nèi)核。
Figure 1 Page table entry圖1 頁表項(xiàng)
頁保護(hù)是內(nèi)存管理單元MMU(Memory Manag- ement Unit)在硬件層面提供的一種頁面訪問權(quán)限檢查功能[5-7]。軟件可以通過配置頁表項(xiàng)PTE(Page Table Entry)中的權(quán)限標(biāo)志位實(shí)現(xiàn)頁面粒度的訪問權(quán)限控制。當(dāng)用戶程序的訪存請求違背頁表項(xiàng)所規(guī)定的被訪問內(nèi)存頁的訪問權(quán)限時,MMU會觸發(fā)頁錯誤。針對因訪存違例而觸發(fā)的頁錯誤,Linux內(nèi)核會向觸發(fā)異常的進(jìn)程發(fā)送段錯誤信號SIGSEGV(SIGnal:SEGmentation Violation)?;陧摫Wo(hù)實(shí)現(xiàn)內(nèi)存寫訪問監(jiān)控的基本原理是通過寫保護(hù)目標(biāo)內(nèi)存區(qū)域,即將其訪問權(quán)限配置為只讀,使被監(jiān)控程序的寫請求觸發(fā)訪問權(quán)限違例,進(jìn)而在自定義的SIGSEGV信號處理函數(shù)中獲取到被監(jiān)控程序正在試圖寫入的內(nèi)存地址。在記錄了被訪問到的內(nèi)存頁地址后,SIGSEGV信號處理函數(shù)可通過mprotect系統(tǒng)調(diào)用解除對該內(nèi)存頁的寫保護(hù),使得信號處理函數(shù)返回后被中斷的寫訪問可以恢復(fù)執(zhí)行。類似地,可以通過將目標(biāo)內(nèi)存區(qū)域的訪問權(quán)限設(shè)置為不可訪問,使得被監(jiān)控程序?qū)υ搮^(qū)域的讀寫請求均觸發(fā)訪問權(quán)限違例異常,從而實(shí)現(xiàn)內(nèi)存讀寫訪問監(jiān)控?;陧摫Wo(hù)實(shí)現(xiàn)訪存監(jiān)控的性能開銷,主要來自于因修改PTE的頁訪問權(quán)限標(biāo)志位而引入的特權(quán)級切換和頁表緩存TLB(Translation Lookaside Buffer)刷新。
總體而言,編譯插樁引入的運(yùn)行時開銷最低,但應(yīng)用場景相對受限。動態(tài)二進(jìn)制插樁應(yīng)用范圍廣,但性能開銷顯著。頁保護(hù)相比于動態(tài)二進(jìn)制插樁,運(yùn)行時開銷大幅降低,但在編程靈活性和監(jiān)控粒度方面仍有局限性[8]。本文的目標(biāo)是:突破頁保護(hù)在編程靈活性方面的局限性,構(gòu)建一種融合頁保護(hù)和編譯插樁優(yōu)勢的高效細(xì)粒度訪存監(jiān)控機(jī)制。
如圖1所示,分頁式內(nèi)存管理模式下,頁表描述虛擬頁到物理頁的映射關(guān)系,并且存放頁的保護(hù)位,即訪問權(quán)限。每個進(jìn)程擁有獨(dú)立的頁表。進(jìn)程的頁表由操作系統(tǒng)創(chuàng)建和維護(hù),供MMU硬件查詢實(shí)現(xiàn)虛實(shí)地址轉(zhuǎn)換和內(nèi)存訪問權(quán)限檢查。如果進(jìn)程違背頁表中所設(shè)置的權(quán)限訪問內(nèi)存(如寫入只讀內(nèi)存區(qū)域),MMU將觸發(fā)頁錯誤中斷。出現(xiàn)頁錯誤后,操作系統(tǒng)的頁錯誤處理例程通過讀取硬件寄存器(如x86處理器的CR2寄存器),獲得引起頁錯誤的內(nèi)存地址,并向被中斷的進(jìn)程發(fā)送SIGSEGV信號。進(jìn)程收到SIGSEGV信號的缺省行為是終止執(zhí)行并返回錯誤代碼。
基于頁保護(hù)的訪存監(jiān)控機(jī)制,通過操作系統(tǒng)提供的內(nèi)存保護(hù)系統(tǒng)調(diào)用(mprotect)接口,預(yù)先將目標(biāo)虛擬內(nèi)存區(qū)域的訪問權(quán)限設(shè)置為不可訪問或只讀,使得被監(jiān)控程序?qū)δ繕?biāo)虛擬內(nèi)存區(qū)域的讀寫訪問或?qū)懺L問無法通過MMU的訪存權(quán)限檢查而被硬件中斷。與此同時,訪存監(jiān)控機(jī)制通過向操作系統(tǒng)注冊SIGSEGV信號處理函數(shù)對因訪存違例而產(chǎn)生的SIGSEGV信號進(jìn)行進(jìn)一步處理。如圖 2所示,SIGSEGV信號處理函數(shù)首先從中斷棧中讀取引發(fā)頁錯誤的內(nèi)存地址,即被監(jiān)控程序正在訪問的地址。此外,SIGSEGV信號處理函數(shù)可以進(jìn)一步通過保存在中斷棧中的錯誤代碼確定訪存類型是讀訪問還是寫訪問。在記錄被監(jiān)控進(jìn)程的訪存行為之后,SIGSEGV信號處理函數(shù)再次發(fā)起mprotect系統(tǒng)調(diào)用,解除被監(jiān)控程序?qū)ο鄳?yīng)虛擬內(nèi)存頁的訪問限制,使被中斷的訪存操作在SIGSEGV信號處理函數(shù)返回后可以恢復(fù)正常執(zhí)行。
Figure 2 Workflow of page protection-based memory access monitoring mechanism圖2 基于頁保護(hù)的訪存監(jiān)控機(jī)制工作流程
Figure 3 Architecture of MPK圖3 MPK架構(gòu)
基于PTE的頁保護(hù)機(jī)制中,用戶態(tài)程序需要陷入到內(nèi)核態(tài)修改頁訪問權(quán)限,上下文切換開銷較大。此外,操作系統(tǒng)在修改PTE后需要執(zhí)行開銷顯著的TLB flush操作以確保TLB的數(shù)據(jù)一致性。
MPK(Memory Protection Keys)提供了一種相對于操作頁表項(xiàng)更加輕量化且更加靈活的頁保護(hù)機(jī)制。MPK硬件擴(kuò)展在每個處理器核心中增加1個每核私有的(core-private)寄存器PKRU (Protection Key rights Register for User pages)來描述頁訪問權(quán)限,支持軟件層在用戶態(tài)實(shí)現(xiàn)線程局部的頁訪問權(quán)限控制。如圖 3所示,MPK使用傳統(tǒng)PTE中的4個空閑位域存儲pkey(protection key)值,提供0~15共計(jì)16個pkey。擁有相同pkey的頁構(gòu)成一個分組,共享PKRU中pkey所對應(yīng)的內(nèi)存頁訪問權(quán)限描述。具體而言,PKRU中為每個pkey維護(hù)WD(Write Disable)和AD(Access Disable)2個權(quán)限控制位。軟件可以將某pkey在PKRU中的WD或AD位置為1,使其對該pkey所指向頁分組的寫訪問或所有訪問觸發(fā)異常。由于PKRU為用戶態(tài)寄存器,用戶程序讀/寫PKRU寄存器只需要執(zhí)行非特權(quán)態(tài)的RDPKRU/WRPKRU指令,而無需發(fā)起系統(tǒng)調(diào)用。
在使用MPK的情形下,MMU在執(zhí)行權(quán)限檢查時,會同時檢查PTE中描述的訪問權(quán)限和PTE中的pkey在PKRU中對應(yīng)的訪問權(quán)限,最終被允許的訪問權(quán)限為二者的交集。由于PKRU為處理器核心獨(dú)有,MPK支持線程局部的訪問權(quán)限控制。如圖 4所示,針對同一內(nèi)存頁,Corea和Coreb可以同時擁有相互獨(dú)立的訪問權(quán)限。而PTE為所有線程所共享,修改PTE中的頁保護(hù)位將影響所有線程的訪問權(quán)限。
MPK硬件擴(kuò)展的設(shè)計(jì)初衷是增強(qiáng)程序的訪存安全性。基于MPK所提供的輕量化內(nèi)存訪問控制機(jī)制,已有大量研究工作圍繞敏感數(shù)據(jù)隔離保護(hù)[10]、unikernel內(nèi)部內(nèi)存隔離[11]、線程級訪存約束[12]等應(yīng)用場景開展研究。本文將MPK提供的輕量化頁保護(hù)特性用于建立低開銷的訪存監(jiān)控機(jī)制。
Figure 4 Memory access permissions control in MPK[9]圖4 MPK中的訪問權(quán)限檢查[9]
在基于頁保護(hù)的訪存監(jiān)控中,被監(jiān)控程序?qū)ν粌?nèi)存頁的多次訪問中,只有第1次訪問會觸發(fā)頁錯誤中斷。在SIGSEGV信號處理函數(shù)通過mprotect系統(tǒng)調(diào)用解除內(nèi)存頁訪問限制后,對該頁面的后續(xù)訪問將不會繼續(xù)觸發(fā)頁錯誤中斷,從而無法被頁保護(hù)機(jī)制監(jiān)控到。為了實(shí)現(xiàn)能夠監(jiān)控到每條訪存指令的細(xì)粒度訪存監(jiān)控,需要在對被保護(hù)內(nèi)存頁的第1次訪問結(jié)束后且對該內(nèi)存頁的后續(xù)訪問未開始執(zhí)行前的某個時機(jī)再次中斷被監(jiān)控程序,并重新施加頁保護(hù)。對此,本文利用處理器的單步(Single-Stepping)調(diào)試模式實(shí)現(xiàn)了基于硬件頁保護(hù)的細(xì)粒度訪存監(jiān)控。單步調(diào)試模式下,處理器每執(zhí)行一條指令,便會觸發(fā)一次調(diào)試異常。操作系統(tǒng)的調(diào)試異常處理例程,會向觸發(fā)調(diào)試異常的程序發(fā)送SIGTRAP信號。在x86架構(gòu)下,可以通過配置EFLAGS寄存器的TF(Trap Flag)標(biāo)志位,控制處理器進(jìn)入或退出單步執(zhí)行模式。
在程序觸發(fā)調(diào)試異常陷入到內(nèi)核態(tài)時,被中斷的程序執(zhí)行上下文被保存在內(nèi)核棧。內(nèi)核在調(diào)用程序預(yù)先注冊的SIGTRAP信號處理函數(shù)時,會將被中斷程序的執(zhí)行上下文拷貝到信號棧(Signal Stack)。由此,程序自定義的信號處理函數(shù)可以通過信號棧訪問到程序被中斷時的上下文信息。信號處理函數(shù)結(jié)束后,將執(zhí)行sigreturn函數(shù)。sigreturn函數(shù)通過信號棧中保存的上下文信息,恢復(fù)被中斷程序的執(zhí)行現(xiàn)場。
如圖5所示,本文通過向操作系統(tǒng)注冊自定義的SIGSEGV和SIGTRAP信號處理函數(shù),并通過設(shè)置頁保護(hù)和處理器調(diào)試模式,使訪存指令在執(zhí)行前和執(zhí)行后分別觸發(fā)頁錯誤和調(diào)試異常,從而實(shí)現(xiàn)可以攔截到每一條訪存指令的細(xì)粒度訪存監(jiān)控。具體而言,本文在SIGSEGV信號處理函數(shù)中,將信號棧中保存的TF標(biāo)志位置為1。這樣一來,當(dāng)SIGSEGV信號處理函數(shù)執(zhí)行結(jié)束后,sigreturn函數(shù)使用信號棧中保存的上下文信息恢復(fù)被中斷程序的執(zhí)行現(xiàn)場時會將處理器的TF標(biāo)志位置為1,從而使處理器進(jìn)入到單步執(zhí)行模式。被中斷的訪存指令在單步執(zhí)行模式下執(zhí)行結(jié)束后,處理器將會觸發(fā)調(diào)試異常。接下來,操作系統(tǒng)的調(diào)試異常處理例程將向被監(jiān)控程序發(fā)送SIGTRAP信號。被監(jiān)控程序接收到SIGTRAP后,操作系統(tǒng)內(nèi)核會進(jìn)一步調(diào)用此前注冊的SIGTRAP信號處理函數(shù)。至此,通過對SIGSEGV和SIGTRAP信號的融合處理,本文實(shí)現(xiàn)了分別在一條訪存指令執(zhí)行前和執(zhí)行后這2個時間點(diǎn)中斷被監(jiān)控程序的執(zhí)行。在SIGTRAP信號處理函數(shù)中,本文對單步模式下被訪問到的虛擬內(nèi)存頁重新施加頁保護(hù),使得后續(xù)對該虛擬內(nèi)存頁的訪問可以被持續(xù)監(jiān)控,從而突破頁保護(hù)機(jī)制只支持頁粒度訪存監(jiān)控的局限性。
Figure 5 Fine-grained page protection圖5 細(xì)粒度頁保護(hù)
在借助調(diào)試異常實(shí)現(xiàn)細(xì)粒度訪存監(jiān)控之外,本文進(jìn)一步利用MPK的輕量化特性,實(shí)現(xiàn)運(yùn)行時開銷更低的內(nèi)存訪問權(quán)限控制。具體而言,本文在程序初始階段,向操作系統(tǒng)內(nèi)核申請一個內(nèi)存保護(hù)鍵值pkey,并通過pkey_mprotect系統(tǒng)調(diào)用將pkey標(biāo)記到擬監(jiān)控內(nèi)存區(qū)域的頁表項(xiàng)。擁有相同pkey的虛擬內(nèi)存頁構(gòu)成了一個內(nèi)存頁分組,以下簡稱pkey分組。在完成pkey與虛擬頁之間的綁定后,本文通過執(zhí)行WRPKRU指令修改PKRU寄存器中pkey對應(yīng)的訪問權(quán)限描述位,限制被監(jiān)控程序?qū)key分組的訪問,即施加頁保護(hù)。WRPKRU是非特權(quán)態(tài)指令,執(zhí)行開銷非常低。相較于通過mprotect系統(tǒng)調(diào)用修改頁表項(xiàng),以配置PKRU寄存器的方式修改虛擬內(nèi)存頁訪問權(quán)限,可以避免引入用戶態(tài)和內(nèi)核態(tài)之間的上下文切換開銷。此外,每個處理器核心擁有獨(dú)立的PKRU寄存器,對PKRU寄存器內(nèi)容的修改不需要在處理器核心之間同步。而修改頁表項(xiàng)則不得不引入開銷顯著的TLB flush操作,以實(shí)現(xiàn)處理器核之間的同步。綜上,本文借助MPK機(jī)制,實(shí)現(xiàn)了一種相較于傳統(tǒng)的mprotect更加輕量化的頁保護(hù)機(jī)制。
在針對pkey分組施加頁保護(hù)之后,被監(jiān)控程序?qū)key分組的訪問將使其觸發(fā)頁錯誤而被中斷。針對此情形,操作系統(tǒng)內(nèi)核同樣會向被監(jiān)控程序發(fā)送SIGSEGV信號,并將被訪問到的pkey分組對應(yīng)的pkey值保存于信號棧。本文在SIGSEGV信號處理函數(shù)中,從信號棧中獲取到被監(jiān)控程序正試圖訪問的pkey分組對應(yīng)的pkey,并通過修改中斷現(xiàn)場保存的PKRU寄存器中pkey對應(yīng)的訪問權(quán)限控制位,解除對pkey分組的訪問限制,使被監(jiān)控程序可以恢復(fù)執(zhí)行對pkey分組的訪問。類似地,本文通過在SIGSEGV信號處理函數(shù)中設(shè)置中斷現(xiàn)場保存的TF標(biāo)志位,使被監(jiān)控程序在完成對pkey分組的訪問權(quán)限之后觸發(fā)調(diào)試異常,從而實(shí)現(xiàn)在訪存指令執(zhí)行結(jié)束后再次攔截被監(jiān)控程序。SIGTRAP信號處理函數(shù)通過配置中斷現(xiàn)場保存的PKRU寄存器中pkey對應(yīng)的訪問權(quán)限控制位,重新對pkey分組施加訪問限制,使被監(jiān)控程序?qū)key分組的后續(xù)訪問可以被持續(xù)監(jiān)控到。
至此,本文基于對pkey分組訪問權(quán)限違例異常和處理器調(diào)試異常的融合處理,突破了MPK僅支持pkey分組粒度訪問權(quán)限控制的監(jiān)控粒度局限性,實(shí)現(xiàn)了細(xì)粒度的訪存監(jiān)控。此外,上述輕量化細(xì)粒度訪存監(jiān)控機(jī)制僅需要占用1個pkey,沒有觸及MPK僅提供有限數(shù)量pkey的硬件資源局限性。
基于頁保護(hù)實(shí)現(xiàn)訪存監(jiān)控,是以使被監(jiān)控程序觸發(fā)訪問權(quán)限違例異常為基礎(chǔ);而編譯器插樁則是在程序編譯期間面向訪存指令插入訪存監(jiān)控邏輯。與基于頁保護(hù)監(jiān)控訪存行為相比,編譯器插樁訪存指令引入的運(yùn)行時開銷更低且可擴(kuò)展性更好,具有更好的性能表現(xiàn)。但是,在監(jiān)控能力方面,編譯器插樁具有一定的局限性?;诰幾g器插樁實(shí)現(xiàn)訪存監(jiān)控,需要重新編譯被監(jiān)控程序的源碼,這使得編譯器插樁無法被用于非開源程序和第三方庫等。本文提出的輕量化細(xì)粒度訪存監(jiān)控,可有效彌補(bǔ)編譯器插樁在監(jiān)控能力方面的局限性。通過融合基于MPK的輕量化細(xì)粒度頁保護(hù)和編譯插樁,本文提出了一種混合式訪存監(jiān)控機(jī)制,實(shí)現(xiàn)了對訪存監(jiān)控性能和訪存監(jiān)控能力的兼顧。
混合式訪存監(jiān)控機(jī)制的目標(biāo)場景是目標(biāo)程序主體源碼可重編譯而目標(biāo)程序所依賴的部分動態(tài)鏈接庫不可重編譯的情形,這種場景也是真實(shí)應(yīng)用中普遍存在的情形?;旌鲜皆L存監(jiān)控的核心思想是利用MPK的輕量化特性,實(shí)現(xiàn)對虛擬內(nèi)存訪問權(quán)限的低開銷頻繁切換。具體而言,與細(xì)粒度頁保護(hù)機(jī)制類似,混合式訪存監(jiān)控在程序初始化階段申請pkey并使用該pkey標(biāo)記擬監(jiān)控的虛擬內(nèi)存區(qū)域構(gòu)建pkey分組,并通過配置pkey對應(yīng)的PKRU寄存器中的訪問權(quán)限控制位,實(shí)現(xiàn)對pkey分組的訪問約束。對于目標(biāo)程序中支持源碼重編譯的部分,混合式訪存監(jiān)控采用編譯器插樁訪存指令的方式注入訪存監(jiān)控邏輯,并在訪存指令前后分別插入2條WRPKRU指令配置PKRU寄存器中pkey對應(yīng)的訪問權(quán)限控制位,以解除和恢復(fù)對pkey分組的訪問約束,從而使被插樁到的訪存指令在程序運(yùn)行階段不會觸發(fā)訪問權(quán)限違例異常,即實(shí)現(xiàn)頁保護(hù)免疫。由于WRPKRU操作非常輕量化(4.3節(jié)的實(shí)驗(yàn)結(jié)果表明,WRPKRU操作引入的額外開銷不超過4%),上述針對單條訪存指令的細(xì)粒度頁保護(hù)免疫過程得以有效兼顧編譯器插樁的性能優(yōu)勢。同時,對于被監(jiān)控程序中不支持重編譯的訪存指令,其對pkey分組的訪問會因觸發(fā)訪問權(quán)限違例異常而被監(jiān)控到。
至此,本文通過基于MPK的細(xì)粒度頁保護(hù)免疫,實(shí)現(xiàn)了兼顧編譯器插樁性能優(yōu)勢和頁保護(hù)功能優(yōu)勢的混合式訪存監(jiān)控機(jī)制。
本文在一個Linux服務(wù)器(內(nèi)核版本5.4.0)上開展了實(shí)驗(yàn)測評。該服務(wù)器有2個20核Intel?Xeon?Gold 6230 2.10 GHz處理器。DRAM大小是64 GB (每個socket 32 GB)。本文使用的測試程序由clang-6.0.1編譯,編譯插樁工具基于LLVM 6.0.1實(shí)現(xiàn)。所有實(shí)驗(yàn)結(jié)果都是10次運(yùn)行結(jié)果的平均值。
本文在內(nèi)存對象緩存系統(tǒng)Memcached[13]中,分別實(shí)現(xiàn)了以下幾種訪存監(jiān)控機(jī)制:(1)本文提出的細(xì)粒度頁保護(hù)機(jī)制PP(Page Protection);(2)本文提出的基于MPK處理器擴(kuò)展的輕量化細(xì)粒度頁保護(hù)機(jī)制(MPK);(3)本文提出的輕量化細(xì)粒度頁保護(hù)與編譯器插樁相融合的混合式訪存監(jiān)控機(jī)制(MPK-CI);(4)僅插入WRPKRU操作而不執(zhí)行訪存監(jiān)控的對比組(WRPKRU)。其中,WRPKRU對比組不具備訪存監(jiān)控功能,主要用于驗(yàn)證WRPKRU操作的輕量化特性。
本文使用Memtier[14]測試程序生成輸入數(shù)據(jù),對上述集成了訪存監(jiān)控功能的Memcached變體實(shí)現(xiàn)進(jìn)行壓力測試。測試過程中,Mmcached運(yùn)行4個服務(wù)器工作線程,Memtier運(yùn)行16個工作線程,每個工作線程模擬50個客戶端,每個客戶端發(fā)起10 000個針對Memcached服務(wù)端的讀寫請求操作(共計(jì)800萬次請求)。其中,Memtier觸發(fā)的讀寫請求操作中,Set操作和Get操作的比例為1∶10,數(shù)據(jù)對象的大小為32 B。實(shí)驗(yàn)過程中,使用綁核工具numactl分別將Memcached進(jìn)程和Memtier進(jìn)程綁定在CPU 0和CPU 1上。
本文記錄了在不同Memcached變體實(shí)現(xiàn)作為服務(wù)端的情形下,Memtier完成800萬次讀寫請求操作所需的時間,并以缺省Memcached實(shí)現(xiàn)(不監(jiān)控訪存行為)作為服務(wù)端的運(yùn)行時間為基準(zhǔn),對實(shí)驗(yàn)結(jié)果進(jìn)行歸一化處理。
本文通過寫保護(hù)Memcached內(nèi)置slab分配器所分配的內(nèi)存頁,監(jiān)控Memcached對動態(tài)內(nèi)存對象的訪存行為。圖 6展示了本文對比測評的訪存監(jiān)控機(jī)制相對于缺省Memcached實(shí)現(xiàn)的相對時間開銷。其中,PP引入了相對缺省Memcached實(shí)現(xiàn)5.07倍的時間開銷。得益于用戶空間內(nèi)存訪問權(quán)限控制的輕量化特性,輕量化細(xì)粒度頁保護(hù)的相對時間開銷下降至3.43,相比于PP的減少了約32%。MPK-CI分組展示了使用編譯器插樁監(jiān)控Memcached程序源碼樹下items.c源文件中的訪存操作而基于輕量化細(xì)粒度頁保護(hù)機(jī)制監(jiān)控Memcached程序中其他訪存行為的實(shí)驗(yàn)結(jié)果。 MPK-CI的相對時間開銷約為2.1。WRPKRU分組只在缺省Memcached實(shí)現(xiàn)的所有訪存操作前后插入WRPKRU操作而不執(zhí)行訪存監(jiān)控,該分組的實(shí)驗(yàn)結(jié)果表明,在Memcached中頻繁執(zhí)行WRPKRU引入的額外開銷低于4%。
本文基于Intel MPK硬件擴(kuò)展提出了一種輕量化且細(xì)粒度的訪存監(jiān)控機(jī)制,相比于傳統(tǒng)方法,降低了超過30%的性能開銷。與此同時,本文工作突破了傳統(tǒng)頁保護(hù)機(jī)制僅支持頁粒度訪存監(jiān)控的局限性,基于硬件頁保護(hù)機(jī)制實(shí)現(xiàn)了字節(jié)粒度的訪存監(jiān)控。此外,本文提出的輕量化細(xì)粒度頁保護(hù)訪存監(jiān)控機(jī)制能夠與編譯插樁方法高效融合,有效彌補(bǔ)了編譯器插樁無法覆蓋程序中不支持重編譯部分的局限性。