開始學(xué)習(xí)DPDK,將學(xué)習(xí)中的心得和分析記錄下來,以免時間久了自己都忘記了,也便于和其他同道中人交流。

          說是學(xué)習(xí)心得和體會,但也借鑒了書籍和其他網(wǎng)友的分析總結(jié),在學(xué)習(xí)他人總結(jié)過程中發(fā)現(xiàn)介紹往往淺嘗輒止,知其然不知其所以然,因此本學(xué)習(xí)總結(jié)希望可以從一個初學(xué)者的角度來介紹,盡量做到知其然及知其所以然,可能大家會覺得別人一兩句話說完的事情這里用了一個章節(jié)來描述很啰嗦,但與其看10個千篇一律的短文,不如看一個略有啰嗦但全面的長文。個人能力有限,有些內(nèi)容直接取自書籍或者其他大牛的文章,如有介意請聯(lián)系我刪除相關(guān)章節(jié),我也會根據(jù)學(xué)習(xí)的逐步深入,反回來修改、完善某些內(nèi)容。

          1 什么是DPDK
          Intel? DPDK 全稱 __Intel Data Plane Development
          Kit__,最初是intel提供的數(shù)據(jù)平面開發(fā)工具集,為Intel
          architecture(IA)處理器架構(gòu)下用戶空間高效的數(shù)據(jù)包處理提供庫函數(shù)和驅(qū)動的支持,它不同于Linux系統(tǒng)以通用性設(shè)計為目的,而是專注于網(wǎng)絡(luò)應(yīng)用中數(shù)據(jù)包的高性能處理。其工作在用戶層,取代傳統(tǒng)Linux系統(tǒng)中的網(wǎng)絡(luò)數(shù)據(jù)報文處理。但需要注意的是,DPDK提供的是高性能處理報文的能力,而不是對報文的處理。這也提供了我們自定義用戶協(xié)議棧的能力。
          傳統(tǒng)上,網(wǎng)卡驅(qū)動程 序運行在Linux的內(nèi)核態(tài),以中斷方式來喚醒系統(tǒng)處理,這和歷史形成有關(guān)。早期CPU運行速度遠高于外設(shè)訪問,所以中斷處理方式十分有
          效,但隨著芯片技術(shù)與高速網(wǎng)絡(luò)接口技術(shù)的一日千里式發(fā)展,報文吞吐
          需要高達10Gbit/s的端口處理能力,市面上已經(jīng)出現(xiàn)大量的25Gbit/s、40Gbit/s甚至100Gbit/s高速端口,主流處理器的主頻仍停留在3GHz以下。I/O超越CPU的運行速率,是橫在行
          業(yè)面前的技術(shù)挑戰(zhàn)。用輪詢來處理高速端口開始成為必然,這構(gòu)成了 DPDK運行的基礎(chǔ)。
          在理論框架和核心技術(shù)取得一定突破后,Intel與6wind進行了合 作,交由在法國的軟件公司進行部分軟件開發(fā)和測試,6wind向Intel交
          付了早期的DPDK軟件開發(fā)包。2011年開始,6wind、Windriver、 Tieto、Radisys先后宣布了對Intel
          DPDK的商業(yè)服務(wù)支持。2013年4月,6wind聯(lián)合其他開發(fā)者成立www.dpdk.org的開源社區(qū),DPDK開始走上開源的大道。
          在多架構(gòu)支持方面,DPDK社區(qū)也取得了很大的進展,IBM中國研 究院的祝超博士啟動了將DPDK移植到Power體系架構(gòu)的工作,F(xiàn)reescale
          的中國開發(fā)者也參與修改,Tilera與Ezchip的工程師也花了不少精力將 DPDK運行在Tile架構(gòu)下。很快,DPDK從單一的基于Intel平臺的軟件,
          逐步演變成一個相對完整的生態(tài)系統(tǒng),覆蓋了多個處理器、以太網(wǎng)和硬 件加速技術(shù)。所以,不要再認(rèn)為DPDK只能在Intel
          architecture(IA)處理器架構(gòu)下跑了。

          2 DPDK的優(yōu)勢
          要想知道優(yōu)勢,就要先了解之前技術(shù)的劣勢,許多介紹DPDK的文章都會提到DPDK的優(yōu)勢,但許多都沒有介紹實現(xiàn)原理,這里參考已有信息,對原理也做了描述:
          以Linux為例,傳統(tǒng)網(wǎng)絡(luò)設(shè)備驅(qū)動包處理的動作可以概括如下:
          ?數(shù)據(jù)包到達網(wǎng)卡設(shè)備。
          ?網(wǎng)卡設(shè)備依據(jù)配置進行DMA操作。
          ?網(wǎng)卡發(fā)送中斷,喚醒處理器。
          ?驅(qū)動軟件填充讀寫緩沖區(qū)數(shù)據(jù)結(jié)構(gòu)。
          ?數(shù)據(jù)報文達到內(nèi)核協(xié)議棧,進行高層處理。
          ?如果最終應(yīng)用在用戶態(tài),數(shù)據(jù)從內(nèi)核搬移到用戶態(tài)。
          ?如果最終應(yīng)用在內(nèi)核態(tài),在內(nèi)核繼續(xù)進行。

          期間存在問題如下:
          ?
          中斷處理。當(dāng)網(wǎng)絡(luò)中大量數(shù)據(jù)包到來時,會產(chǎn)生頻繁的硬件中斷請求,這些硬件中斷可以打斷之前較低優(yōu)先級的軟中斷或者系統(tǒng)調(diào)用的執(zhí)行過程,如果這種打斷頻繁的話,將會產(chǎn)生較高的性能開銷。

          ? 內(nèi)存拷貝。正常情況下,一個網(wǎng)絡(luò)數(shù)據(jù)包從網(wǎng)卡到應(yīng)用程序需要經(jīng)過如下的過程:數(shù)據(jù)從網(wǎng)卡通過 DMA
          等方式傳到內(nèi)核開辟的緩沖區(qū),然后從內(nèi)核空間拷貝到用戶態(tài)空間,在 Linux 內(nèi)核協(xié)議棧中,這個耗時操作甚至占到了數(shù)據(jù)包整個處理流程的 57.1%。

          ?
          上下文切換。頻繁到達的硬件中斷和軟中斷都可能隨時搶占系統(tǒng)調(diào)用的運行,這會產(chǎn)生大量的上下文切換開銷。另外,在基于多線程的服務(wù)器設(shè)計框架中,線程間的調(diào)度也會產(chǎn)生頻繁的上下文切換開銷,同樣,鎖競爭的耗能也是一個非常嚴(yán)重的問題。

          ? 局部性失效。如今主流的處理器都是多個核心的,這意味著一個數(shù)據(jù)包的處理可能跨多個 CPU 核心,比如一個數(shù)據(jù)包可能中斷在 cpu0,內(nèi)核態(tài)處理在
          cpu1,用戶態(tài)處理在 cpu2,這樣跨多個核心,容易造成 CPU 緩存失效,造成局部性失效。如果是 NUMA 架構(gòu),更會造成跨 NUMA
          訪問內(nèi)存,性能受到很大影響。

          ? 內(nèi)存管理。傳統(tǒng)服務(wù)器內(nèi)存頁為 4K,為了提高內(nèi)存的訪問速度,避免 cache miss,可以增加 cache 中映射表的條目,但這又會影響 CPU
          的檢索效率。

          針對上述問題,DPDK的解決方式如下:

          * 輪詢與中斷:
          起初的純輪詢模式是指收發(fā)包完全不使用任何中斷,集中所有運算資源用于報文處理。DPDK純輪詢模式是指收發(fā)包完全不使用中斷處理的高吞吐率的方
          式。DPDK所有的收發(fā)包有關(guān)的中斷在物理端口初始化的時候都會關(guān) 閉,也就是說,CPU這邊在任何時候都不會收到收包或者發(fā)包成功的中
          斷信號,也不需要任何收發(fā)包有關(guān)的中斷處理。具體收發(fā)包流程參見之后的文章單獨說明。網(wǎng)絡(luò)應(yīng)用中可能存在的潮汐效應(yīng),在某些時間段網(wǎng)絡(luò)數(shù)據(jù)
          流量可能很低,甚至完全沒有需要處理的包,這樣就會出現(xiàn)在高速端口 下低負(fù)荷運行的場景,而完全輪詢的方式會讓處理器一直全速運行,明
          顯浪費處理能力和不節(jié)能。因此在DPDK R2.1和R2.2陸續(xù)添加了收包中 斷與輪詢的混合模式的支持,類似NAPI的思路,用戶可以根據(jù)實際應(yīng)
          用場景來選擇完全輪詢模式,或者混合中斷輪詢模式。而且,完全由用 戶來制定中斷和輪詢的切換策略,比如什么時候開始進入中斷休眠等待
          收包,中斷喚醒后輪詢多長時間,等等。
          * 多核多線程編程:

          多線程編程早已不是什么新鮮的事物了,多線程的初衷是提高整體應(yīng)用程序的性能,但是如果不加注意,就會將多線程的創(chuàng)建和銷毀開銷,鎖競爭,訪存沖突,cache失效,上下文切換等諸多消耗性能的因素引入進來。為了進一步提高性能,就必須仔細(xì)斟酌考慮線程在CPU不同核上的分布情況,這也就是常說的多核編程。多核編程和多線程有很大的不同:多線程是指每個CPU上可以運行多個線程,涉及到線程調(diào)度、鎖機制以及上下文的切換;而多核則是每個CPU核一個線程,核心之間訪問數(shù)據(jù)無需上鎖。為了最大限度減少線程調(diào)度的資源消耗,需要將Linux綁定在特定的核上,釋放其余核心來專供應(yīng)用程序使用。DPDK的線程基于pthread接口創(chuàng)建,屬于搶占式線程模型,受內(nèi)核
          調(diào)度支配。DPDK通過在多核設(shè)備上創(chuàng)建多個線程,每個線程綁定到單
          獨的核上,減少線程調(diào)度的開銷,以提高性能。DPDK的線程可以作為控制線程,也可以作為數(shù)據(jù)線程。在DPDK
          的一些示例中,控制線程一般綁定到MASTER核上,接受用戶配置,并
          傳遞配置參數(shù)給數(shù)據(jù)線程等;數(shù)據(jù)線程分布在不同核上處理數(shù)據(jù)包。同時還需要考慮CPU特性和系統(tǒng)是否支持NUMA架構(gòu),如果支持的話,不同插槽上CPU的進程要避免訪問遠端內(nèi)存,盡量訪問本端內(nèi)存。
          * CPU親和性:
          當(dāng)處理器進入多核架構(gòu)后,自然會面對一個問題,按照什么策略將 任務(wù)線程分配到各個處理器上執(zhí)行。眾所周知的是,這個分配工作一般
          由操作系統(tǒng)完成。負(fù)載均衡當(dāng)然是比較理想的策略,按需指定的方式也 是很自然的訴求,因為其具有確定性。簡單地說,CPU親和性(Core
          affinity)就是一個特定的任務(wù)要在某 個給定的CPU上盡量長時間地運行而不被遷移到其他處理器上的傾向
          性。這意味著線程可以不在處理器之間頻繁遷移。這種狀態(tài)正是我們所
          希望的,因為線程遷移的頻率小就意味著產(chǎn)生的負(fù)載小。將線程與CPU綁定,最直觀的好處就是提高了CPU Cache的命中
          率,從而減少內(nèi)存訪問損耗,提高程序的速度。在Linux內(nèi)核中,所有的線程都有一個相關(guān)的數(shù)據(jù)結(jié)構(gòu),稱為
          task_struct。這個結(jié)構(gòu)非常重要,原因有很多;其中與親和性相關(guān)度最 高的是cpus_allowed位掩碼。這個位掩碼由n位組成,與系統(tǒng)中的n個邏
          輯處理器一一對應(yīng)。具有4個物理CPU的系統(tǒng)可以有4位。如果這些CPU
          都啟用了超線程,那么這個系統(tǒng)就有一個8位的位掩碼。如果針對某個線程設(shè)置了指定的位,那么這個線程就可以在相關(guān)的
          CPU上運行。因此,如果一個線程可以在任何CPU上運行,并且能夠根 據(jù)需要在處理器之間進行遷移,那么位掩碼就全是1。實際上,在Linux
          中,這就是線程的默認(rèn)狀態(tài)。DPDK通過把線程綁定到邏輯核的方法來避免跨核任務(wù)中的切換開 銷,但對于綁定運行的當(dāng)前邏輯核,仍然可能會有線程切換的發(fā)生,若
          希望進一步減少其他任務(wù)對于某個特定任務(wù)的影響,在親和的基礎(chǔ)上更 進一步,可以采取把邏輯核從內(nèi)核調(diào)度系統(tǒng)剝離的方法。
          * 大頁表:
          默認(rèn)下Linux采用4KB為一頁,頁越小內(nèi)存越大,頁表的開銷越大,頁表的內(nèi)存占用也越大。CPU有TLB(Translation Lookaside
          Buffer)成本高所以一般就只能存放幾百到上千個頁表項。如果進程要使用64G內(nèi)存,則64G/4KB=16000000(一千六百萬)頁,每頁在頁表項中占用16000000
          *
          4B=62MB。如果用HugePage采用2MB作為一頁,只需64G/2MB=2000,數(shù)量不在同個級別。而DPDK采用HugePage,在x86-64下支持2MB、1GB的頁大小,幾何級的降低了頁表項的大小,從而減少TLB-Miss。
          * 無鎖機制:

          實際上DPDK內(nèi)部也有讀寫鎖,LINUX系統(tǒng)本身也支持無鎖操作,并且DPDK內(nèi)部的無鎖機制實現(xiàn)原理同LINUX系統(tǒng)提供的無鎖機制的實現(xiàn)原理類似。兩者都采用無鎖環(huán)形隊列的方式,采用環(huán)形隊列的好處是,當(dāng)一個數(shù)據(jù)元素被用掉后,其余數(shù)據(jù)元素不需要移動其存儲位置,從而減少拷貝,提高效率。LINUX系統(tǒng)如果僅僅有一個讀用戶和一個寫用戶,那么不需要添加互斥保護機制就可以
          保證數(shù)據(jù)的正確性。但是,如果有多個讀寫用戶訪問環(huán)形緩沖區(qū),那么
          必須添加互斥保護機制來確保多個用戶互斥訪問環(huán)形緩沖區(qū)。DPDK的無鎖環(huán)形隊列無論是單用戶讀寫還是多用戶讀寫都不需要使用互斥鎖保護。
          * cache預(yù)取
          處理器從一級Cache讀取數(shù)據(jù)需要3~5個時 鐘周期,二級是十幾個時鐘周期,三級是幾十個時鐘周期,而內(nèi)存則需
          要幾百個時鐘周期。DPDK必須保證所有需要讀取的數(shù)據(jù)都在Cache中,否則一旦出現(xiàn)Cache不命中,性能將會嚴(yán)重下降。為了保證這點,DPDK采用
          了多種技術(shù)來進行優(yōu)化,預(yù)取只是其中的一種。
          * 利用UIO支持
          為了讓驅(qū)動運行在用戶態(tài),Linux提供UIO機制。使用UIO可以通過read感知中斷,通過mmap實現(xiàn)和網(wǎng)卡的通訊。


          要開發(fā)用戶態(tài)驅(qū)動有幾個步驟:
          1.開發(fā)運行在內(nèi)核的UIO模塊,因為硬中斷只能在內(nèi)核處理
          2.通過/dev/uioX讀取中斷
          3.通過mmap和外設(shè)共享內(nèi)存

          * 其他:
          在網(wǎng)上看到DPDK還做了其他優(yōu)化,包括SNA(Shared-nothing Architecture)、SIMD(Single Instruction
          Multiple Data)、不使用慢速API、編譯執(zhí)行優(yōu)化、內(nèi)存對其、常量優(yōu)化、使用CPU指令等。
          3 DPDK陷阱
          所謂無利不起早,intel耗費人力、物力、財力開發(fā)出DPDK給大家使用也不是良心泛濫,結(jié)合當(dāng)前虛擬化浪潮洶涌,百花齊放,也帶來了無盡的商機。
          利用DPDK的 高速報文吞吐優(yōu)勢,對接運行在Linux用戶態(tài)的程序,對成本降低和硬 件通用化有很大的好處,使得以軟件為主體的網(wǎng)絡(luò)設(shè)備成為可能。對
          Intel? x86通用處理器而言,這是一個巨大的市場機會。
          對于通信設(shè)備廠商,通用平臺和軟件驅(qū)動的開發(fā)方式具有易采購、 易升級、穩(wěn)定性、節(jié)約成本的優(yōu)點。

          * 易采購:通用服務(wù)器作為主流的基礎(chǔ)硬件,擁有豐富的采購渠道 和供應(yīng)商,供貨量巨大。
          * 易升級:軟件開發(fā)模式簡單,工具豐富,最大程度上避免系統(tǒng)升 級中對硬件的依賴和更新,實現(xiàn)低成本的及時升級。
          * 穩(wěn)定性:通用服務(wù)器平臺已經(jīng)通過大量功能的驗證,產(chǎn)品穩(wěn)定性 毋庸置疑。而且,對于專用的設(shè)計平臺,系統(tǒng)穩(wěn)定需要時間累積和大量
          測試,尤其是當(dāng)采用新一代平臺設(shè)計時可能需要硬件更新,這就會帶來 穩(wěn)定性的風(fēng)險。
          * 節(jié)約研發(fā)成本和降低復(fù)雜性:傳統(tǒng)的網(wǎng)絡(luò)設(shè)備因為功能復(fù)雜和高 可靠性需求,系統(tǒng)切分為多個子系統(tǒng),每個子系統(tǒng)需要單獨設(shè)計和選
          型,獨立開發(fā),甚至選用單獨的芯片。這樣的系統(tǒng)需要構(gòu)建復(fù)雜的開發(fā) 團隊、完善的系統(tǒng)規(guī)劃、有效的項目管理和組織協(xié)調(diào),來確保系統(tǒng)開發(fā)
          進度。而且,由于開發(fā)的范圍大,各項目之間會產(chǎn)生路徑依賴。而基于 通用服務(wù)器搭建的網(wǎng)絡(luò)設(shè)備可以很好地避免這些問題。

          友情鏈接
          ioDraw流程圖
          API參考文檔
          OK工具箱
          云服務(wù)器優(yōu)惠
          阿里云優(yōu)惠券
          騰訊云優(yōu)惠券
          京東云優(yōu)惠券
          站點信息
          問題反饋
          郵箱:[email protected]
          QQ群:637538335
          關(guān)注微信

                chinese国产18粉嫩dh | 又黄又免费的动漫 | 99热99re6国产在线播放 | 噜噜噜噜射 | 日本丰满少妇bbbbbb黑人 |