本文將介紹可選的幾種不同配置選項(xiàng),并為讀者日后的選擇提供建議。
環(huán)境抽象層(EAL)參數(shù)
環(huán)境抽象層(EAL)是DPDK的核心。它是DPDK的一個(gè)庫(kù)。顧名思義,它負(fù)責(zé)抽象出環(huán)境(硬件、操作系統(tǒng)等)并為軟件提供統(tǒng)一的接口。EAL要處理很多東西,所以也不難理解為何它會(huì)是DPDK中最復(fù)雜的一個(gè)部分。由EAL負(fù)責(zé)處理的包括:
· 管理CPU核心和非統(tǒng)一內(nèi)存訪問(wèn)(NUMA)節(jié)點(diǎn)
· 將硬件設(shè)備的寄存器映射到內(nèi)存中,使它們可受DPDK輪詢模式驅(qū)動(dòng)程序(PMDs)驅(qū)動(dòng)
· 管理硬件和軟件中斷
· 抽象出平臺(tái)差異,如字節(jié)序、緩存行大小等
· 管理內(nèi)存和多進(jìn)程同步
· 提供與原子、內(nèi)存屏障和其他同步原語(yǔ)共通的獨(dú)立于平臺(tái)和操作系統(tǒng)的方法
· 加載和枚舉硬件總線,設(shè)備和PMD
以上只羅列了EAL的部分功能,但這足以體現(xiàn)它對(duì)于DPDK的重要性。因此,DPDK中大量配置與EAL有關(guān)也不足為奇。目前,可以通過(guò)(直接或間接地)為DPDK初始化例程指定命令行參數(shù)對(duì)EAL進(jìn)行配置。DPDK應(yīng)用命令行通常如下所示:
./app
某些使用DPDK的應(yīng)用(如OvS-DPDK)可能會(huì)對(duì)用戶隱藏此步驟,因此可能不需要明確指定EAL命令行參數(shù),但盡管如此此步驟還是會(huì)在后臺(tái)進(jìn)行。
IO虛擬地址(IOVA)模式
DPDK是一個(gè)用戶態(tài)應(yīng)用框架,使用DPDK的軟件可以像其他軟件一樣使用常規(guī)虛擬地址。但除此之外,DPDK還提供了用戶態(tài)PMD和一組API,以實(shí)現(xiàn)完全以用戶態(tài)執(zhí)行IO操作。本系列的前一篇也已經(jīng)提到過(guò),硬件不能讀取用戶空間虛擬地址;它使用的是IO地址——物理地址(PA)或IO虛擬地址(IOVA)。
DPDK API對(duì)物理和IO虛擬地址不作區(qū)分,即使不是由IO內(nèi)存管理單元(IOMMU)提供VA部分,也都以IOVA來(lái)代表兩種地址。但DPDK卻會(huì)區(qū)分物理地址用作IOVA的情況,和IOVA與用戶空間虛擬地址匹配的情況。它們?cè)贒PDK API中被稱為IOVA模式,可分為兩種:作為PA的IOVA模式,和作為VA的IOVA模式。
作為物理地址(PA)的IOVA模式
作為PA的IOVA模式下,分配到整個(gè)DPDK存儲(chǔ)區(qū)的IOVA地址都是實(shí)際的物理地址,而虛擬內(nèi)存的分配與物理內(nèi)存的分配相匹配。該模式的一大優(yōu)點(diǎn)就是它很簡(jiǎn)單:它適用于所有硬件(也就是說(shuō),不需要IOMMU),并且它適用于內(nèi)核空間(將真實(shí)物理地址轉(zhuǎn)換為內(nèi)核空間地址的開(kāi)銷是微不足道的)。實(shí)際上,這就是DPDK長(zhǎng)期以來(lái)的運(yùn)作方式,在很多方面它都被認(rèn)為是默認(rèn)的選項(xiàng)。
然而,作為PA的IOVA模式也存在一些缺點(diǎn)。其中一個(gè)就是它需要根用戶特權(quán)——如果無(wú)法訪問(wèn)系統(tǒng)的頁(yè)面映射,DPDK就無(wú)法獲取內(nèi)存區(qū)域的真實(shí)物理地址。因此,如果系統(tǒng)中沒(méi)有root權(quán)限,就無(wú)法以該模式運(yùn)行。
圖1.作為PA的IOVA模式。
作為PA的IOVA模式還有另外一個(gè)值得一提的限制——虛擬內(nèi)存分配要遵循物理內(nèi)存分配。這意味著如果物理內(nèi)存空間被分段(被分成許多小段而不是幾個(gè)大段)時(shí),虛擬內(nèi)存空間也要遵循同樣的分段。極端情況下,分段可能過(guò)于嚴(yán)重,導(dǎo)致被分割出來(lái)物理上連續(xù)的片段數(shù)量過(guò)多,耗盡DPDK用于存儲(chǔ)這些片段相關(guān)信息的內(nèi)部數(shù)據(jù)結(jié)構(gòu),就會(huì)讓DPDK初始化失敗。
圖2.作為PA的IOVA模式下PA分段示例。
應(yīng)對(duì)這些問(wèn)題,DPDK社區(qū)提出了解決方法。舉例來(lái)說(shuō),一種減少分段影響的方式是使用更大的分頁(yè)——問(wèn)題雖然沒(méi)被解決,但是單獨(dú)的1千兆字節(jié)(GB)段比獨(dú)立的2兆字節(jié)(MB)段能大幅度減小分段的數(shù)量。另外一種廣泛使用的解決方式則是在啟動(dòng)時(shí)引導(dǎo)系統(tǒng)并保留大頁(yè),而不是在運(yùn)行時(shí)。但上述的解決方法都不能根本地解決問(wèn)題,而且整個(gè)DPDK社區(qū)都習(xí)慣了要去解決這些問(wèn)題,每個(gè)DPDK用戶(有意或無(wú)意)在使用時(shí)都會(huì)采取相同的思維模式——“我需要X MB內(nèi)存,但以防萬(wàn)一,我要保留X + Y MB!”
作為虛擬地址(VA)的IOVA模式
相比之下,作為VA的IOVA模式不需遵循底層物理內(nèi)存的分布。而是重新分配物理內(nèi)存,與虛擬內(nèi)存的分配匹配。DPDK EAL依靠?jī)?nèi)核基礎(chǔ)設(shè)施來(lái)實(shí)現(xiàn)這一點(diǎn)。內(nèi)核基礎(chǔ)設(shè)施又反過(guò)來(lái)使用IOMMU重新映射物理內(nèi)存。
圖3.作為VA的IOVA模式。
這種方式的優(yōu)點(diǎn)顯而易見(jiàn):作為VA的IOVA模式下,所有內(nèi)存都是VA-和IOVA-連續(xù)的。這意味著所有需要大量IOVA連續(xù)內(nèi)存的內(nèi)存分配更有可能成功,因?yàn)閷?duì)硬件來(lái)說(shuō),即使底層物理內(nèi)存可能不存在,內(nèi)存看上去還是IOVA連續(xù)的。由于重新映射,IOVA空間片段化的問(wèn)題就變得無(wú)關(guān)緊要。不管物理內(nèi)存被分段得多么嚴(yán)重,它總能被重新映射為IOVA-連續(xù)的大塊內(nèi)存。
圖4.作為VA的IOVA模式下的分段示例。
作為VA的IOVA模式還有另一個(gè)優(yōu)點(diǎn),它不需要任何權(quán)限。這是因?yàn)樗恍枰L問(wèn)系統(tǒng)頁(yè)面映射。這樣就可以允許以非root用戶身份運(yùn)行DPDK,而且在特權(quán)訪問(wèn)不受歡迎的環(huán)境中,如云原生環(huán)境就可以更加容易地使用DPDK。
當(dāng)然, 作為VA的IOVA模式也有一個(gè)缺點(diǎn)。出于各種原因,有時(shí)候可能不能選擇使用IOMMU。這種情況可能包括:
· 硬件不支持IOMMU
· 平臺(tái)可能本身就沒(méi)有IOMMU(比如沒(méi)有IOMMU模擬的VM)
·軟件設(shè)備(例如,DPDK的內(nèi)核網(wǎng)絡(luò)接口(KNI)PMD)不支持作為VA的IOVA模式
· 一些IOMMU(通常是模擬的IOMMU)的地址寬度可能有限,雖然這不妨礙用作VA的IOVA模式,但限制了其有效性
· 在非Linux *的操作系統(tǒng)上使用DPDK
但是,這些情況還是相對(duì)較少,絕大多數(shù)情況下,作為VA的IOVA模式都可以正常工作。
IOVA模式的選擇
很多情況下,DPDK默認(rèn)選擇作為PA的IOVA模式,因?yàn)閺挠布嵌冗@是最安全的模式。所有給定的硬件(或軟件)PMD至少都可以保證支持作為PA的IOVA模式。盡管如此,如果條件允許,還是強(qiáng)烈建議所有DPDK用戶使用作為VA的IOVA模式,畢竟此模式具有不可否認(rèn)的優(yōu)勢(shì)。
但是,用戶不必非要在兩者中選擇一個(gè)??梢宰詣?dòng)檢測(cè)出最合適的IOVA模式,而且默認(rèn)選項(xiàng)絕對(duì)適用于大多數(shù)情況,因此不需要用戶來(lái)做此選擇。如果默認(rèn)選項(xiàng)并不合適,用戶可以使用--iova-mode EAL命令行參數(shù)嘗試使用EAL標(biāo)志(適用于DPDK 17.11及更高版本)來(lái)代替IOVA模式:
1./app --iova-mode=pa # use IOVA as PA mode
2./app --iova-mode=va # use IOVA as VA mode
大多數(shù)情況下,VA和PA模式不會(huì)互相排斥,可以使用任一模式,但在某些情況下,作為PA模式的IOVA是唯一可用的選擇。當(dāng)不能使用作為VA模式的IOVA時(shí),即使EAL參數(shù)要求使用作為VA模式的IOVA,DPDK也會(huì)自動(dòng)切換為作為PA模式的IOVA。
DPDK還提供了一個(gè)API,可查詢運(yùn)行時(shí)正在使用的IOVA模式,但通常這不會(huì)在用戶應(yīng)用中使用,因?yàn)橹挥邢袷荄PDK PMD和總線驅(qū)動(dòng)程序才會(huì)要求獲取這種信息。
IOVA模式和DPDK PCI驅(qū)動(dòng)程序
DPDK本身并不執(zhí)行所有硬件設(shè)備寄存器和中斷映射,它需要內(nèi)核的幫助。為此,DPDK要使用的所有硬件設(shè)備都需要綁定到一個(gè)通用外圍組件互連(Peripheral Component Interconnect, PCI)內(nèi)核驅(qū)動(dòng)程序。和一般的設(shè)備內(nèi)核驅(qū)動(dòng)程序不同的是,通用此驅(qū)動(dòng)程序并未被鎖定到特定的PCI ID集,即針對(duì)某類設(shè)備的常規(guī)驅(qū)動(dòng)程序,可以與任何類型的PCI設(shè)備一起使用。
要將設(shè)備綁定到通用驅(qū)動(dòng)程序,DPDK用戶應(yīng)該參考DPDK文檔。該文檔描述了在所有支持的操作系統(tǒng)中如何進(jìn)行此項(xiàng)操作。但是,關(guān)于DPDK支持的各種用戶態(tài)IO驅(qū)動(dòng)程序及其支持的IOVA模式,還需要有所說(shuō)明。雖然內(nèi)核驅(qū)動(dòng)程序和支持的IOVA模式之間看起來(lái)可能存在1:1的對(duì)應(yīng)關(guān)系,但事實(shí)并非如此。下面的部分將討論Linux上可用的驅(qū)動(dòng)程序。
用戶空間IO(UIO)驅(qū)動(dòng)程序
DPDK代碼庫(kù)中最早的內(nèi)核驅(qū)動(dòng)程序是igb_uio驅(qū)動(dòng)程序。在DPDK最初的發(fā)展階段,這個(gè)驅(qū)動(dòng)程序就已經(jīng)存在了,因此它是DPDK開(kāi)發(fā)人員使用最廣泛也是最熟悉的驅(qū)動(dòng)程序。
此驅(qū)動(dòng)程序依賴內(nèi)核用戶空間IO(UIO)基礎(chǔ)結(jié)構(gòu)運(yùn)作,并為所有中斷類型(遺留、消息信號(hào)中斷(MSI)和MSI-X)提供支持,以及創(chuàng)建虛擬功能。它還公開(kāi)硬件設(shè)備通過(guò)/dev/uio文件系統(tǒng)注冊(cè)和中斷句柄,然后DPDK EAL將它們用于將它們映射到用戶空間并使它們可用于DPDK PMD。
igb_uio驅(qū)動(dòng)程序非常簡(jiǎn)單,能做的也并不多,因此它不支持使用IOMMU也就不足為奇了?;蛘?,更確切地說(shuō),它確實(shí)支持IOMMU,但僅在傳輸模式下,它在IOVA和物理內(nèi)存地址之間建立1:1映射。igb_uio不支持使用完整的IOMMU模式。因此, igb_uio驅(qū)動(dòng)程序僅支持IOVA作為PA模式,并且根本無(wú)法在IOVA中作為VA模式工作。
類似于igb_uio的驅(qū)動(dòng)程序在內(nèi)核中可用:uio_pci_generic。它的工作方式與igb_uio非常相似,只是它的功能更加有限。例如,igb_uio支持所有中斷類型(傳統(tǒng),MSI和MSI) -X),而uio_pci_generic只支持遺留中斷。更重要的是,igb_uio可以創(chuàng)建虛擬函數(shù)(Virtual Function, VF),而uio_pci_generic則不能;因此,如果在使用DPDK物理函數(shù)(Physical Function, PF)驅(qū)動(dòng)程序時(shí)創(chuàng)建VF是必需的一步,igb_uio是唯一的選擇。
因此,在大多數(shù)情況下,igb_uio與uio_pci_generic相同或更可取。關(guān)于使用IOMMU的所有限制同樣適用于igb_uio和uio_pci_generic驅(qū)動(dòng)程序 - 它們不能使用完整的IOMMU功能,因此僅支持IOVA作為PA模式。
VFIO內(nèi)核驅(qū)動(dòng)程序
上述驅(qū)動(dòng)程序的替代方案是vfio-pci驅(qū)動(dòng)程序。它是虛擬功能I / O(VFIO)內(nèi)核基礎(chǔ)結(jié)構(gòu)的一部分,并在Linux 3.6版中引入。VFIO基礎(chǔ)設(shè)施使設(shè)備寄存器和設(shè)備中斷可供用戶空間應(yīng)用程序使用,并可使用IOMMU設(shè)置IOVA映射以從用戶空間執(zhí)行IO。后一部分至關(guān)重要 - 此驅(qū)動(dòng)程序?qū)榕cIOMMU一起使用而開(kāi)發(fā),在較舊的內(nèi)核上,如果沒(méi)有啟用IOMMU,它甚至都無(wú)法工作。
與直觀看法相反,使用VFIO驅(qū)動(dòng)程序允許使用IOVA作為PA和IOVA作為VA模式。這是因?yàn)?,雖然建議使用IOVA作為VA模式來(lái)利用該模式的所有好處,但沒(méi)有什么能阻止DPDK的設(shè)置IOMMU映射的EAL以遵循物理內(nèi)存布局1:1的方式;畢竟IOVA映射是任意的。在這種情況下,即使使用IOMMU,DPDK也可以在IOVA中作為PA模式工作,從而允許DPDK KNI等工作。但是,仍然需要root權(quán)限才能將IOVA用作PA模式。
在更新的內(nèi)核(4.5+,向后移植到一些舊版本)上,有一enable_unsafe_noiommu_mode選項(xiàng),允許在沒(méi)有IOMMU的情況下使用VFIO。這種模式適用于與基于UIO的驅(qū)動(dòng)程序相同的所有意圖和目的,并具有所有相同的優(yōu)點(diǎn)與限制。
內(nèi)核驅(qū)動(dòng)程序的選擇
一般來(lái)說(shuō),在應(yīng)用的角度我們并不需要選擇內(nèi)核驅(qū)動(dòng)程序。通常來(lái)說(shuō),內(nèi)核驅(qū)動(dòng)程序的選擇是由具體的情況來(lái)決定的。下面的流程圖可以幫助決定在哪些特定情況下可以使用哪個(gè)驅(qū)動(dòng)程序:
圖5.通用PCI內(nèi)核驅(qū)動(dòng)程序選擇流程圖。
如圖5所示,很明顯應(yīng)該在幾乎所有的情況下都使用VFIO驅(qū)動(dòng)程序,尤其是在生產(chǎn)環(huán)境中。IOMMU在硬件級(jí)別可提供設(shè)備隔離,這可以讓使用DPDK的應(yīng)用程序更加安全,而作為VA的IOVA模式則可以通過(guò)重新映射讓內(nèi)存得到更好的利用,而且不需要root權(quán)限來(lái)運(yùn)行DPDK應(yīng)用。但是,某些用例需要igb_uio或uio_pci_generic驅(qū)動(dòng)程序。
軟件輪詢模式驅(qū)動(dòng)程序(PMD)
除此之外,DPDK附帶的一系列軟件PMD不需要通用內(nèi)核PCI驅(qū)動(dòng)程序,而是依靠標(biāo)準(zhǔn)內(nèi)核基礎(chǔ)架構(gòu)來(lái)提供硬件支持。這樣一來(lái),DPDK幾乎可以與任何硬件同時(shí)使用,即使DPDK本身不支持它。
PCAP庫(kù)是用于網(wǎng)絡(luò)硬件的廣泛使用和支持的數(shù)據(jù)包捕獲庫(kù)。目前,DPDK具有可用于PCAP庫(kù)的PMD。DPDK還支持具有AF_PACKET PMD的Linux網(wǎng)絡(luò),而且還可以在DPDK中本地支持AF_XDP。雖然使用這些PMD會(huì)有性能成本(有時(shí)相當(dāng)可觀的),但其優(yōu)點(diǎn)是設(shè)置很容易,而且這些PMD一般完全不在乎IOVA模式。
總結(jié)
本文深入介紹了DPDK如何處理物理內(nèi)存,也概述了在使用各種Linux *內(nèi)核驅(qū)動(dòng)程序時(shí)DPDK提供的物理尋址功能。
-
物理內(nèi)存
+關(guān)注
關(guān)注
0文章
11瀏覽量
8573 -
csdn
+關(guān)注
關(guān)注
2文章
17瀏覽量
6999
原文標(biāo)題:DPDK內(nèi)存篇(二): 深入學(xué)習(xí) IOVA
文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
DPDK內(nèi)存管理的IOMMU和IOVA技術(shù)總結(jié)

物理內(nèi)存模型的演變
Cjson協(xié)議申請(qǐng)不到內(nèi)存如何處理?
Arm上帶DPDK的Open vSwitch測(cè)試系列
如何處理屬性顯示不可用
DPDK的設(shè)計(jì)方法與API應(yīng)用介紹
電腦物理內(nèi)存過(guò)高的處理技巧

DPDK內(nèi)存的基本概念

簡(jiǎn)述高速流量處理DPDK替代方案

如何使用DPDK和GPUdev增強(qiáng)內(nèi)聯(lián)數(shù)據(jù)包處理

評(píng)論