DPDK學習之開篇介紹
1、前言
記得剛開始工作的時,老大將我安排到資料面組,當時第一次聽說”資料面“這個概念,感覺挺新鮮的。誤打誤撞就開始搞了,剛開始接觸的時候,由於不懂其中的原理,覺得很神奇,因為報文的轉發是在應用層,通過一個程序進行轉發。而傳統的報文轉發是基於核心的,要想控制報文,需要寫驅動程式。後面接觸了一段時間,發現原來報文轉發是基於intel開源的DPDK開發的,分為控制面和資料面。這就是當前比較火熱的軟體定義網路SDN的一種應用場景。DPDK應用程式是執行在使用者空間上利用自身提供的資料平面庫來收發資料包,繞過了Linux核心協議棧對資料包處理過程。Linux核心將DPDK應用程式看作是一個普通的使用者態程序,包括它的編譯、連線和載入方式和普通程式沒有什麼兩樣。intel為什麼要搞一個DPDK出來呢?有什麼優勢呢?運用了哪些技術呢?帶著這些疑問,加深學習一下。
2、背景分析
網路剛開始時,只是在小範圍內使用,併發量和響應時間要求並不高,而隨著網路的普及,網路的範圍越來越大,對伺服器的併發量和響應時間要求越來越高,從而出現C10k問題。而現在C10k問題已經得到解決,又出現新的挑戰,為了滿足日益增長的需求主要採用分散式叢集來分擔負荷,應對大量的使用者請求。對網路的要求越來越高。
網路的核心是報文的轉發過程,linux網路是通過核心協議棧進行轉發的,報文控制平面和資料轉發平面沒有分離,不適合處理大規模網路資料包,因為linux分為核心區和使用者區,報文先進入核心區然後拷貝到使用者區,供給上層應用程式處理。並且為了全面的支援使用者空間的各個功能,協議棧中嵌入了大量用於對接的介面。如果能讓應用程式直接接管網路資料包處理、記憶體管理以及CPU排程,那麼效能可以得到一個質的提升。
如今的處理器都是多核,而且記憶體也越來越大,可以提高多核和大記憶體的擴充套件性,減少CPU多核之間任務的切換,記憶體cache miss,因為記憶體的訪問速度永遠也趕不上cache和cpu的頻率,為了能讓效能平行擴充套件,最好是少訪問。
要提高網路報文轉發,從如下幾個方面著手:
1.控制層留給Linux做,其它資料層全部由應用程式來處理。
2.減少系統排程、系統呼叫、系統中斷,上下文切換等
3.摒棄Linux核心協議棧,將資料包傳輸到使用者空間定製協議棧
4.使用多核程式設計技術替代多執行緒,將OS綁在指定核上執行
5.針對SMP系統,使CPU儘量使用所在NUMA系統節點的記憶體,減少記憶體刷寫
6.使用大頁面,減少訪問
7.採用無鎖技術解競爭
3、DPDK的優勢
DPDK攔截中斷,不觸發後續中斷流程,並繞過協議棧,通過UIO技術將網絡卡收到的報文拷貝到應用層處理,報文不再經過核心協議棧。減少了中斷,DPDK的包全部在使用者控制元件使用記憶體池管理,核心控制元件與使用者空間的記憶體互動不用進行拷貝,只做控制權轉移,減少報文拷貝過程,提高報文的轉發效率。
DPDK核心技術如下:
(1)通過UIO技術將報文拷貝到應用空間處理
(2)通過大頁記憶體,降低cache miss ,提高命中率,進而cpu訪問速度
(3)通過CPU親和性,繫結網絡卡和執行緒到固定的core,減少cpu任務切換
(4)通過無鎖佇列,減少資源競爭
接下來深入學習總結一下dpdk所用到的技術,加深理解。
4、參考資料