您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關如何進行DPDK全面分析,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
隨著云計算產業的異軍突起,網絡技術的不斷創新,越來越多的網絡設備基礎架構逐步向基于通用處理器平臺的架構方向融合,從傳統的物理網絡到虛擬網絡,從扁平化的網絡結構到基于 SDN 分層的網絡結構,無不體現出這種創新與融合。
這在使得網絡變得更加可控制和成本更低的同時,也能夠支持大規模用戶或應用程序的性能需求,以及海量數據的處理。究其原因,其實是高性能網絡編程技術隨著網絡架構的演進不斷突破的一種必然結果。
1、中斷處理。當網絡中大量數據包到來時,會產生頻繁的硬件中斷請求,這些硬件中斷可以打斷之前較低優先級的軟中斷或者系統調用的執行過程,如果這種打斷頻繁的話,將會產生較高的性能開銷。
2、內存拷貝。正常情況下,一個網絡數據包從網卡到應用程序需要經過如下的過程:數據從網卡通過 DMA 等方式傳到內核開辟的緩沖區,然后從內核空間拷貝到用戶態空間,在 Linux 內核協議棧中,這個耗時操作甚至占到了數據包整個處理流程的 57.1%。
3、上下文切換。頻繁到達的硬件中斷和軟中斷都可能隨時搶占系統調用的運行,這會產生大量的上下文切換開銷。另外,在基于多線程的服務器設計框架中,線程間的調度也會產生頻繁的上下文切換開銷,同樣,鎖競爭的耗能也是一個非常嚴重的問題。
4、局部性失效。如今主流的處理器都是多個核心的,這意味著一個數據包的處理可能跨多個 CPU 核心,比如一個數據包可能中斷在 cpu0,內核態處理在 cpu1,用戶態處理在 cpu2,這樣跨多個核心,容易造成 CPU 緩存失效,造成局部性失效。如果是 NUMA 架構,更會造成跨 NUMA 訪問內存,性能受到很大影響。
5、內存管理。傳統服務器內存頁為 4K,為了提高內存的訪問速度,避免 cache miss,可以增加 cache 中映射表的條目,但這又會影響 CPU 的檢索效率。
綜合以上問題,可以看出內核本身就是一個非常大的瓶頸所在。那很明顯解決方案就是想辦法繞過內核。
針對以上弊端,分別提出以下技術點進行探討。
1、控制層和數據層分離。將數據包處理、內存管理、處理器調度等任務轉移到用戶空間去完成,而內核僅僅負責部分控制指令的處理。這樣就不存在上述所說的系統中斷、上下文切換、系統調用、系統調度等等問題。
2、使用多核編程技術代替多線程技術,并設置 CPU 的親和性,將線程和 CPU 核進行一比一綁定,減少彼此之間調度切換。
3、針對 NUMA 系統,盡量使 CPU 核使用所在 NUMA 節點的內存,避免跨內存訪問。
4、使用大頁內存代替普通的內存,減少 cache-miss。
5、采用無鎖技術解決資源競爭問題。
經很多前輩先驅的研究,目前業內已經出現了很多優秀的集成了上述技術方案的高性能網絡數據處理框架,如 6wind、windriver、netmap、dpdk 等,其中,Intel 的 dpdk 在眾多方案脫穎而出,一騎絕塵。
dpdk 為 Intel 處理器架構下用戶空間高效的數據包處理提供了庫函數和驅動的支持,它不同于 Linux 系統以通用性設計為目的,而是專注于網絡應用中數據包的高性能處理。
也就是 dpdk 繞過了 Linux 內核協議棧對數據包的處理過程,在用戶空間實現了一套數據平面來進行數據包的收發與處理。在內核看來,dpdk 就是一個普通的用戶態進程,它的編譯、連接和加載方式和普通程序沒有什么兩樣。
相對傳統的基于內核的網絡數據處理,dpdk 對從內核層到用戶層的網絡數據流程進行了重大突破,我們先看看傳統的數據流程和 dpdk 中的網絡流程有什么不同。
傳統 Linux 內核網絡數據流程:
Copy
硬件中斷--->取包分發至內核線程--->軟件中斷--->內核線程在協議棧中處理包--->處理完畢通知用戶層 用戶層收包-->網絡層--->邏輯層--->業務層
dpdk 網絡數據流程:
Copy
硬件中斷--->放棄中斷流程 用戶層通過設備映射取包--->進入用戶層協議棧--->邏輯層--->業務層
下面就具體看看 dpdk 做了哪些突破?
UIO (用戶空間的 I/O 技術)的加持。
dpdk 能夠繞過內核協議棧,本質上是得益于 UIO 技術,通過 UIO 能夠攔截中斷,并重設中斷回調行為,從而繞過內核協議棧后續的處理流程。
UIO 設備的實現機制其實是對用戶空間暴露文件接口,比如當注冊一個 UIO 設備 uioX,就會出現文件 /dev/uioX,對該文件的讀寫就是對設備內存的讀寫。除此之外,對設備的控制還可以通過 /sys/class/uio 下的各個文件的讀寫來完成。
內存池技術
dpdk 在用戶空間實現了一套精巧的內存池技術,內核空間和用戶空間的內存交互不進行拷貝,只做控制權轉移。這樣,當收發數據包時,就減少了內存拷貝的開銷。
大頁內存管理
dpdk 實現了一組大頁內存分配、使用和釋放的 API,上層應用可以很方便使用 API 申請使用大頁內存,同時也兼容普通的內存申請。
無鎖環形隊列
dpdk 基于 Linux 內核的無鎖環形緩沖 kfifo 實現了自己的一套無鎖機制。支持單生產者入列/單消費者出列和多生產者入列/多消費者出列操作,在數據傳輸的時候,降低性能的同時還能保證數據的同步。
poll-mode網卡驅動
DPDK網卡驅動完全拋棄中斷模式,基于輪詢方式收包,避免了中斷開銷。
NUMA
dpdk 內存分配上通過 proc 提供的內存信息,使 CPU 核心盡量使用靠近其所在節點的內存,避免了跨 NUMA 節點遠程訪問內存的性能問題。
CPU 親和性
dpdk 利用 CPU 的親和性將一個線程或多個線程綁定到一個或多個 CPU 上,這樣在線程執行過程中,就不會被隨意調度,一方面減少了線程間的頻繁切換帶來的開銷,另一方面避免了 CPU 緩存的局部失效性,增加了 CPU 緩存的命中率。
多核調度框架
dpdk 基于多核架構,一般會有主從核之分,主核負責完成各個模塊的初始化,從核負責具體的業務處理。
除了上述之外,dpdk 還有很多的技術突破,可以用下面這張圖來概之。
dpdk 作為優秀的用戶空間高性能數據包加速套件,現在已經作為一個“膠水”模塊被用在多個網絡數據處理方案中,用來提高性能。如下是眾多的應用。
OVS
Open vSwitch 是一個多核虛擬交換機平臺,支持標準的管理接口和開放可擴展的可編程接口,支持第三方的控制接入。
VPP
VPP 是 cisco 開源的一個高性能的包處理框架,提供了 交換/路由 功能,在虛擬化環境中,使它可以當做一個虛擬交換機來使用。在一個類 SDN 的處理框架中,它往往充當數據面的角色。經研究表明,VPP 性能要好于 ovs+dpdk 的組合,但它更適用于NFV,適合做特定功能的網絡模塊。
Lagopus
Lagopus 是另一個多核虛擬交換的實現,功能和 OVS 差不多,支持多種網絡協議,如 Ethernet,VLAN,QinQ,MAC-in-MAC,MPLS 和 PBB,以及隧道協議,如 GRE,VxLan 和 GTP。
Snabb
Snabb 是一個簡單且快速的數據包處理工具箱。
OPENCONTRAIL
一個集成了 SDN 控制器的虛擬路由器,現在多用在 OpenStack 中,結合 Neutron 為 OpenStack 提供一站式的網絡支持。
CloudRouter
一個分布式的路由器。
dpdk 繞過了 Linux 內核協議棧,加速數據的處理,用戶可以在用戶空間定制協議棧,滿足自己的應用需求,目前出現了很多基于 dpdk 的高性能網絡框架,OVS 和 VPP 是常用的數據面框架,mTCP 和 f-stack 是常用的用戶態協議棧。很多大公司都在使用 dpdk 來優化網絡性能。
關于如何進行DPDK全面分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。