DPDK基礎-認識DPDK技術_第1頁
DPDK基礎-認識DPDK技術_第2頁
DPDK基礎-認識DPDK技術_第3頁
DPDK基礎-認識DPDK技術_第4頁
DPDK基礎-認識DPDK技術_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第1章認識DPDK第2章Cache和內(nèi)存第3章并行計算第4章同步互斥機制第5章報文轉(zhuǎn)發(fā)第6章PCIe與包處理I/O第7章網(wǎng)卡性能優(yōu)化第8章流分類與多隊列第9章硬件加速與功能卸載軟件正在統(tǒng)治整個世界。本書的開始部分會重點介紹DPDK誕生的背景、基本概念、核心算法,并結合實例講解各種基于IA平臺的數(shù)據(jù)面優(yōu)化技術,包括相關的網(wǎng)卡加速技術。希望可以幫助初次接觸DPDK的讀者全面了解DPDK,為后面的閱讀DPDK基礎篇共包括9章,其中前5章主要從軟件優(yōu)化的角度闡述如何利用DPDK來提升性能,包括cache優(yōu)化、并行計算、同步互斥、轉(zhuǎn)發(fā)算法等。后面4章則針對PCIe設備和高速網(wǎng)卡詳細介紹如何優(yōu)化網(wǎng)卡性能,提寬吞吐率。第1章介紹了DPDK的技術演進歷程,面臨及需要解決的問題,以及如何從系統(tǒng)的角度看待DPDK的技術,最后結合幾個編程實例幫助讀者了解DPDK基本的編程模式。第2章則系統(tǒng)地介紹內(nèi)存和cache的相關基本知識,分析了各種IA平臺上的cache技術的特點和優(yōu)勢,并介紹了一個DPDK的重要技術“大頁”第3章和第4章則圍繞多核的使用,著重介紹如何使用多線程,最大限度地進行指令和數(shù)據(jù)的并行執(zhí)行。為了解決多線程訪問競爭的問題,還引入了幾種常見的DPDK鎖機制。第5章詳細講述了DPDK的數(shù)據(jù)報文轉(zhuǎn)發(fā)模型,幫助讀者了解DPDK從第6章開始,本書內(nèi)容逐步從CPU轉(zhuǎn)移到網(wǎng)卡I/O。其中,第6章將會從CPU與PCIe總線架構的角度,帶領讀者領略CPU與網(wǎng)卡DMA協(xié)同工個交互過程。第7章則專注于網(wǎng)卡的性能優(yōu)化,詳細介紹了DPDK如何在軟件設計、硬件平臺選擇和配置上實現(xiàn)高效的網(wǎng)絡報文處理。第8章介紹了目前高速網(wǎng)卡中一個非常通用的技術“多隊列與流分類”,解釋了DPDK如果利用這個技術實現(xiàn)更高效的IO處理。第9章介紹了目前以網(wǎng)卡為主的硬件卸載與智能化發(fā)展趨勢,幫助讀者了解如何將DPDK與網(wǎng)卡的硬件卸載技術結合,減少CPU的開銷,實現(xiàn)高軟硬件設計。 認識DPDKDPDK最初的動機很簡單,就是證明IA多核處理器能夠支撐高性能數(shù)據(jù)包處理。隨著早期目標的達成和更多通用處理器體系的加入,DPDK逐漸成為通用多核處理器高性能數(shù)據(jù)1.1主流包處理硬件平臺DPDK用軟件的方式在通用多核處理器上演繹著數(shù)據(jù)包處理的新篇章,而對于數(shù)據(jù)包處理,多核處理器顯然不是唯一的平臺。支撐包處理的主流硬件平臺大致可分為三個方向。根據(jù)處理內(nèi)容、復雜度、成本、量產(chǎn)規(guī)模等因素的不同,這些平臺在各自特定的領域都4第一部分DPDK基礎篇近年來性能的不斷提升,其為軟件定義的包處理提供了快速迭代的平臺。參見[Ref1-2]。隨著現(xiàn)代處理器的創(chuàng)新與發(fā)展(如異構化),開始集成新的加速處理與高速IO單元,它們互相之間不斷地融合。在一些多核處理器中,已能看到硬件加速單元的身影。從軟件包處理的角度,可以卸載部分功能到那些硬件加速單元進一步提升性能瓶頸;從硬件包處理的流水線來看,多核上運行的軟件完成了難以固化的上層多變邏輯的任務;二者相得益彰。1.1.1硬件加速器GAASIC(Application-Speci?cIntegratedCircuit)是一種應特定用戶要求和特定電子系統(tǒng)的需要而設計、制造的集成電路。ASIC的優(yōu)點是面向特定用戶的需求,在批量生產(chǎn)時與通用集成電路相比體積更小、功耗更低、可靠性提高、性能提高、保密性增強、成本降低等。但ASIC的缺點也很明顯,它的靈活性和擴展性不夠、開發(fā)費用高、開發(fā)周期長。的特點,融合成片上系統(tǒng)(SoC)提供異構處理能力,使得ASIC帶上了智能(Smart)的標簽。FPGA(Field-ProgrammableGateArray)即現(xiàn)場可編程門陣列。它作為ASIC領域中的一種半定制電路而出現(xiàn),與ASIC的區(qū)別是用戶不需要介入芯片的布局布線和工藝問題,而且機的開發(fā)有很大不同,以硬件描述語言(Verilog或VHDL)來實現(xiàn)。相比于PC或單片機(無論是馮·諾依曼結構還是哈佛結構)的順序操作有很大區(qū)別。全可編程FPGA概念的提出,使FPGA朝著進一步軟化的方向持續(xù)發(fā)展,其并行化整數(shù)運算的能力將進一步在通用計算定制化領域得到挖掘,近年來在數(shù)據(jù)中心中取得了很大進展,比如應用于機器學習場合。我們預計FPGA在包處理的應用場景將會從通信領域(CT)越來越多地走向數(shù)據(jù)中心和云計算領域。網(wǎng)絡處理器(NetworkProcesserUnit,NPU)是專門為處理數(shù)據(jù)包而設計的可編程通用處理器,采用多內(nèi)核并行處理結構,其常被應用于通信領域的各種任務,比如包處理、協(xié)議分的軟件決定,用戶使用專用指令集即微碼(microcode)進行開發(fā)。其硬件體系結構大多采用高速的接口技術和總線規(guī)范,具有較高的I/O能力,使得包處理能力得到很大提升。除了這些特點外,NPU一般還包含多種不同性能的存儲結構,對數(shù)據(jù)進行分類存儲以適應不同的應可編程部分,根據(jù)需要通過編寫微碼快速實現(xiàn)業(yè)務相關的包處理邏輯。NPU擁有高性能和高可編程性等諸多優(yōu)點,但其成本和特定領域的特性限制了它的市場規(guī)模(一般應用于專用通SerDesMACs第1章認識DPDK5SerDesMACs信設備)。而不同廠商不同架構的NPU遵循的微碼規(guī)范不盡相同,開發(fā)人員的成長以及生態(tài)系統(tǒng)的構建都比較困難。雖然一些NPU的微碼也開始支持由高級語言(例如C)編譯生成,但由于結構化語言本身原語并未面向包處理,使得轉(zhuǎn)換后的效率并不理想。NP-540GbETOP100GbEPacketProcessorsIntertakenficationueuingnalTCAMSDRAMDDR3ControIIers4x16biternalMemoryrchEngines隨著SDN對于可編程網(wǎng)絡,特別是可編程數(shù)據(jù)面的要求,網(wǎng)絡處理器也可能會迎來新的發(fā)展機遇,但依然需要解決好不同架構的底層抽象以及上層業(yè)務的語義抽象。1.1.3多核處理器現(xiàn)代CPU性能的擴展主要通過多核的方式進行演進。這樣利用通用處理器同樣可以在一定程度上并行地處理網(wǎng)絡負載。由于多核處理器在邏輯負載復雜的協(xié)議及應用層面上的處理優(yōu)勢,以及越來越強勁的數(shù)據(jù)面的支持能力,它在多種業(yè)務領域得到廣泛的采用。再加上多年來圍繞CPU已經(jīng)建立起的大量成熟軟件生態(tài),多核處理器發(fā)展的活力和熱度也是其他形態(tài)很難比擬的。圖1-2是Intel雙路服務器平臺框圖,描述了一個典型的雙路服務器平臺的多個模塊,CPU、芯片組C612、內(nèi)存和以太網(wǎng)控制器XL710構成了主要的數(shù)據(jù)處理通道?;赑CIe總線的I/O接口提供了大量的系統(tǒng)接口,為服務器平臺引入了差異化的設計。當前的多核處理器也正在走向SoC化,針對網(wǎng)絡的SoC往往集成內(nèi)存控制器、網(wǎng)絡控制器,甚至是一些硬件加速處理引擎。這里列出了一些主流廠商的多核處理器的SoC平臺。essomputhentikcketmorycketNEURONAManagerILK/LAGI/O&Co-ProcGNetworksxessomputhentikcketmorycketNEURONAManagerILK/LAGI/O&Co-ProcGNetworksx6第一部分DPDK基礎篇44MemOryChanneISDDR4/UptO2133MHzeachE600v3DMI2.00SATAGen3POrtS(6Gb/S)4MemOryChanneISDDR4/UptO2133MHzeachXL710FamiIyIntel?Xeon*ocessorE600v3oductFamily(Upto12cores)oductFamily(Upto12cores)Intel?Xeon*ocessorIntel?inks圖1-2Intel雙路服務器平臺框圖的CaviumOCTEON處理器框圖以CaviumOCTEON多核處理器為例,它集成多個erMinnagementmoryUpto48MIPSrMIPSMIPSrMIPSrcheacheLowLatencyCrossbarat Corefrequency SATA6GketMiscI/O*Coherent SATA6GketMiscI/O*CoherentHyperAccessCache InterconnetMemController圖1-3CaviumOCTEON處理器框圖第1章認識DPDK7CPU核以及眾多加速單元和網(wǎng)絡接口,組成了一個片上系統(tǒng)(SoC)。在這些SoC上,對于可固化的處理(例如,流分類,QoS)交由加速單元完成,而對于靈活的業(yè)務邏輯則由眾多的通用處理器完成,這種方式有效地融合了軟硬件各自的優(yōu)勢。隨著軟件(例如,DPDK)在I/O性能提升上的不斷創(chuàng)新,將多核處理器的競爭力提升到一個前所未有的高度,網(wǎng)絡負載與虛擬化的融合又催生了NFV的潮流。更多內(nèi)容請參考相關Cavium和Ezchip的信息([Ref1-3]和[Ref1-4])。本書介紹DPDK,主要以IA(IntelArchitecture)多核處理器為目標平臺。在IA上,網(wǎng)絡數(shù)據(jù)包處理遠早于DPDK而存在。從商業(yè)版的Windows到開源的Linux操作系統(tǒng),所有跨主機通信幾乎都會涉及網(wǎng)絡協(xié)議棧以及底層網(wǎng)卡驅(qū)動對于數(shù)據(jù)包的處理。然而,低速網(wǎng)絡與高速網(wǎng)絡處理對系統(tǒng)的要求完全不一樣。IA據(jù)包處理嗎Linux絡設備驅(qū)動包處理的動作可以概括如下:隨著網(wǎng)絡接口帶寬從千兆向萬兆邁進,原先每個報文就會觸發(fā)一個中斷,中斷帶來的開銷變得突出,大量數(shù)據(jù)到來會觸發(fā)頻繁的中斷開銷,導致系統(tǒng)無法承受,因此有人在Linux內(nèi)核中引入了NAPI機制,其策略是系統(tǒng)被中斷喚醒后,盡量使用輪詢的方式一次處理多個數(shù)據(jù)包,直到網(wǎng)絡再次空閑重新轉(zhuǎn)入中斷等待。NAPI策略用于高吞吐的場景,效率提升一個二層以太網(wǎng)包經(jīng)過網(wǎng)絡設備驅(qū)動的處理后,最終大多要交給用戶態(tài)的應用,圖1-4的典型網(wǎng)絡協(xié)議層次OSI與TCP/IP模型,是一個基礎的網(wǎng)絡模型與層次,左側(cè)是OSI定義的7層模型,右側(cè)是TCP/IP的具體實現(xiàn)。網(wǎng)絡包進入計算機大多需要經(jīng)過協(xié)議處理,在Linux系統(tǒng)中TCP/IP由Linux內(nèi)核處理。即使在不需要協(xié)議處理的場景下,大多數(shù)場景下也需要把包從內(nèi)核的緩沖區(qū)復制到用戶緩沖區(qū),系統(tǒng)調(diào)用以及數(shù)據(jù)包復制的開銷,會直接影響用戶態(tài)應用從設備直接獲得包的能力。而對于多樣的網(wǎng)絡功能節(jié)點來說,TCP/IP協(xié)議棧并不發(fā)節(jié)點所必需的。層表示層會話層層plicationayPDCPGTP-UCUDPIPCay P層表示層會話層層plicationayPDCPGTP-UCUDPIPCay P UDPIPUDPIPUDPIPCC8第一部分DPDK基礎篇層傳輸層(UDP/TCP/…)鏈路層層/網(wǎng)絡接口層(以太網(wǎng))PIP1-4典型網(wǎng)絡協(xié)議層次OSI與TCP/IP模型以無線網(wǎng)為例,圖1-5的無線4G/LTE數(shù)據(jù)面網(wǎng)絡協(xié)議展示了從基站、基站控制器到無線核心網(wǎng)關的協(xié)議層次,可以看到大量處理是在網(wǎng)絡二、三、四層進行的。如何讓Linux這樣的面向控制面原生設計的操作系統(tǒng)在包處理上減少不必要的開銷一直是一大熱點。有個著名的高性能網(wǎng)絡I/O框架Netmap,它就是采用共享數(shù)據(jù)包池的方式,減少內(nèi)核到用戶空間的EBgGWaPDNGWGLTE網(wǎng)絡協(xié)議NAPI與Netmap兩方面的努力其實已經(jīng)明顯改善了傳統(tǒng)Linux系統(tǒng)上的包處理能力,那是否還有空間去做得更好呢?作為分時操作系統(tǒng),Linux要將CPU的執(zhí)行時間合理地調(diào)度給需要運行的任務。相對于公平分時,不可避免的就是適時調(diào)度。早些年CPU核數(shù)比較少,為了每個任務都得到響應處理,進行充分分時,用效率換響應,是一個理想的策略。現(xiàn)今第1章認識DPDK9CPU核數(shù)越來越多,性能越來越強,為了追求極端的高性能高效率,分時就不一定總是上佳的策略。以Netmap為例,即便其減少了內(nèi)核到用戶空間的內(nèi)存復制,但內(nèi)核驅(qū)動的收發(fā)包處理和用戶態(tài)線程依舊由操作系統(tǒng)調(diào)度執(zhí)行,除去任務切換本身的開銷,由切換導致的后續(xù)cache替換(不同任務內(nèi)存熱點不同),對性能也會產(chǎn)生負面的影響。如果再往實時性方面考慮,傳統(tǒng)上,事件從中斷發(fā)生到應用感知,也是要經(jīng)過長長的軟件處理路徑。所以,在2010年前采用IA處理器的用戶會得出這樣一個結論,那就是IA不真的是這樣么?在IA硬件基礎上,包處理能力到底能做到多好,有沒有更好的方法評估和優(yōu)化包處理性能,怎樣的軟件設計方法能最充分地釋放多核IA的包處理能力,這些問題都是在DPDK出現(xiàn)之前,實實在在地擺在Intel工程師面前的原始挑戰(zhàn)。1.2.2DPDK最佳實踐如今,DPDK應該已經(jīng)很好地回答了IA多核處理器是否可以應對高性能數(shù)據(jù)包處理這個問題。而解決好這樣一個問題,也不是用了什么憑空產(chǎn)生的特殊技術,更多的是從工程優(yōu)化角度的迭代和最佳實踐的融合。如果要簡單地盤點一下這些技術,大致可以歸納如下。輪詢,這一點很直接,可避免中斷上下文切換的開銷。之前提到Linux也采用該方法改進對大吞吐數(shù)據(jù)的處理,效果很好。在第7章,我們會詳細討論輪詢與中斷的權衡。用戶態(tài)驅(qū)動,在這種工作方式下,既規(guī)避了不必要的內(nèi)存拷貝又避免了系統(tǒng)調(diào)用。一個間接的影響在于,用戶態(tài)驅(qū)動不受限于內(nèi)核現(xiàn)有的數(shù)據(jù)格式和行為定義。對mbuf頭格式的重定義、對網(wǎng)卡DMA操作的重新優(yōu)化可以獲得更好的性能。而用戶態(tài)驅(qū)動也便于快速地迭代優(yōu)化,甚至對不同場景進行不同的優(yōu)化組合。在第6章中,我們將探討用戶態(tài)網(wǎng)卡收發(fā)包親和性與獨占,DPDK工作在用戶態(tài),線程的調(diào)度仍然依賴內(nèi)核。利用線程的CPU親和綁定的方式,特定任務可以被指定只在某個核上工作。好處是可避免線程在不同核間頻繁切換,核間線程切換容易導致因cachemiss和cachewriteback造成的大量性能損失。如果更進一步地限定某些核不參與Linux系統(tǒng)調(diào)度,就可能使線程獨占該核,保證更多cachehit的同時,也避免了同一個核內(nèi)的多任務切換開銷。在第3章,我們會再展開討論。降低訪存開銷,網(wǎng)絡數(shù)據(jù)包處理是一種典型的I/O密集型(I/Obound)工作負載。無論是CPU指令還是DMA,對于內(nèi)存子系統(tǒng)(Cache+DRAM)都會訪問頻繁。利用一些已知的高效方法來減少訪存的開銷能夠有效地提升性能。比如利用內(nèi)存大頁能有效降低TLBmiss,比如利用內(nèi)存多通道的交錯訪問能有效提高內(nèi)存訪問的有效帶寬,再比如利用對于內(nèi)存非對稱性的感知可以避免額外的訪存延遲。而cache更是幾乎所有優(yōu)化的核心地帶,這些有意思而且對性能有直接影響的部分,將在第2章進行更細致的介紹。軟件調(diào)優(yōu),調(diào)優(yōu)本身并不能說是最佳實踐。這里其實指代的是一系列調(diào)優(yōu)實踐,比如結構的cacheline對齊,比如數(shù)據(jù)在多核間訪問避免跨cacheline共享,比如適時地預取數(shù)據(jù),10第一部分DPDK基礎篇再如多元數(shù)據(jù)批量操作。這些具體的優(yōu)化策略散布在DPDK各個角落。在第2章、第6章、利用IA新硬件技術,IA的最新指令集以及其他新功能一直是DPDK致力挖掘數(shù)據(jù)包處理性能的源泉。拿Intel?DDIO技術來講,這個cache子系統(tǒng)對DMA訪存的硬件創(chuàng)新直接助推了性能跨越式的增長。有效利用SIMD(SingleInstructionMultipleData)并結合超標量技術(Superscalar)對數(shù)據(jù)層面或者對指令層面進行深度并行化,在性能的進一步提升上也行之有效。另外一些指令(比如cmpxchg),本身就是lockless數(shù)據(jù)結構的基石,而crc32指令對與4ByteKey的哈希計算也是改善明顯。這些內(nèi)容,在第2章、第4章、第5章、第6章都外設到系統(tǒng)內(nèi)存之間的帶寬利用效率、數(shù)據(jù)傳送方式(coalesce操作)等都是直接影響I/O性能的因素。在現(xiàn)代網(wǎng)卡中,往往還支持一些分流(如RSS,F(xiàn)DIR等)和卸載(如Chksum,TSO等)功能。DPDK充分利用這些硬件加速特性,幫助應用更好地獲得直接的性能提升。這些內(nèi)容將從第6章~第9章一一展開。除了這些基礎的最佳實踐,本書還會用比較多的篇幅帶領大家進入DPDKI/O虛擬化的世界。在那里,我們依然從I/O的視角,介紹業(yè)界廣泛使用的兩種主流方式,SR-IOV和Virtio,幫助大家理解I/O硬件虛擬化的支撐技術以及I/O軟件半虛擬化的技術演進和革新。從第10章到第14章,我們會圍繞著這一主題逐步展開。隨著DPDK不斷豐滿成熟,也將自身逐步拓展到更多的平臺和場景。從Linux到FreeBSD機到虛擬機,從加速網(wǎng)絡I/O到加速存儲I/O,DPDK在不同緯度發(fā)芽生長。在NFV大潮下,無論是NFVI(例如,virtualswitch)還是VNF,DPDK都用堅實有力的性能來提供基礎設施保障。這些內(nèi)容將在第10章~第15章一一介紹。當然,在開始后續(xù)所有章節(jié)之前,讓我們概覽一下DPDK的軟件整體框架。1.2.3DPDK框架簡介DPDK為IA上的高速包處理而設計。圖1-6所示的DPDK主要模塊分解展示了以基礎軟件庫的形式,為上層應用的開發(fā)提供一個高性能的基礎I/O開發(fā)包。它大量利用了有助于DDIOCoreLibs提供系統(tǒng)抽象、大頁內(nèi)存、緩存池、定時器及無鎖環(huán)等基礎組件。PMD庫,提供全用戶態(tài)的驅(qū)動,以便通過輪詢和線程綁定得到極高的網(wǎng)絡吞吐,支持的網(wǎng)卡。Classify庫,支持精確匹配(ExactMatch)、最長匹配(LPM)和通配符匹配(ACL),提理的查表操作。QoS庫,提供網(wǎng)絡服務質(zhì)量相關組件,如限速(Meter)和調(diào)度(Sched)。PDKSampleplicationsPDKSampleplicationsoSystemplicationsLOCUFMEMPOOLNGERsMTCLifyketTRIBnsOWERMEMnsETER第1章認識DPDK11merplicationsDEVEE0EeMXNETFM0KXENVIRTCPllanoxoadcomVirtualUserSpaceUIOUIOIOIOnuxKernel1-6DPDK主要模塊分解除了這些組件,DPDK還提供了幾個平臺特性,比如節(jié)能考慮的運行時頻率調(diào)整 (POWER),與Linuxkernelstack建立快速通道的KNI(KernelNetworkInterface)。而Packet Framework和DISTRIB為搭建更復雜的多核流水線處理模型提供了基礎的組件。1.2.4尋找性能優(yōu)化的天花板性能優(yōu)化不是無止境的,所謂天花板可以認為是理論極限,性能優(yōu)化能做到的就是無限接近這個理論極限。而理論極限也不是單緯度的,當某個緯度接近極限時,可能在另一個緯我們討論數(shù)據(jù)包處理,那首先就看看數(shù)據(jù)包轉(zhuǎn)發(fā)速率是否有天花板。其實包轉(zhuǎn)發(fā)的天花由于天花板是理論上的,因此對于前面介紹的一些可量化的天花板,總是能夠指導并反映性能優(yōu)化的優(yōu)劣。而有些天花板可能很難量化,比如在某個特定頻率的CPU下每個包所消耗的周期最小能做到多少。對于這樣的天花板,可能只能用不斷嘗試實踐的方式,當然不同的方法可能帶來不同程度的突破,總的增益越來越少時,就可能是接近天花板的時候。那DPDK在IA上提供網(wǎng)絡處理能力有多優(yōu)秀呢?它是否已經(jīng)能觸及一些系統(tǒng)的天花板?在這些天花板中,最難觸碰的是哪一個呢?要真正理解這一點,首先要明白在IA上包導導符型12第一部分DPDK基礎篇處理終極挑戰(zhàn)的問題是什么,在這之前我們需要先來回顧一下衡量包處理能力的一些常見能1.3解讀數(shù)據(jù)包處理能力不管什么樣的硬件平臺,對于包處理都有最基本的性能訴求。一般常被提到的有吞吐、延遲、丟包率、抖動等。對于轉(zhuǎn)發(fā),常會以包轉(zhuǎn)發(fā)率(pps,每秒包轉(zhuǎn)發(fā)率)而不是比特率 (bit/s,每秒比特轉(zhuǎn)發(fā)率)來衡量轉(zhuǎn)發(fā)能力,這跟包在網(wǎng)絡中傳輸?shù)姆绞接嘘P。不同大小的包對存儲轉(zhuǎn)發(fā)的能力要求不盡相同。讓我們先來溫習一下有效帶寬和包轉(zhuǎn)發(fā)率概念。線速(WireSpeed)是線纜中流過的幀理論上支持的最大幀數(shù)。ts100Gbit/s,代表以太接口線路上所能承載的最高傳輸比特率,其單位是bit/s(bitpersecond,位/秒)。實際上,不可能每個比特都傳輸有效數(shù)據(jù)。以太網(wǎng)每個幀之間會有幀間距(Inter-PacketGap,IPG),默認幀間距大小為12字節(jié)。每個幀還有7個字節(jié)的前導(Preamble),和1個字節(jié)的幀首定界符(StartFrameDelimiter,SFD)。具體幀格式如圖1-7所示,有效內(nèi)容主要是以太網(wǎng)的目的地址、源地址、以太網(wǎng)類型、負載。報文尾部是校驗碼。碼以太幀格式所以,通常意義上的滿速帶寬能跑有效數(shù)據(jù)的吞吐可以由如下公式得到理論幀轉(zhuǎn)發(fā)率:而這個最大理論幀轉(zhuǎn)發(fā)率的倒數(shù)表示了線速情況下先后兩個包到達的時間間隔。按照這個公式,將不同包長按照特定的速率計算可得到一個以太幀轉(zhuǎn)發(fā)率,如表1-1所示。如果仔細觀察,可以發(fā)現(xiàn)在相同帶寬速率下,包長越小的包,轉(zhuǎn)發(fā)率越高,幀間延遲也率ts25Gbit/s40Gbit/sarrival(ns)arrival(ns)arrival(ns)7.207.2026.889.5221.1147.363.7829.60564.53220.80325.202.35425.607405.202.99334.084.79208.80Packetspersecond8Packetspersecond8PacketSize64bytesGPackets/secondillioneachwayPacketarrivalrate2GHzClockcycleses第1章認識DPDK13滿足什么條件才能達到無阻塞轉(zhuǎn)發(fā)的理論上限呢?如果我們把處理一個數(shù)據(jù)包的整個生命周期看做是工廠的生產(chǎn)流水線,那么就要保證在這個流水線上,不能有任何一級流水處理的延遲超過此時間間隔。理解了這一點,對照表1-1,就很容易發(fā)現(xiàn),對任何一個數(shù)據(jù)包處理流水線來說,越小的數(shù)據(jù)包,挑戰(zhàn)總是越大。這樣的紅線對任何一個硬件平臺,對任何一個在硬件平臺上設計整體流水線的設計師來說都是無法逃避并需要積極面對的。在通用處理器上處理包的最大挑戰(zhàn)是什么?為什么以往通用處理器很少在數(shù)據(jù)面中扮演重要的角色?如果我們帶著這些問題來看數(shù)據(jù)面上的負載,就會有一個比較直觀的理解。這里拿40Gbit/s的速率作為考察包轉(zhuǎn)發(fā)能力的樣本。如圖1-8所示,曲線為不同大小的包的最理器角度:.L3cache命中,大約40指令周期.L3cache沒命中,一個內(nèi)存讀需要140個指令周期,大概70ns(主頻2GHz)很難達到100Gbit/s速率300000000000000PacketSize(B)0000000000000000000Gbits線速PacketSize1024bytesGPackets/secondMillioneachwayPacketarrivalrate088ns2GHzClockcyclescycles網(wǎng)絡設備報文大小通用服務器報文大小圖1-8線速情況下的報文的指令成本BB說明不同報文大小給系統(tǒng)帶來的巨大差異。就如我們在包轉(zhuǎn)發(fā)率那一節(jié)中理解的,對于越小nsvsns設CPU的主頻率是2GHz,要達到理論最大的轉(zhuǎn)發(fā)能力,對于64B和1024B軟件分別允許消耗33和417個時鐘周期。在存儲轉(zhuǎn)發(fā)(store-forward)模型下,報文收發(fā)以及查表都需要訪存。那就對比一下訪存的時鐘周期,一次LLC命中需要大約40個時鐘周期,如果LLC未命中,一次內(nèi)存的讀就需要70ns。換句話說,對于64B大小的包,即使每次都能命中LLC,40個時鐘周期依然離33有距離。顯然,小包處理時延對于通用CPU系統(tǒng)架構的挑戰(zhàn)是巨大的。那是否說明IA就完全不適合高性能的網(wǎng)絡負載呢?答案是否定的。證明這樣的結論我14第一部分DPDK基礎篇們從兩個方面入手,一個是IA平臺實際能提供的最大能力,另一個是這個能力是否足以應一定領域的高性能網(wǎng)絡負載。DPDK的出現(xiàn)充分釋放了IA平臺對包處理的吞吐能力。我們知道,隨著吞吐率的上升,雖然這個能力不足以覆蓋網(wǎng)絡中所有端到端的設備場景,但無論在核心網(wǎng)接入側(cè),還是在數(shù)據(jù)中心網(wǎng)絡中,都已經(jīng)可以覆蓋相當多的場景。隨著數(shù)據(jù)面可軟化的發(fā)生,數(shù)據(jù)面的設計、開發(fā)、驗證乃至部署會發(fā)生一系列的變化。首先,可以采用通用服務器平臺,降低專門硬件設計成本;其次,基于C語言的開發(fā),就程序員數(shù)量以及整個生態(tài)都要比專門硬件開發(fā)更豐富;另外,靈活可編程的數(shù)據(jù)面部署也給網(wǎng)絡功能虛擬化(NFV)帶來了可能,更會進一步推進軟件定義網(wǎng)絡(SDN)的全面展開。DPDK很好地將IA上包處理的性能提升到一個高度,這個高度已經(jīng)達到很多網(wǎng)絡應用場景的最低要求,使得滿足要求的場景下對于網(wǎng)絡業(yè)務軟化產(chǎn)生積極的作用。1.5.1DPDK加速網(wǎng)絡節(jié)點在理解了IA上包處理面臨的根本性挑戰(zhàn)后,我們會對DPDK所取得的性能提升感到異常興奮。更令人興奮的是,按照DPDK所倡導的方法,隨著處理器的每一代更新,在IA上的性能提升以很高的斜率不斷發(fā)酵。當千兆、萬兆接口全速轉(zhuǎn)發(fā)已不再是問題時,DPDK已向百萬兆的接口。DPDK軟件包內(nèi)有一個最基本的三層轉(zhuǎn)發(fā)實例(l3fwd),可用于測試雙路服務器整系統(tǒng)的吞吐能力,實驗表明可以達到220Gbit/s的數(shù)據(jù)報文吞吐能力。值得注意的是,除了通過硬件或者軟件提升性能之外,如今DPDK整系統(tǒng)報文吞吐能力上限已經(jīng)不再受限于CPU的核數(shù),當前瓶頸在于PCIe(IO總線)的LANE數(shù)。換句話說,系統(tǒng)性能的整體I/O天花板不再是CPU,而是系統(tǒng)所提供的所有PCIeLANE的帶寬,能插入多少個高速以太網(wǎng)接口卡。在這樣的性能基礎上,網(wǎng)絡節(jié)點的軟化就成為可能。對于網(wǎng)絡節(jié)點上運轉(zhuǎn)的不同形態(tài)的網(wǎng)絡功能,一旦軟化并適配到一個通用的硬件平臺,隨之一個自然的訴求可能就是軟硬件解耦。解耦正是網(wǎng)絡功能虛擬化(NFV)的一個核心思想,而硬件解耦的多個網(wǎng)絡功能在單一通用節(jié)點上的隔離共生問題,是另一個核心思想虛擬化詮釋的。當然這個虛擬化是廣義的,在不同層面可以有不同的支撐技術。第1章認識DPDK15NFV有很多訴求,業(yè)務面高性能,控制面高可用、高可靠、易運維、易管理等。但沒有業(yè)務面的高性能,后續(xù)的便無從談起。DPDK始終為高性能業(yè)務面提供堅實的支撐,除此以外,DPDK立足IA的CPU虛擬化技術和IO的虛擬化技術,對各種通道做持續(xù)優(yōu)化改進的同時,也對虛擬交換(vswitch)的轉(zhuǎn)發(fā)面進化做出積極貢獻。應對絕對高吞吐能力的要求,DPDK支持各種I/O的SR-IOV接口;應對高性能虛擬主機網(wǎng)絡的要求,DPDK支持標準virtio接口;對虛擬化平臺的支撐,DPDK從KVM、VMWARE、XEN的hypervisor到容,可謂全平臺覆蓋??梢哉f,在如火如荼的網(wǎng)絡變革的大背景下,DPDK以強勁的驅(qū)動力加速各種虛擬化的。1.5.2DPDK加速計算節(jié)點DPDK之于網(wǎng)絡節(jié)點,主要集中在數(shù)據(jù)面轉(zhuǎn)發(fā)方面,這個很容易理解;對于計算節(jié)點,DPDK也擁有很多潛在的機會。C10K是IT界的一個著名命題,甚至后續(xù)衍生出了關于C1M和C10M的討論。其闡述的一個核心問題就是,隨著互聯(lián)網(wǎng)發(fā)展,隨著數(shù)據(jù)中心接口帶寬不斷提升,計算節(jié)點上各種互聯(lián)網(wǎng)服務對于高并發(fā)下的高吞吐有著越來越高的要求。詳見[Ref1-5]。系統(tǒng)方法(異步非阻塞,線程等),但網(wǎng)絡服務受限于內(nèi)核協(xié)議棧多核水平擴展上的不足以及建當然,內(nèi)核協(xié)議棧也在不斷改進,而以應用為中心的趨勢也會不斷推動用戶態(tài)協(xié)議棧的涌現(xiàn)。有基于BSD協(xié)議棧移植的,有基于多核模型重寫的原型設計,也有將整個Linux內(nèi)核包裝成庫的。它們大多支持以DPDK作為I/O引擎,有些也將DPDK的一些優(yōu)化想法加入到協(xié)議棧的優(yōu)化中,取得了比較好的效果??梢哉f,由DPDK加速的用戶態(tài)協(xié)議棧將會越來越多地支撐起計算節(jié)點上的網(wǎng)絡服務。1.5.3DPDK加速存儲節(jié)點除了在網(wǎng)絡、計算節(jié)點的應用機會之外,DPDK的足跡還滲透到存儲領域。Intel?最近開源了SPDK(StoragePerformanceDevelopmentKit),一款存儲加速開發(fā)套件,其主要的應用場景是iSCSI性能加速。目前iSCSI系統(tǒng)包括前端和后端兩個部分,在前端,DPDK提供網(wǎng)絡I/O加速,加上一套用戶態(tài)TCP/IP協(xié)議棧(目前還不包含在開源包中),以流水線的工作方式支撐起基于iSCSI的應用;在后端,將DPDK用戶態(tài)輪詢驅(qū)動的方式實踐在NVMe上,PMD的NVMe驅(qū)動加速了后端存儲訪問。這樣一個端到端的整體方案,用數(shù)據(jù)證明了可以說,理解DPDK的核心方法,并加以恰當?shù)貙嵺`,可以將I/O在IA多核的性能提16第一部分DPDK基礎篇升有效地拓展到更多的應用領域,并產(chǎn)生積極的意義。1.5.4DPDK的方法論DPDK采用了很多具體優(yōu)化方法來達到性能的提升,有一些是利用IA軟件優(yōu)化的最佳實踐方法,還有一些是利用了IA的處理器特性。這里希望脫離這一個個技術細節(jié),嘗試著去還原一些核心的指導思想,試圖從方法論的角度去探尋DPDK成功背后的原因,但愿這樣的方法論總結,可以在開拓未知領域的過程中對大家有所助益。1.專用負載下的針對性軟件優(yōu)化專用處理器通過硬件架構專用優(yōu)化來達到高性能,DPDK則利用通用處理器,通過優(yōu)化的專用化底層軟件來達到期望的高性能。這要求DPDK盡可能利用一切平臺(CPU,芯片組,PCIe以及網(wǎng)卡)特性,并針對網(wǎng)絡負載的特點,做針對性的優(yōu)化,以發(fā)掘通用平臺在某大能力。2.追求可水平擴展的性能利用多核并行計算技術,提高性能和水平擴展能力。對于產(chǎn)生的并發(fā)干擾,遵循臨界區(qū)越薄越好、臨界區(qū)碰撞越少越好的指導原則。數(shù)據(jù)盡可能本地化和無鎖化,追求吞吐率隨核3.向Cache索求極致的實現(xiàn)優(yōu)化性能相比于系統(tǒng)優(yōu)化和算法優(yōu)化,實現(xiàn)優(yōu)化往往較少被提及。實現(xiàn)優(yōu)化對開發(fā)者的要求體現(xiàn)在需要對處理器體系結構有所了解。DPDK可謂集大量的實現(xiàn)優(yōu)化之大成,而這些方法多數(shù)4.理論分析結合實踐推導性能的天花板在哪,調(diào)優(yōu)是否還有空間,是否值得花更多的功夫繼續(xù)深入,這些問題有時很難直接找到答案。分析、推測、做原型、跑數(shù)據(jù)、再分析,通過這樣的螺旋式上升,慢慢逼近最優(yōu)解,往往是實踐道路上的導航明燈。條件允許下,有依據(jù)的理論量化計算,可以優(yōu)化目標。這是一個最好的時代,也是一個最壞的時代。不可否認的是,這就是一個融合的時代。隨著云計算的推進,ICT這個詞逐漸在各類技術研討會上被提及。云計算的定義雖然有各種版本,但大體都包含了對網(wǎng)絡基礎設施以及對大數(shù)據(jù)處理的基本要求,這也是IT與CT那這和DPDK有關系嗎?還真有!我們知道云計算的對象是數(shù)據(jù),數(shù)據(jù)在云上加工,可第1章認識DPDK17還是要通過各種載體落到地上。在各種載體中最廣泛使用的當屬IP,它是整個互聯(lián)網(wǎng)蓬勃發(fā)展的基石。高效的數(shù)據(jù)處理總是離不開高效的數(shù)據(jù)承載網(wǎng)絡。教科書說到網(wǎng)絡總會講到那經(jīng)典的7層模型,最低層是物理層,最高層是應用層。名副其實的是,縱觀各類能聯(lián)網(wǎng)的設備,從終端設備到網(wǎng)絡設備再到數(shù)據(jù)中心服務器,還真是越靠近物理層的處理以硬件為主,越靠近應用層的處理以軟件為主。這當然不是巧合,其中深諳了一個原則,越是能標準化的,越要追求極簡極速,所以硬件當仁不讓,一旦進入多樣性可變性強的領域,軟件往往能發(fā)揮作用。但沒有絕對和一成不變,因為很多中間地帶更多的DPDK是一個軟件優(yōu)化庫,目標是在通用處理器上發(fā)揮極致的包能力,以媲美硬件級的性能。當然軟件是跑在硬件上的,如果看整個包處理的硬件平臺,軟硬件融合的趨勢也相當明顯。各類硬件加速引擎逐漸融入CPU構成異構SoC(SystemOn-Chip),隨著Intel?對Altera?收購的完成,CPU+FPGA這一對組合也給足了我們想象的空間,可以說包處理正處時代。7實例在對DPDK的原理和代碼展開進一步解析之前,先看一些小而簡單的例子,建立一個形1)helloworld,啟動基礎運行環(huán)境,DPDK構建了一個基于操作系統(tǒng)的,但適合包處理的軟件運行環(huán)境,你可以認為這是個mini-OS。最早期DPDK,可以完全運行在沒有操作系統(tǒng)的物理核(bare-metal)上,這部分代碼現(xiàn)在不在主流的開源包中。2)skeleton,最精簡的單核報文收發(fā)骨架,也許這是當前世界上運行最快的報文進出測3)l3fwd,三層轉(zhuǎn)發(fā)是DPDK用于發(fā)布性能測試指標的主要應用。1.7.1HelloWorldDPDK里的HelloWorld是最基礎的入門程序,代碼簡短,功能也不復雜。它建立了一個多核(線程)運行的基礎環(huán)境,每個線程會打印“hellofromcore#”,core#是由操作系統(tǒng)管理的。如無特別說明,本文里的DPDK線程與硬件線程是一一對應的關系。從代碼角度,rte是指runtimeenvironment,eal是指environmentabstractionlayer。DPDK的主要對外函數(shù)接口都以rte_作為前綴,抽象化函數(shù)接口是典型軟件設計思路,可以幫助DPDK運行在多個操main(intargc,char**argv)18第一部分DPDK基礎篇{tretunsignedlcore_id;ret=rte_eal_init(argc,argv);if(ret<0)rte_panic(“CannotinitEAL\n”);/*calllcore_hello()oneveryslavelcore*/RTE_LCORE_FOREACH_SLAVE(lcore_id){rte_eal_remote_launch(lcore_hello,NULL,lcore_id);}/*callitonmasterlcoretoo*/lcore_hello(NULL);rte_eal_mp_wait_lcore();return0;}1.初始化基礎運行環(huán)境主線程運行入口是main函數(shù),調(diào)用了rte_eal_init入口函數(shù),啟動基礎運行環(huán)境。intrte_eal_init(intargc,char**argv);入口參數(shù)是啟動DPDK的命令行,可以是長長的一串很復雜的設置,需要深入了解的讀者可以查看DPDK相關的文檔與源代碼\lib\librte_eal\common\eal_common_options.c。對于HelloWorld這個實例,最需要的參數(shù)是“-c<coremask>”,線程掩碼(coremask)指定了需要參與運行的線程(核)集合。rte_eal_init本身所完成的工作很復雜,它讀取入口參數(shù),解析并保存作為DPDK運行的系統(tǒng)信息,依賴這些信息,構建一個針對包處理設計的運行環(huán)境。主要動作分解如下第1章認識DPDK19對于DPDK庫的使用者,這些操作已經(jīng)被EAL封裝起來,接口清晰。如果需要對DPDK進行深度定制,二次開發(fā),需要仔細研究內(nèi)部操作,這里不做詳解。2.多核運行初始化DPDK面向多核設計,程序會試圖獨占運行在邏輯核(lcore)上。main函數(shù)里重要的是啟動多核運行環(huán)境,RTE_LCORE_FOREACH_SLAVE(lcore_id)如名所示,遍歷所有EAL指定可以使用的lcore,然后通過rte_eal_remote_launch在每個lcore上,啟動被指定的intrte_eal_remote_launch(int(*f)(void*),void*arg,unsignedslave_id);個參數(shù)是從線程,是被征召的線程;給從線程的參數(shù);第三個參數(shù)是指定的邏輯核,從線程會執(zhí)行在這個core上。說,intrte_eal_remote_launch(lcore_hello,NULL,lcore_id);參數(shù)lcore_id指定了從線程ID,運行入口函數(shù)lcore_hello。運行函數(shù)lcore_hello,它讀取自己的邏輯核編號(lcore_id),打印出“hellofromcore#”staticintdvoidarg{unsignedlcore_id;lcore_id=rte_lcore_id();printf("hellofromcore%u\n",lcore_id);return0;}這是個簡單示例,從線程很快就完成了指定工作,在更真實的場景里,這個從線程會是的處理過程。1.7.2Skeleton主要處理函數(shù)main的處理邏輯如下(偽碼),調(diào)用rte_eal_init初始化運行環(huán)境,檢查網(wǎng)絡接口數(shù),據(jù)此分配內(nèi)存池rte_pktmbuf_pool_create,入口參數(shù)是指定rte_socket_id(),考慮了本地內(nèi)存使用的范例。調(diào)用port_init(portid,mbuf_pool)初始化網(wǎng)口的配置,最后調(diào)用lcore_main()進行主處理流程。20第一部分DPDK基礎篇intmain(intargc,char*argv[]){structrte_mempool*mbuf_pool;unsignednb_ports;uint8_tportid;/*InitializetheEnvironmentAbstractionLayer(EAL).*/intret=rte_eal_init(argc,argv);/*Checkthatthereisanevennumberofportstsend/receiveon.*/nb_ports=rte_eth_dev_count();if(nb_ports<2||(nb_ports&1))rte_exit(EXIT_FAILURE,"Error:numberofportsmustbeeven\n");/*Createsanewmempoolinmemorytoholdthembufs.*/mbuf_pool=rte_pktmbuf_pool_create("MBUF_POOL",NUM_MBUFS*nb_ports,MBUF_CACHE_SIZE,0,RTE_MBUF_DEFAULT_BUF_SIZE,rte_socket_id());/*Initializeallports.*/for(portid=0;portid<nb_ports;portid++)if(port_init(portid,mbuf_pool)!=0)rte_exit(EXIT_FAILURE,"Cannotinitport%"PRIu8"\n",portid);/*Calllcore_mainonthemastercoreonly.*/lcore_main();return0;}port_init(uint8_tport,structrte_mempool*mbuf_pool)首先對指定端口設置隊列數(shù),基于簡單原則,本例只指定單隊列。在收發(fā)兩個方向上,基于端口與隊列進行配置設置,緩沖區(qū)進行關聯(lián)設置。如不指定配置信息,則使用默認網(wǎng)口設置:對指定端口設置接收、發(fā)送方向的隊列數(shù)目,依據(jù)配置信息來指定端口功能intrte_eth_dev_configure(uint8_tport_id,uint16_tnb_rx_q,uint16_tnb_tx_q,conststructrte_eth_conf*dev_conf)隊列初始化:對指定端口的某個隊列,指定內(nèi)存、描述符數(shù)量、報文緩沖區(qū),并且對隊列進行配置intrte_eth_rx_queue_setup(uint8_tport_id,uint16_trx_queue_id,uint16_tnb_rx_desc,unsignedintsocket_id,conststructrte_eth_rxconf*rx_conf,structrte_mempool*mp)intrte_eth_tx_queue_setup(uint8_tport_id,uint16_ttx_queue_id,第1章認識DPDK21uint16_tnb_tx_desc,unsignedintsocket_id,conststructrte_eth_txconf*tx_conf)網(wǎng)口設置:初始化配置結束后,啟動端口intrte_eth_dev_start(uint8_tport_id);完成后,讀取MAC地址,打開網(wǎng)卡的混雜模式設置,允許所有報文進入。staticinlineintport_init(uint8_tport,structrte_mempool*mbuf_pool){structrte_eth_confport_conf=port_conf_default;constuint16_trx_rings=1,tx_rings=1;/*ConfiguretheEthernetdevice.*/retval=rte_eth_dev_configure(port,rx_rings,tx_rings,&port_conf);/*Allocateandsetup1RXqueueperEthernetport.*/for(q=0;q<rx_rings;q++){retval=rte_eth_rx_queue_setup(port,q,RX_RING_SIZE,rte_eth_dev_socket_id(port),NULL,mbuf_pool);}/*Allocateandsetup1TXqueueperEthernetport.*/for(q=0;q<tx_rings;q++){retval=rte_eth_tx_queue_setup(port,q,TX_RING_SIZE,rte_eth_dev_socket_id(port),NULL);}/*StarttheEthernetport.*/retval=rte_eth_dev_start(port);/*DisplaytheportMACaddress.*/structether_addraddr;rte_eth_macaddr_get(port,&addr);/*EnableRXinpromiscuousmodefortheEthernetdevice.*/rte_eth_promiscuous_enable(port);return0;}網(wǎng)口收發(fā)報文循環(huán)收發(fā)在lcore_main中有個簡單實現(xiàn),因為是示例,為保證性能,首先檢測CPU與網(wǎng)卡的Socket是否最優(yōu)適配,建議使用本地CPU就近操作網(wǎng)卡,后續(xù)章節(jié)有詳細說明。數(shù)據(jù)收發(fā)循環(huán)非常簡單,為高速報文進出定義了burst的收發(fā)函數(shù)如下,4個參數(shù)意義非常直觀:端口,隊列,報文緩沖區(qū)以及收發(fā)包數(shù)。:staticinlineuint16_trte_eth_rx_burst(uint8_tport_id,uint16_tqueue_id,structrte_mbuf**rx_pkts,constuint16_tnb_pkts)staticinlineuint16_trte_eth_tx_burst(uint8_tport_id,uint16_tqueue_id,structrte_mbuf**tx_pkts,uint16_tnb_pkts)22第一部分DPDK基礎篇這就構成了最基本的DPDK報文收發(fā)展示??梢钥吹剑颂幉簧婕叭魏尉唧w網(wǎng)卡形態(tài),依賴。tenoreturnvoidlcoremainvoid{constuint8_tnb_ports=rte_eth_dev_count();uint8_tport;for(port=0;port<nb_ports;port++)if(rte_eth_dev_socket_id(port)>0&&rte_eth_dev_socket_id(port)!=tesocketidprintf("WARNING,port%uisonremoteNUMAnodeto""pollingthread.\n\tPerformancewill""notbeoptimal.\n",port);/*Rununtiltheapplicationisquitorkilled.*/for(;;){*Receivepacketsonaportandforwardthemonthepaired*port.Themappingis0->1,1->0,2->3,3->2,etc.for(port=0;port<nb_ports;port++){/*GetburstofRXpackes,fromfirstportofpair.*/structrte_mbuf*bufs[BURST_SIZE];constuint16_tnb_rx=rte_eth_rx_burst(port,0,bufs,BURST_SIZE);if(unlikely(nb_rx==0))continue;/*SendburstofTXpackets,tosecondportofpair.*/constuint16_tnb_tx=rte_eth_tx_burst(port^1,0,bufs,nb_rx);/*Freeanyunsentpackets.*/if(unlikely(nb_tx<nb_rx)){uint16_tbuf;for(buf=nb_tx;buf<nb_rx;buf++)rte_pktmbuf_free(bufs[buf]);}}}}}1.7.3L3fwd這是DPDK中最流行的例子,也是發(fā)布DPDK性能測試的例子。如果將PCIE插槽上填滿高速網(wǎng)卡,將網(wǎng)口與大流量測試儀表連接,它能展示在雙路服務器平臺具備200Gbit/s的第1章認識DPDK23轉(zhuǎn)發(fā)能力。數(shù)據(jù)包被收入系統(tǒng)后,會查詢IP報文頭部,依據(jù)目標地址進行路由查找,發(fā)現(xiàn)目的端口,修改IP頭部后,將報文從目的端口送出。路由查找有兩種方式,一種方式是基于目標IP地址的完全匹配(exactmatch),另一種方式是基于路由表的最長掩碼匹配(LongestPre?xMatch,LPM)。三層轉(zhuǎn)發(fā)的實例代碼文件有2700多行(含空行與注釋行),整體邏輯其實很簡單,是前續(xù)HelloWorld與Skeleton的結合體。子,指定命令參數(shù)格式如下:./build/l3fwd[EALoptions]---pPORTMASK[-P]--config(port,queue,lcore)[,(port,queue,lcore)]命令參數(shù)分為兩個部分,以“--”為分界線,分界線右邊的參數(shù)是三層轉(zhuǎn)發(fā)的私有命令選項。左邊則是DPDK的EALOptions。it白名單原則來決定是否接管,早期版本可能會接管所有端口,斷開網(wǎng)絡連接。現(xiàn)在可以通過腳本綁定端口,具體可以參見/browse/dpdk/tree/tools/dpdk_nic_bind.py?con?g選項指定(port,queue,lcore),用指定線程處理對應的端口的隊列。要實現(xiàn)200Gbit/s的轉(zhuǎn)發(fā),需要大量線程(核)參與,并行轉(zhuǎn)發(fā)。0000處理端口0的隊列0012線程2處理端口0的隊列11011處理端口1的隊列0113線程

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論