在最近的XenSummit 2016上,英特爾在一個Session上示範了基于Xen的GPU虛拟化線上遷移。為什麼後起之秀會吊打老司機?
我們先來看XenGT的架構

1、英特爾的顯示卡內建到CPU上,使用的顯存是記憶體,和CPU共同通路記憶體空間;
2、在hypervisor實作對GPU的陷阱(trap)和透傳(pass-through)機制,說明意思呢?就是說和CPU虛拟化類似的思路,特權的指令交由hypervisor,這些指令有虛拟機傳遞下來後被攔截,交由hypervisor來模拟實作。至于透傳機制,就是裝置直通給虛拟機或者說是虛拟機直接通路硬體。
3、虛拟機能夠直接通路GPU的東西是幀緩存和指令緩存,而所謂的特權資源是指I/O 寄存器和 PTEs。大家可以看我之前的文章《應用程式如何去通路硬體》,I/O 寄存器和 PTEs被虛拟化層攔截模拟,是以給帶虛拟機的不是真實的GPU位址線和顯存位址。
4、有了以上基礎之後我們就好辦了,隻要我們的底層的顯示卡硬體規格相同,和CPU虛拟化類似,在進行虛拟機遷移的時候,到了别的實體主機,我們隻需要拷貝映射的是特權資源(I/O 寄存器和 PTEs)。由于特權資源(I/O 寄存器和 PTEs)是虛拟的,是以到另外一台拷貝過去直接放入并連結到一塊GOU顯示卡即可。
5、這種方式基于軟體排程,虛拟機裡看到的都是由hypervisor層模拟出的GPU,由hypervisor排程各guest虛拟機對的GPU行為,再統一對實體GPU進行通路操作。
我們也來看看GRID vGPU的架構:
1、在架構的實作上,GRID vGPU的實作是,在Dom0中運作一個vGPU的管理程式,他的作用是為了切片或者分區(Partitioning)。
2、獨立的硬體顯示卡上自帶顯存空間;
3、對于GPU的透傳(pass-through)機制是通過硬體來實作的;
4、對于Timesharing/Oversubscription是通過硬體來實作的;
5、是以不管是幀緩存和指令緩存,還是特權資源(I/O 寄存器和 PTEs)都是在實體的硬體上,其虛拟機通路的顯示卡位址是真實的,由GRID vGPU配置設定。
6、是以這個東西都在硬體上,離開硬體就沒法使用,是以沒法線上遷移。
在這裡總結一下vGPU研發技術演進,對于其中的一些細小的知識點不做過多的詳細解讀,大家可以參看之前的文章《GPU虛拟化技術》一文。
對于NVIDIA的GPU虛拟化,其最初的時候和Citrix合作,根據IO虛拟化的實作工作機制,将GPU裝置成功的通過IO Pass-Through的方式透傳給虛拟機使用。後來可以在其上對實體裝置進行切分,分别提供給多台虛拟機使用。按照CUDA開發的規劃設計,未來的GPU虛拟化技術演進路線圖如下所示:
Pass-Through的技術實作有多種方式,比如通過Intel VT-d技術将裝置直接透傳給虛拟機。總的來說,Pass-Through主要有兩種實作形式:
Direct pass-through 顧名思義就是讓VM 直接通路實體硬體,是以VM 與GPU 是一對一的關系,這樣能提供完善的功能以及最好的性能,但是缺失了資源共享能力。
Mediated pass-through 也是VM直接通路實體硬體,但是并不是一對一的獨占關系,而是通路專門給VM配置設定的一塊區域。這種技術在中介特權(直接通路實體硬體)操作時能夠通路性能臨界資源,這種方案能滿足良好性能、功能完善和優秀共享能力的需求。
Direct pass-through将一個實體GPU隻配置設定給一個虛拟機使用,隻有被配置設定使用權的客戶虛拟機才能使用實體GPU,這種直接透傳法配置設定方式儲存了GPU 功能的完整性,在性能方面與真實系統環境下最為接近,并且還可以在虛拟環境中進行通用計算。但是,該方法無法滿足虛拟機資源共享的設計要求,無法降低計算成本,除此之外,直接透傳法的相容性較差,僅能夠使用于部分GPU 中。Xen VGA Passthrough利用英特爾公司的裝置虛拟化(Intel VT-d)技術将主顯示器暴露給某一個用戶端虛拟機,這就導緻其它的用戶端虛拟機甚至宿主虛拟機都無法對其通路,失去了該GPU 的使用權。它在用戶端虛拟機中實作了一些如 VGA BIOS、文本模式、IO 端口、記憶體映射、VESA 模式等顯示卡所具有的特殊細節,以此來支援直接通路的實作。
Mediated pass-through同樣是将裝置直通進入虛拟機,每個虛拟機被允許通路部分裝置資源,而無需系統管理程式的幹預,而特權操作是通過一個軟體層進行排程或者代理的。Mediated這個單詞在這裡翻譯為中介,中介的的直通擴充使用軟體的方式來實作。它維持直接傳遞的性能,同時避免了通過 SR-IOV标準等增加了硬體的複雜性。是以,這種技術就需要GPU以及虛拟化軟體共同來內建協作。
NVIDIA的GPU虛拟化由第一種實作,即硬體實作;英特爾的GPU虛拟化由第二種實作,即軟體實作。
最後還有一種技術:基于硬體排程的,SR-IOV标準裡,定義了GPU除了可以有physical function(PF),還有virtual function(VF),hypervisor把VF直接暴露給guest,guest操作VF可以像操作真的GPU一樣。AMD的GPU虛拟化好像就是采用的這種技術實作,這種技術也是對硬體的要求和複雜度非常高,當然這種也沒法線上遷移了。
Partitioning是一種将實體硬體進行切分的技術。這是最初在進行GPU虛拟化的過程中,在pass-through之後NVIDIA實作的技術,也就是GRID vGPU的技術,貌似是Kepler架構的實作。GRID vGPU是通過預先定義好的GPU-Group來進行切分的,使用者在管理層面選擇自己所需的GPU-Group來進行切分。當然英特爾就沒有在實體顯示卡上實作。
這個技術我們可以了解為GPU的分時複用,就和CPU的分時複用是一樣的,是以我就不用在詳細介紹了。這個技術實作起來比較複雜,不管是基于軟體的還是基于硬體的。
這個技術NVIDIA是基于硬體實作的,英特爾的是基于軟體實作的。
這個技術就是今天的說的了,英特爾在Xen上的XenGT已經實作,NVIDIA暫時還沒看到,不過就純技術角度來說,NVIDIA的這種硬體架構技術,如果需要實作線上遷移,實在難度不小,我猜測實作的思路有這幾種:
1、借用SDN的思想,将特權資源(I/O 寄存器和 PTEs)和硬體分離;
2、借用RDMA實作,通過感覺其他硬體的存在,遷移的時候通過複制特權資源而實作;
3、設定一個全局的特權資源池,特權資源在全局資源池内對所有硬體可視。