前情提要。所謂「x86虛擬化」並非搞定處理器就功德圓滿,畢竟一台電腦還有很多週邊設備,特別是I/O、網路和重要性逐漸增加的繪圖核心,也都是需要「高效能虛擬化」的重點項目。
I/O虛擬化:Intel VT-d,AMD Vi
想進一步讓系統I/O虛擬化,讓虛擬機可透過直接記憶體存取 (DMA) 與中斷重對映 (Interrupt Remapping) ,直接存取各種 I/O 周邊,硬體必須能夠管理、隔離所有週邊I/O裝置實際上所使用的DMA虛擬記憶體位址及中斷向量,這單靠處理器虛擬化是作不到的,需要系統晶片組具備相對應的硬體功能與BIOS和UEFI等韌體的協助。
Intel在2007年中期推出的北橋晶片組Q35首度支援VT-d技術(Intel Virtualization Technology For Directed I/O),具備轉換DMA記憶體位址的硬體功能,可隔離不同虛擬機所動用的I/O裝置記憶體位址。VT-d日後從伺服器到桌機到筆記型電腦,慢慢成為所有Intel x86平臺的「制式武裝」,也跟著處理器整合北橋和記憶體控制器,融合成處理器的一部分。
AMD在I/O虛擬化的進度較晚,2009年下半年的系統晶片組SR5690/SR5670,導入功能和VT-d大同小異的IOMMU(I/O Memory Management Unit),後來稱之為AMD Vi。
先進可程式化中斷控制器的虛擬化:AMD AVIC,Intel APICv
分配、協調各I/O週邊裝置存取處理器需求,發出中斷(Interrupt)時,知道該由哪個處理器負責,是近代多處理器環境的必要條件,而起源於1993年Pentium的先進可程式化中斷控制器(APIC, Advanced Programmable Interrupt Controller)則是其技術核心。但和記憶體虛擬化的狀況如出一轍,讓VMM建立軟體模擬的「Shadow APIC」不僅耗費處理器效能,更會造成虛擬機頻繁的進出執行環境。
AMD在2012年發表AVIC(Advanced Virtual Interrupt Controller),但遲至2016年才出現在Carrizo APU。Intel則是在2013年發布APICv(APIC Virtualization),在2013年實用於Ivy Bridge微架構的Xeon E5-2600 v2,在Broadwell世代更加精進,更徹底的硬體化。
網路卡虛擬化:Intel VT-c
身為乙太網路重要規格制定者之一的Intel,網路晶片對他們來說一直是相當重要的業務,所以讓網路卡跟上虛擬化風潮,也是理所當然的事情。其VT-c包含了2個部份:
VMDq:網路晶片內建的封包分類器,事先分開不同虛擬機的封包,減輕處理器的負擔。
VMDc:藉由PCI-SIG制定的SR-IOV(Single Root I/O Virtualization)技術,讓多個虛擬機可直接存取網路卡(或其他I/O裝置),無須勞駕VMM去分配其資源。
GPU虛擬化:Intel GVT,AMD MxGPU
Intel在2014年Haswell的Iris Pro整合繪圖核心提供了3種GPU虛擬化:指定給單獨虛擬機的GVT-d、執行標準驅動程式讓多個虛擬機分時共享(分片)的GVT-g、以及利用透過虛擬化專用驅動程式以便「獨樂樂不如眾樂樂」的GVT-s。但市場接受度究竟如何,就不再這裡討論了。
AMD則是在2016年發表基於SR-IOV的MxGPU,首款產品是FirePro S7150x2。當然一定會有科科想起nVidia更早就有了vGPU,但筆者不打算在這裡介紹,因為「GPU虛擬化」是一個很複雜很巨大的主題,值得特別撰文大書特書。
控制L3快取記憶體與主記憶體的「服務品質」:Intel RDT,AMD QoS指令
不過,最後還是稍微談一下「走火入魔」的x86虛擬化技術。
Intel在2013年Haswell與2014年的Broadwell微架構世代,進一步追求控制不同虛擬機器佔用L3快取空間與記憶體頻寬的精細調控機制(在Broadwell稱為Resouce Director Technology),實現「L3快取記憶體層級的QoS(Quality-Of-Service)」,避免系統資源被少數虛擬機吃光,或著讓VMM集中資源在最需要的虛擬機身上。
結果事隔多年,AMD也在Zen2加入類似的QoS指令,有時候還蠻同情x86虛擬機管理者廠商,都要開發Intel、AMD雙方的版本,真的是讓人覺得太科科了。