2.2 Virtqueue交互隊列
Virtio 1.1引入了Packed Virtqueue的概念,對應(yīng)的Virtio 1.0的Virtqueue被稱為Split Virtqueue。
如圖3所示,為Virtio1.0的Split Virtqueue結(jié)構(gòu)。Virtqueue由三部分組成:
- 描述符表
- 可用的描述符環(huán)
- 已使用的描述符環(huán)
- Virtio 1.0的Split Virtqueue具有一些缺點:
- 如果是虛擬化場景軟件模擬Virtio設(shè)備的話,因為分散的數(shù)據(jù)結(jié)構(gòu),導(dǎo)致Cache利用率較低,每次請求都會有很多Cache不命中;
- 如果是硬件實現(xiàn)的話,每次描述符需要多次設(shè)備DMA訪問。
圖3 Virtio 1.0中的Split Virtqueue
如圖4所示,Virtio 1.1引入了Packed Virtqueue的概念。整個描述符只有一個數(shù)據(jù)結(jié)構(gòu)。這樣,如果軟件實現(xiàn)Virtio設(shè)備模擬的話,可以提升描述符交互的Cache命中率。如果硬件實現(xiàn)的,可以降低設(shè)備DMA的訪問次數(shù)。
圖4 Virtio1.1的Packed Virtqueue
2.3 Virtio交互
驅(qū)動和設(shè)備的交互,符合生產(chǎn)者消費者模型的數(shù)據(jù)及通知(Notification)的交互行為。驅(qū)動把共享隊列的隊列項準備好,通過寫寄存器的方式通知設(shè)備。設(shè)備收到驅(qū)動發(fā)送的通知則處理隊列項以及相應(yīng)的數(shù)據(jù)搬運工作,結(jié)束后更新隊列狀態(tài)并通知(設(shè)備通知驅(qū)動是通過中斷)驅(qū)動。驅(qū)動接收到中斷通知時候,把已經(jīng)使用的隊列項釋放,并更新隊列狀態(tài)。
一個典型的通用的驅(qū)動和設(shè)備的交互流程如圖5所示。Virtio場景的驅(qū)動和設(shè)備交互,驅(qū)動給設(shè)備的通知(Notification)稱為Kick,設(shè)備給驅(qū)動的通知稱為Interrupt(中斷)。Kick和Interrupt操作是Virtio接口的一部分,在虛擬化場景,Kick和Interrupt需要非常大的CPU切換代價。驅(qū)動希望在Kick之前產(chǎn)生盡可能多的待處理緩沖項(一個緩沖項對應(yīng)一個描述符和描述符指向的數(shù)據(jù)塊);同樣的,設(shè)備希望處理盡可能多的緩沖項然后再發(fā)送一個中斷。通過盡量處理更多的緩沖項的方式,來攤薄通知的代價。
這種策略是一種理想狀態(tài),因為大多數(shù)時候驅(qū)動并不知道下一組緩沖項何時帶來,因此不得不每一組緩沖項準備好之后就必須要Kick設(shè)備。同樣的,設(shè)備在處理完相應(yīng)的緩沖項之后,就盡快的發(fā)送中斷給驅(qū)動,以達到盡可能小的延遲。
圖5 Virtio驅(qū)動和設(shè)備交互示意圖
如圖6所示,在設(shè)備模擬的虛擬化場景下,驅(qū)動可以暫時禁用中斷,設(shè)備也可以暫時禁用Kick。通過這樣的機制,可以最大限度的減少通知的代價,并且不影響性能和延遲。Virtio 1.1支持兩種通知抑制機制,因此共有三種模式:
- 使能通知模式:完全無抑制,使能通知;
- 禁用通知模式:如圖6所示,可以完全禁止對方發(fā)通知給自己;
- 使能特定的描述符通知模式:告知對方一個特定的描述符,當(dāng)對方順序處理到此描述符處理完成時產(chǎn)生通知。
圖6 通過前后端禁用抑制通知的Virtio驅(qū)動和設(shè)備交互
2.4 總結(jié)
如圖7,Virtio基于分層的設(shè)計思想,定義了三層Virtio設(shè)備架構(gòu):
- 最下層的總線接口。PCI是最常用的Virtio場景使用的總線,但Virtio協(xié)議不僅僅支持PCI,也支持MMIO和Channel IO等。
- 通用的Virtio交互接口。包括Virtqueue、功能特征位、配置空間等。Virtio交互接口是Virtio最核心的功能,通過Virtio交互接口實現(xiàn)了不同類型設(shè)備的標準化。
- 上層的特定設(shè)備接口。在Virtio協(xié)議里,定義網(wǎng)絡(luò)、塊、控制臺、SCSI、GPU等各種不同類型的設(shè)備。
圖7 分層的Virtio框架圖
Virtio的優(yōu)點體現(xiàn)在:
- Virtio實現(xiàn)了盡可能多的設(shè)計共享。這樣,在開發(fā)的時候就可以復(fù)用很多軟件和硬件資源,達到快速開發(fā)的目的。
- Virtio實現(xiàn)了接口的標準化。標準化體現(xiàn)在兩個方面:
- (1)一個是通用的Virtio交互接口,統(tǒng)一了不同的設(shè)備類型軟硬件交互;
- (2)另一個是基于Virtio的Virtio-net、Virtio-block等廣泛應(yīng)用于云計算虛擬化場景,Virtio已經(jīng)成為事實上的標準I/O接口。
而Virtio的缺點,則同樣因為Virtio實現(xiàn)了接口的標準化,而忽略了不同設(shè)備類型數(shù)據(jù)傳輸?shù)奶攸c。因此,在一些大數(shù)據(jù)量傳輸?shù)膱鼍?,效率比較低下。如果是在類似HPC這樣的性能和延遲非常敏感的場景,Virtio就不是一個很好的選擇。
**03 **虛擬化卸載
虛擬化卸載指的是計算機虛擬化中消耗CPU資源較多的接口設(shè)備模擬、熱遷移、虛擬化管理等任務(wù)的卸載。
a. 接口設(shè)備的卸載
前面我們介紹了網(wǎng)絡(luò)、遠程存儲等IO工作任務(wù)的卸載,而虛擬化卸載主要指的是跟IO相關(guān)的接口設(shè)備的卸載,例如網(wǎng)絡(luò)、存儲等接口設(shè)備的卸載。IO接口設(shè)備的卸載本身上也是IO硬件虛擬化的過程,比如我們通過VT-d技術(shù)實現(xiàn)從VM中pass though訪問硬件設(shè)備,某種程度上也可以認為是把運行在Hypervisor中的模擬設(shè)備 “卸載”到了硬件。因此,IO接口設(shè)備的卸載本質(zhì)上和IO設(shè)備硬件虛擬化是一件事情。
如圖8,為了實現(xiàn)設(shè)備接口的標準化、加速IO處理的性能以及潛在的充分利用現(xiàn)有的虛擬化生態(tài)(例如更好的支持設(shè)備熱遷移)等原因,阿里云在神龍芯片里實現(xiàn)了硬件的Virtio接口設(shè)備,通過Virtio接口設(shè)備支持Virtio-net網(wǎng)絡(luò)驅(qū)動和Virtio-blk存儲驅(qū)動等,實現(xiàn)了類虛擬化IO設(shè)備Virtio的硬件“卸載”。
圖8 阿里云神龍芯片網(wǎng)絡(luò)和存儲接口示意圖
AWS的NITRO系統(tǒng)支持網(wǎng)絡(luò)、本地存儲和遠程存儲,NITRO實現(xiàn)了網(wǎng)絡(luò)接口設(shè)備ENA/EFA(AWS自定義接口)的硬件“卸載”以及存儲接口設(shè)備NVMe(遠程存儲EBS使用的是NVMe接口,本地存儲也是NVMe接口)的卸載。
b. 接口設(shè)備卸載后的遷移問題
當(dāng)把設(shè)備“卸載”到硬件,讓VM直接訪問硬件設(shè)備,這使得VM的設(shè)備熱遷移變的非常有挑戰(zhàn)。vDPA(vhost Data Path Acceleration,vhost數(shù)據(jù)路徑加速,其中vhost是Virtio后端設(shè)備模擬的輪詢方式實現(xiàn))實現(xiàn)了一種折中的解決方案,如圖9所示,vDPA把Virtio分為了控制面和數(shù)據(jù)面:
- 控制面。vDPA控制面依然是通過要經(jīng)過Hypervisor的處理,用于設(shè)備和VM之間的配置更改和功能協(xié)商,用于建立和終止數(shù)據(jù)面。
- 數(shù)據(jù)面。vDPA數(shù)據(jù)面包括共享隊列以及相應(yīng)的通知機制,用于在設(shè)備和VM之間傳輸實際的數(shù)據(jù)。
圖9 vDPA框架示意圖
使用vDPA一個重要原因是,在熱遷移的時候可以很方便的把Virtio數(shù)據(jù)面的處理切換回傳統(tǒng)的Virtio/Vhost后端設(shè)備模擬。這樣,可以充分利用現(xiàn)有的基于KVM/Qemu對Virtio設(shè)備遷移的解決方案來完成設(shè)備的遷移。
c. 虛擬化管理的卸載
從軟件虛擬化進化到硬件虛擬化的過程,本身就可以看作是一個硬件加速以及硬件卸載的過程。我們逐步的剝離了Hypervisor的功能,比如通過VT-x技術(shù)“卸載”了Hypervisor的CPU/內(nèi)存等的軟件模擬,以及通過VT-d以及vDPA等技術(shù)“卸載”了設(shè)備軟件模擬。這些剝離,使得Hypervisor越來越輕量,整個系統(tǒng)的虛擬化開銷也越來越少。進一步的,我們可以把虛擬化的管理(例如Linux平臺主流的管理程序Libvirt)卸載到硬件中的嵌入式軟件運行。
如圖10, 我們通過橋接的方式,實現(xiàn)主機軟件和硬件中嵌入式軟件通信機制。把虛擬化管理等軟件任務(wù)從主機卸載到嵌入式系統(tǒng)(依然有很小一部分任務(wù)無法卸載,如虛擬機資源分配、vCPU調(diào)度等)。這樣,可以把幾乎100%的主機資源提供給用戶,使用戶虛擬機得到近乎物理機的性能。
圖10 虛擬化管理卸載圖
通過虛擬化管理卸載到硬件中的嵌入式CPU軟件,我們可以做到物理上的業(yè)務(wù)和管理分離,整個業(yè)務(wù)主機跟云計算管理網(wǎng)絡(luò)安全的隔離,只能通過特定的接口訪問到Lite Hypervisor,除此之外,不能訪問主機的任何資源。這樣,即使有潛在的運維操作失誤,也無法對業(yè)務(wù)主機造成影響。
-
接口
+關(guān)注
關(guān)注
33文章
8605瀏覽量
151194 -
DPU
+關(guān)注
關(guān)注
0文章
358瀏覽量
24184 -
i/o
+關(guān)注
關(guān)注
0文章
33瀏覽量
4593
發(fā)布評論請先 登錄
相關(guān)推薦
評論