姚旭佳, 吳新月
(上海交通大學,軟件學院,上海 200240)
越來越多的云用戶尋求安全技術來保護云中的數據和代碼,這促進了英特爾SGX在云環境中的廣泛應用。通過提供稱為enclave的可信執行環境,SGX實現數據保密性和完整性。enclave數據和代碼存儲在稱為“enclave頁緩存”(EPC)的特殊內存區域。EPC的內容是加密的,并且僅在enclave內的線程中可見。但EPC大小最多可配置為256 MB。為了支持大于該大小的enclave,在EPC內存管理中應用了分頁。虛擬機(Virtual Machine)是一種特殊的軟件,簡稱VM,可以模擬出完整的計算機系統,是云廠商向用戶提供服務的方式,用戶的應用都運行在VM中。目前,EPC資源靜態地劃分在多個VM之間,靜態分配的EPC資源無法適應VM動態變化的需求,導致EPC資源利用不足。
本文介紹了EPC超售的設計與實現。結合下面2個機制以支持EPC超售:在虛擬機監視器層中執行的分頁機制和通過VM層和虛擬機監視器層之間的合作實現的氣球機制。這樣可以動態分配云中的EPC資源,同時性能開銷很少。
本文作出以下貢獻。
(1)第一個基于軟件的EPC超售的解決方案,幾乎沒有性能開銷。
(2)云環境中enclave的詳細性能評估。EPC超售機制可使Memcached平均吞吐量最高提高49.2%。
近年來,圍繞英特爾SGX技術在虛擬化環境中的研究有所增加[1-4]。用戶發現enclave很難在虛擬化環境中實現與物理機器相同的性能。EPC的規模限制在256MB。雖然通過分頁支持大于該大小的enclave,但引入了大量性能開銷。目前,EPC資源只能在多個VM之間靜態分區,分配給VM的EPC部分在啟動時確定,在其生命周期內無法更改。因此每個VM的可用資源可能小于EPC總數。EPC資源減少導致昂貴的分頁程序會更頻繁地被觸發。此外,當整個EPC資源已分配給其他VM時,不可能在SGX支持下創建新的VM,導致SGX的靈活性有限。
為了解決這個問題,EPC資源可以以類似于內存的方式超售。內存超售是一種廣泛應用于虛擬化場景的技術,它使內存能夠在多個虛擬機中動態分配。使用超售內存,虛擬機監視器可以從閑置的VM中回收內存頁面,并將它們分配給另一個VM。當EPC以類似方式超售時,可以更好地利用和提高虛擬化場景中的enclave性能。然而,與內存資源相比,EPC作為一種特殊類型的內存,管理起來要復雜得多。如何通過高效科學的方式在虛擬化環境中超售EPC資源是一個待解決的問題。
EPC超售的架構如圖1所示。

圖1 EPC超售整體架構
EPC超售通過2種機制實現:在分頁單元內實現的分頁機制和基于氣球驅動程序和氣球監測器實現的氣球機制。分頁單元通過將EPC頁面交換出去和交換進來管理EPC資源。分配給VM的物理EPC頁面中的內容可以通過分頁單元逐出到常規內存中,因此物理EPC頁面已被釋放,將來可以使用,通過缺頁故障處理可以直接滿足VM的EPC資源需求。此外,由于不需要客戶虛擬機的合作,這種機制在大多數情況下是切實可行的。但是,分頁機制會引入大的開銷,主要來自跟蹤頁面元數據和頁面驅逐。
氣球監視器計算每個VM的EPC部分,并要求VM通過通信渠道調整使用的虛擬EPC的大小。氣球驅動程序將標記一些虛擬頁面無法使用,以限制對這些頁面的訪問,然后可以安全地回收映射到這些頁面的物理EPC資源。由于虛擬機監視器不涉及分頁程序,氣球機制比分頁機制效率更高。虛擬機監視器只是顯示虛擬機可以使用多大的虛擬EPC,然后虛擬機做分頁來釋放一些資源。由于VM更接近應用程序,他們擁有更多有關EPC使用的信息,因此在驅逐期間可以做出更好的選擇。然而,由于氣球機制需要客戶VM合作,因此在任何時候都是不可行的。惡意VM可能會拒絕響應虛擬機監視器的請求,因此虛擬機監視器無法回收物理EPC資源?;蛘?,VM處于重負荷下無法及時響應。虛擬機監視器無法及時獲得物理EPC資源,其他VM可能會饑餓甚至崩潰。
氣球機制結合分頁機制可以應對惡意和無響應的虛擬機。對于圖1,惡意的VM-2可以拒絕配合氣球機制。在這種情況下,EPC資源可以基于分頁機制實現對VM的透明性,這樣管理EPC資源不需要VM配合,雖然VM-2禁用氣球驅動程序,分配給它的物理EPC頁面仍然可以回收。
EPC頁面具有不同的類型并相互連接。一些頁面僅包含enclave代碼和數據,稱為常規頁面。對于每個enclave,有一個安全enclave控制結構(SECS)頁面,記錄常規頁面的元數據。
EPC管理器必須跟蹤頁面結構信息,以便進行頁面的換進換出。一個簡單的策略是捕獲所有SGX指令,然后虛擬機監視器可以清楚地查看EPC的使用情況和EPC布局,但是這樣性能成本高。為了降低成本,需要減少被捕獲指令的數量,如表1所示。

表1 Intel SGX的EPC管理指令
在表1中,SGXv1中有9個指令對EPC布局有影響,我們只捕獲其中3個指令,性能開銷小。可以這樣做的原因是即使元數據不完整,虛擬機監視器也能管理EPC資源,SGX指令的返回值暴露了EPC布局的信息,這些信息可以用來補充記錄的元數據。
驅逐EPC頁面時為了安全,首先通過EBLOCK阻止創建常規EPC頁面的新映射,再用ETRACK檢查TLB狀態,用EWB加密頁面內容并將頁面逐出到常規內存。當VM和虛擬機監視器對同一范圍的EPC執行驅逐時(稱為雙分頁),可能會發生沖突。于是,列出了所有可能的沖突和解決方案。
(1)重復阻塞頁面。當VM和虛擬機監視器都嘗試驅逐相同的EPC頁面時,后來的EBLOCK將失敗并返回錯誤。如果虛擬機監視器失敗,則忽略此錯誤并繼續驅逐EPC頁面;如果VM失敗就放棄驅逐。
(2)并發執行EBLOCK和ETRACK /EWB。這時EBLOCK可能會失敗,ETRACK/EWB可能會觸發一般保護故障。如果EBLOCK在虛擬機監視器層中失敗,虛擬機監視器將反復重試;如果EBLOCK在VM層中失敗,VM將放棄驅逐。如果ETRACK和EWB因并發訪問而失敗,則反復重試。
(3)并發執行ETRACK。這會觸發保護錯誤,解決方案是直接重試。
上述解決方案的一個限制是需要更改VM層中的SGX驅動程序,不過修改量不大。
測試EPC超售對于內存密集型應用的性能,具體配置如表2所示。

表2 混合負載配置
Memcached的測試分兩個階段,第一個階段是插入100 000個元素初始化;另一個是運行階段,200 000個操作產生ycsb-a工作負載。每個元素都有20B大小的鍵和1KB大小的值。Memcached中有4個工作線程,還有一個計時器線程每50 ms計算平均吞吐量。快速排序是對一個隨機生成的數組排序。
Memcached在沒有快速排序運行的情況下的表現如圖2所示。

圖2 沒有快速排序運行下的Memcached性能
基線是靜態分區策略下的性能。EPC超售的平均吞吐量比基線高49.2%。
對于Memcached和QuickSort的混合工作負載如圖3所示。

圖3 Memcached和QuickSort混合工作負載下的性能
EPC資源競爭加劇導致EPC超售的吞吐量從9 800萬ops/s降至4 400萬ops/s。但是,EPC超售仍優于基線,節省13.7%的執行時間。
Eleos[5]通過應用級分頁管理SGX內存,需要修改源代碼,而EPC超售對應用程序是透明的。雖然相關廠商提供了專為EPC超售設計的新硬件功能[6],但是這些功能目前無法使用,而我們的解決方案僅涉及軟件修改。
關于內存超售有大量的研究[7],但EPC管理比常規內存管理更為復雜。
本文提出了EPC超售的分頁機制和氣球機制,測試結果顯示,EPC超售比靜態分區有顯著的性能提升。