OVS DPDK vhost-user詳解(十一)

這篇文章是對vhost-user / virtio-pmd架構的深入技術研究,該架構針對基於DPDK的高性能用戶空間網絡,面向所有有興趣瞭解這些基本細節的架構師和開發人員。

介紹

本文將在讀者熟悉vhost-net架構的基礎上展示使用vhost-net協議將網絡處理從qemu移出並移入內核驅動程序的好處。在本文中,我們將更進一步,展示如何在客戶機和主機上使用DPDK(數據平面開發包)將數據平面從內核中移出,並移入用戶空間來提高網絡性能使用。爲實現此目標,我們還將詳細研究vhost協議的新實現:vhost-user庫。

讀完本文,您應該會對基於vhost-user / virtio-pmd的架構中涉及的所有部分有深刻的瞭解,並且瞭解其使性能顯著提升的原因。

DPDK及其優勢

您可能已經聽說過DPDK。該用戶空間快速數據包處理庫是許多網絡功能虛擬化(NFV)應用程序的核心,它可以繞過內核的網絡協議棧 ,完全在用戶空間中實現這些應用程序。

DPDK是一組用戶空間庫,使用戶可以創建優化的,高性能的數據包處理應用程序,它具有許多優勢,功能強大,在開發人員中非常受歡迎,下面列舉了DPDK的一些優勢:

  • 多核親和性——DPDK將每個不同的線程固定到特定的邏輯核心,以最大程度地提高並行性。
  • 大頁支持——DPDK具有多層的內存管理層(例如Mempool庫或Mbuf庫),但是在後臺,所有內存均使用mmap分配在hugetlbfs中。使用2MB甚至1GB大頁,使DPDK減少了緩存丟失和TLB查找。
  • 無鎖環形緩衝區——DPDK的數據包處理基於Ring庫,Ring庫提供了高效的無鎖環形隊列,該隊列支持突發入隊和出隊操作。
  • 輪詢模式驅動——爲避免中斷開銷,DPDK中提供了輪詢模式驅動(PMD)抽象規範。
  • VFIO支持——VFIO(虛擬功能I / O)提供了一個用戶空間驅動程序開發框架,允許用戶空間應用程序通過將I /
    O空間直接映射到應用程序的內存來直接與硬件設備進行交互。

除了這些功能之外,DPDK還支持其他兩項技術,這些技術爲我們提供了可大大提高雲環境中網絡應用程序性能的工具,它們是:

  • Vhost-user庫——實現vhost協議的用戶空間庫。
  • Virtio-PMD——建立在DPDK的PMD抽象規範之上,virtio-pmd驅動程序實現了virtio規範,並允許以標準且有效的方式使用虛擬設備。

DPDK和OVS:完美結合

DPDK的巨大優勢之一是帶來了已經廣受歡迎的Open vSwitch(OVS-DPDK)的性能提升。Open vSwitch是一種功能豐富的多層分佈式虛擬交換機,被廣泛用作虛擬環境和其他SDN應用程序的主要網絡層。

傳統上將其分爲基於快速內核的數據路徑(fastpath),由流表和較慢的用戶空間數據路徑(slowpath)組成,後者處理與快速路徑中的任何流都不匹配的數據包。通過集成OVS與DPDK,快速路徑同樣在用戶領域,最大限度地減少了內核與用戶領域的交互,並充分利用了DPDK提供的高性能。結果是,使用DPDK的OVS與原始OVS相比,性能提高了約10倍。

那麼,如何將OVS-DPDK的功能和性能與基於virtio的架構相結合呢?在下一節中,我們將逐步爲您介紹各個重要部分。

DPDK中的Vhost-user庫

vhost協議是一組消息和機制,旨在將virtio數據路徑處理從QEMU卸載到外部元素(配置virtio環並進行實際的數據包處理的處理程序),最重要的機制是:

  • 一組消息,允許QEMU將virtqueue的內存佈局和配置發送到處理程序。
  • 一對eventfd類型的文件描述符,允許客戶機繞過QEMU,並直接向處理程序發送通知或從處理程序接收通知:Available Buffer通知(從客戶機發送至處理程序以指示有準備好處理的緩衝區)和Used Buffer通知(從處理程序發送給客戶機以指示其已完成對緩衝區的處理)

現在我們介紹vhost-user庫。該庫內置於DPDK中,是vhost協議的用戶空間實現,可讓qemu將virtio設備數據包處理工作卸載到任何DPDK應用程序(例如Open vSwitch)。

vhost-user庫和vhost-net內核驅動程序之間的主要區別是通信通道。vhost-net內核驅動程序使用ioctl實現此通道,vhost-user庫定義了通過unix套接字發送的消息結構。

可以將DPDK應用程序配置爲提供unix套接字(服務器模式)並使QEMU連接到它(客戶端模式),但是相反的情況也是可能的,這允許DPDK重新啓動而無需重新啓動VM。

在此套接字上,所有請求均由QEMU發起,其中一些請求需要響應,例如GET_FEATURES請求或任何設置了REPLY_ACK位的請求。

與使用vhost-net內核模塊一樣,vhost-user庫允許主數據庫通過執行以下重要操作來配置數據平面卸載:

  1. 功能協商:virtio功能和特定vhost-user的功能都以類似的方式協商:首先,QEMU“獲取”處理程序支持的功能的位掩碼,然後“設置” 其與自身支持功能的子集。

  2. 內存區域配置:QEMU設置內存映射區域,以便處理程序可以對它們進行mmap()。

  3. Vring配置:QEMU設置要使用的虛擬隊列數量及其在內存區域中的地址。請注意,vhost-user支持多隊列,因此可以配置多個虛擬隊列以提高性能。

  4. 發送KICK和CALL文件描述符:通常,使用irqfd和ioeventfd機制。

由於這種機制,DPDK應用程序現在可以通過與客戶機共享內存區來處理數據包,並且可以直接與客戶機之間發送和接收通知,而無需qemu干預。

將一切結合在一起的最後一個元素是QEMU的virtio設備模型。它具有兩個主要任務:

  • 它模擬了一個virtio設備,該設備顯示在客戶機的特定PCI端口中,客戶機可對該端口進行無縫探測和配置,此外,它還將ioeventfd映射到模擬設備的內存映射I/ O空間,並將irqfd映射到它的全局系統中斷(Global System Interrupt,GSI)。結果是,客戶機沒有意識到在沒有QEMU干預的情況下,通知和中斷都在vhost-user庫之間來回轉發。
  • 它沒有實現實際的virtio數據路徑,而是在vhost-user協議中充當卸載數據處理的角色,將卸載該處理工作到DPDK流程中的vhost-user庫中。
  • 它處理來自控制虛擬隊列的請求,在某些情況下,將其轉換爲虛擬主機用戶請求並轉發給vhost-user後端。

下圖顯示了作爲DPDK-APP的一部分運行的虛擬主機用戶庫如何使用virtio-device-model和virtio-pci設備與qemu和客戶機進行交互:
在這裏插入圖片描述
幾個要點:

  • virtio內存區域最初是由客戶機分配的。
  • 相應的virtio驅動程序通常通過virtio規範中定義的PCI BARs配置接口與virtio設備進行交互。
  • virtio-device-model(位於QEMU內部)使用vhost-user協議配置vhost-user庫,以及設置irqfd和ioeventfd文件描述符。
  • 客戶機分配的virtio內存區域由vhost用戶庫(即DPDK應用程序)映射(使用mmap 系統調用)。
  • 結果是,DPDK應用程序可以直接在客戶機內存中讀取和寫入數據包,並使用irqfd和ioeventfd機制直接對客戶機發出通知。

客戶機中的用戶空間網絡

我們已經介紹了DPDK的vhost-user實現如何使我們能夠將數據路徑處理從主機內核(vhost-net)卸載到專用的DPDK用戶空間應用程序(例如Open vSwitch),從而顯著提高網絡的性能。現在,我們將看一看如何通過在客戶機的用戶空間中運行高性能網絡應用程序(例如NFV服務)來取代virtio-net內核方法,以提高用戶機網絡性能。

爲了能夠直接在設備上運行用戶空間網絡應用程序,我們需要三個組件:

  1. VFIO:VFIO是一個用戶空間驅動程序開發框架,允許用戶空間應用程序直接與設備進行交互(繞過內核)。

  2. Virtio-pmd驅動程序:是基於Poll Mode Driver抽象規範構建的DPDK驅動程序,可實現virtio協議。

  3. IOMMU驅動程序:IOMMU驅動程序用於管理虛擬IOMMU(I / O內存管理單元),該設備是對支持DMA的設備執行I / O地址映射的模擬設備。

讓我們一一詳細介紹這些組件。

VFIO

VFIO代表虛擬功能I / O。但是,vfio-pci內核驅動程序的維護者Alex Williamson建議將其稱爲“用於用戶空間I / O的通用框架”,這種表述可能更準確。VFIO基本上是用於構建用戶空間驅動程序的框架,功能有:

  • 映射設備配置和I / O內存區域到用戶內存

  • 基於IOMMU組的DMA和中斷重新映射和隔離。我們將在本文中更深入地介紹IOMMU的概念及其工作方式。現在,我們說它允許創建虛擬I /O存儲空間,映射到物理內存(類似於普通MMU映射非IO虛擬內存的方式),因此,當設備要將DMA映射到虛擬I /O地址時,IOMMU將重新映射該地址並可能應用隔離和其他安全策略。

  • 基於Eventfd和irqfd的信令機制可支持往返於用戶空間應用程序的事件和中斷。

引用內核文檔:“如果要在VFIO之前編寫驅動程序,則必須經歷整個開發週期才能成爲合適的內核驅動程序,必須以out-of-tree的方法維護,或者使用沒有任何 IOMMU保護概念,中斷支持功能有限的UIO框架,並且需要root特權才能訪問諸如PCI配置空間之類的東西。”

VFIO公開了一個用戶友好的API,用於創建字符設備(在/ dev / vfio /中),該設備支持用於描述設備的ioctl調用,設備描述符上的I / O區域及其讀/寫/ mmap偏移以及描述和註冊中斷通知機制。

Virtio-pmd

DPDK提供了一個稱爲Poll Mode Driver(PMD)的驅動程序抽象規範,位於設備驅動程序和用戶應用程序之間,爲用戶應用程序提供了很大的靈活性,同時保持了可擴展性,即爲新設備實現驅動程序的能力。

下面列出了它的一些極其出色的功能:

  • 一組API允許特定的驅動程序實現特定設備的接收和傳輸功能。
  • 可以靜態和動態配置每個端口和每個隊列的硬件卸載
  • 提供了用於統計信息的可擴展API,允許驅動程序定義自己的特定驅動程序的統計信息,並允許應用程序探查可用的統計信息並檢索它們。

virtio輪詢模式驅動(virtio-pmd)是使用PMD API的衆多驅動程序之一,爲使用DPDK編寫的應用程序提供對virtio設備的快速無鎖訪問,從而提供了使用virtio的virtqueue進行數據包接收和傳輸的基本功能。。

除了任何PMD具有的所有功能之外,virtio-pmd驅動程序實現還支持:

  • 接收時每個數據包具有靈活的可合併緩衝區,發送時每個數據包具有分散的緩衝區
  • 多播和混雜模式
  • MAC / VLAN過濾

結果是一個高性能的用戶空間virtio驅動程序,該驅動程序允許任何DPDK應用程序無縫使用virtio的標準界面。

IOMMU介紹

IOMMU幾乎等同於用於I / O空間的MMU(設備直接使用DMA訪問內存)。它位於主內存和設備之間,爲每個設備創建虛擬I / O空間並提供一種機制將虛擬I / O內存動態映射到物理內存。因此,當驅動程序配置設備的DMA(例如網卡)時,它會配置虛擬地址,並且當設備嘗試訪問它們時,它們將被 IOMMU重新映射。
在這裏插入圖片描述
它具有許多優點,例如:

  • 可以分配較大的連續虛擬內存區域,而不必在物理內存中連續。
  • 某些設備不支持足夠長的地址來訪問整個物理內存,IOMMU解決了該問題。
  • 內存受到保護,不會受到惡意設備執行的DMA攻擊,這些設備嘗試訪問未明確爲其分配的內存。這些設備僅“看到”虛擬地址空間,並且運行中的操作系統專門控制IOMMU的映射。
  • 在某些架構,支持中斷重新映射,可以允許中斷隔離和遷移。
  • 像往常一樣,一切都是有代價的,對於IOMMU來說,其不足是:
    • 與頁面轉換服務有關的性能下降
    • 添加的頁面轉換表會佔用物理內存

最後,IOMMU提供了PCIe地址轉換服務接口,設備可以使用該接口在內部設備表後備緩衝區(TLB)中查詢和緩存地址轉換。

vIOMMU——客戶機的IOMMU

當然,如果存在物理IOMMU(例如Intel VT-d和AMD-VI),則qemu中將存在虛擬IOMMU。具體地說,QEMU的vIOMMU具有以下特徵:

  • 它將客戶機I /O虛擬地址(IOVA)轉換爲物理地址(GPA),可以通過QEMU的內存管理系統將其轉換爲QEMU的主機虛擬地址(HVA)。
  • 執行設備隔離。
  • 實現I / O TLB API,以便可以從外部qemu中查詢映射。

因此,爲了使虛擬設備可以與虛擬IOMMU一起使用,我們必須:

  • 使用可用的API向vIOMMU中創建必要的IOVA映射。當前這些API是:
    • 用於內核驅動程序的內核DMA API
    • 用於用戶空間驅動程序的VFIO
  • 使用虛擬I / O地址配置設備的DMA

vIOMMU和DPDK集成

虛擬IOMMU與任何用戶空間網絡應用程序之間的集成通常是通過VFIO驅動程序完成的。正如我們已經提到的那樣,該驅動程序將執行設備隔離並將iova-gpa映射自動添加到IOMMU。

除了支持VFIO設置網絡設備外,使用DPDK在IOMMU方面還有另一個非常重要的好處。由於DPDK使用的內存管理機制,該機制分配了一個靜態內存池用於存儲數據包緩衝區和虛擬隊列,設備TLB同步消息的數量急劇下降,因此與之相關的性能損失也大大降低。大頁面的使用進一步有助於優化TLB查找,因爲更少的內存頁面可以覆蓋相同數量的內存。

vIOMMU和vhost-user集成

當在QEMU中被模擬的設備嘗試DMA到客戶機的virtio I / O空間時,它將使用vIOMMU TLB查找頁面映射並執行安全的DMA訪問。問題是如果實際的DMA被卸載到外部進程,例如使用vhost-user庫的DPDK應用程序,會發生什麼情況?

當vhost-user庫嘗試直接訪問共享內存時,它必須將所有地址(I / O虛擬地址)轉換爲它自己的內存,這是通過向QEMU的vIOMMU請求設備TLB API的轉換來實現的。Vhost-user庫(以及vhost-kernel驅動程序)使用PCIe的地址轉換服務標準消息集,以使用配置IOMMU支持時創建的輔助通信通道(另一個unix套接字)請求頁面轉換爲QEMU。

總體而言,必須進行3種地址轉換:

  1. QEMU的vIOMMU將IOVA(I / O虛擬地址)轉換爲GPA(客戶機物理地址)。

  2. Qemu的內存管理將GPA(客戶物理地址)轉換爲HVA(qemu進程地址空間內的主機虛擬地址)。

  3. Vhost-user庫將(QEMU的)HVA轉換爲自己的HVA。這通常很簡單,只需在vhost-user庫映射QEMU的內存時將QEMU的HVA添加到mmap返回的地址中即可。

顯然,所有這些轉換都可能對性能產生重要影響,尤其是在使用動態映射的情況下。但是,靜態的大頁分配(這正是DPDK所做的)可以最大程度地降低這種性能損失。

下圖增強了以前的vhost-user架構,來包括IOMMU組件:
在這裏插入圖片描述
這幅複雜圖示幾個要點:

  • 客戶機的物理內存空間是客戶機所感知的物理內存,但顯然,它位於QEMU的進程(主機)虛擬地址內部。分配了虛擬隊列內存區後,該內存最終會落在客戶機的物理內存空間中的某個位置。
  • 將I / O虛擬地址分配給包含虛擬隊列的內存範圍時,帶有其關聯的客戶機物理地址(GPA)的條目將添加到vIOMMU的TLB表中。
  • 另一方面,QEMU的內存管理系統知道客戶機物理內存空間在其自己的內存空間中的位置,因此,它能夠將客戶機物理地址轉換爲主機(QEMU)的虛擬地址。
  • 當vhost-user庫嘗試訪問其沒有轉換的IOVA時,它將通過輔助unix套接字發送IOTLB未命中消息。
  • IOTLB API接收請求並查找地址,首先將IOVA轉換爲GPA,最後將GPA轉換爲HVA,然後通過主機unix套接字將轉換後的地址發送回vhost-user庫。

最後,vhost-user庫必須進行一次最終轉換。由於已將qemu的內存映射到自己的內存,因此必須將qemu的HVA轉換爲自己的HVA並訪問共享內存。

小結

在這篇文章中,我們介紹了許多組件,包括DPDK,virtio-pmd,VFIO,IOMMU等。

下圖顯示了這些組件塊如何一起工作以實現vhost-user / virtio-pmd架構:
在這裏插入圖片描述
幾個要點:

  • 將該圖與上一張圖進行比較,我們添加了使用硬件IOMMU,VFIO和特定於供應商的PMD驅動程序,將主機的OVS-DPDK應用程序連接到物理網卡所需的組件。它等同於爲客戶機完成的操作,所以無需大驚小怪。

流程示例

以下流程圖顯示了設置virtio高性能數據平面所需的步驟:
在這裏插入圖片描述

控制平面

以下是設置控制平面所需的步驟:

  1. 當主機(OvS)中的DPDK應用程序啓動時,它將創建一個套接字(在服務器模式下),用於與qemu進行與virtio相關的協商。

  2. qemu啓動時,它將連接到主套接字,如果vhost提供了VHOST_USER_PROTOCOL_F_SLAVE_REQ功能,則當主機(OvS)中的DPDK應用程序啓動時,它將創建一個套接字(以服務器模式使用),用於與qemu進行virtio相關的協商。

  3. 當QEMU <-> vhost-library協商結束時,它們之間共享兩個套接字。一個套接字用於virtio配置,另一個套接字用於iotlb消息交換。

  4. 客戶機啓動,vfio驅動程序綁定到PCI設備,它將創建對iommu組的訪問(取決於硬件拓撲)

  5. 當dpdk應用程序在客戶機中啓動時,它執行以下初始化步驟:

    a. 初始化PCI-vfio設備。vfio驅動程序還將PCI配置空間映射到用戶內存。

    b. 分配虛擬隊列。

    c. 使用vfio執行virtqueue內存空間DMA映射需求,通過IOMMU內核驅動程序將dma映射添加到vIOMMU設備。

    d. 然後進行virtio功能協商。在這種情況下,用作virtqueue基址的地址是IOVA(在I / O虛擬地址空間中)。設置eventfd和irqfd的映射,以便可以在客戶機和vhost-user庫之間直接路由中斷和通知,而無需QEMU的干預。

    e. 最後,dpdk應用程序爲網絡緩衝區分配了大量的連續內存。該內存區域的映射也通過VFIO和IOMMU驅動程序添加到vIOMMU。

至此,配置完成,數據平面(虛擬隊列和通知機制)可以使用了。

數據平面

爲了傳輸數據包,需要執行以下步驟:

  1. 客戶機中的DPDK應用程序命令virtio-pmd發送數據包,它將緩衝區寫入並將其對應的描述符添加到可用的描述符環中。

  2. 主機中的vhost-user PMD正在輪詢虛擬隊列,因此它立即檢測到新的描述符可用並開始處理它們。

  3. 對於每個描述符,vhost-user PMD映射其緩衝區(即:將其IOVA轉換爲HVA)。在極少數情況下,緩衝區內存是尚未在虛擬主機用戶的IOTLB中映射的頁面,將向QEMU發送請求。但是,客戶機中的DPDK應用程序分配了靜態大頁面這一事實使對QEMU的IOTLB請求保持最小。

  4. vhost-user PMD將緩衝區複製到mbufs(DPDK應用程序使用的消息緩衝區)中。

  5. 描述符被添加到使用的描述符環中,客戶機中的DPDK應用程序會立即檢測到這些描述符,該客戶機也正在輪詢虛擬隊列。

  6. mbuf由主機中的DPDK應用程序處理。

總結和結論

DPDK是一項有前途的技術,因其爲用戶領域的高性能網絡帶來的好處而受到了廣泛的關注,這項技術與Open vSwitch相結合,不僅可以提供現代虛擬環境所需的靈活性和性能,還將在NFV部署中發揮關鍵作用。

爲了充分利用此技術(作爲數據中心交換數據路徑和客戶機中NFV應用程序的使能器),有必要在主機和客戶機之間安全地創建有效的數據路徑。這就是virtio-net技術發揮作用之處。

Vhost-user提供了一種可靠且安全的機制,可將網絡處理任務卸載到基於DPDK的應用程序中。它和vIOMMU集成,提供隔離和內存保護,同時將QEMU從處理所有數據包的繁重工作中解放出來。

在客戶機中,通過在DPDK(virtio-pmd)中實施virtio規範,可以在客戶機系統中創建快速數據路徑,從而利用DPDK的輪詢模式驅動程序提供的高效內存管理和高速運行。

原文鏈接:https://blog.csdn.net/weixin_37097605/article/details/103286440

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章