1、前言

  記得剛開始工作的時(shí),老大將我安排到數(shù)據(jù)面組,當(dāng)時(shí)第一次聽說”數(shù)據(jù)面“這個(gè)概念,感覺挺新鮮的。誤打誤撞就開始搞了,剛開始接觸的時(shí)候,由于不懂其中的原理,覺得很神奇,因?yàn)閳?bào)文的轉(zhuǎn)發(fā)是在應(yīng)用層,通過一個(gè)進(jìn)程進(jìn)行轉(zhuǎn)發(fā)。而傳統(tǒng)的報(bào)文轉(zhuǎn)發(fā)是基于內(nèi)核的,要想控制報(bào)文,需要寫驅(qū)動(dòng)程序。后面接觸了一段時(shí)間,發(fā)現(xiàn)原來報(bào)文轉(zhuǎn)發(fā)是基于intel開源的DPDK開發(fā)的,分為控制面和數(shù)據(jù)面。這就是當(dāng)前比較火熱的軟件定義網(wǎng)路SDN的一種應(yīng)用場景。DPDK應(yīng)用程序是運(yùn)行在用戶空間上利用自身提供的數(shù)據(jù)平面庫來收發(fā)數(shù)據(jù)包,繞過了Linux內(nèi)核協(xié)議棧對(duì)數(shù)據(jù)包處理過程。Linux內(nèi)核將DPDK應(yīng)用程序看作是一個(gè)普通的用戶態(tài)進(jìn)程,包括它的編譯、連接和加載方式和普通程序沒有什么兩樣。intel為什么要搞一個(gè)DPDK出來呢?有什么優(yōu)勢呢?運(yùn)用了哪些技術(shù)呢?帶著這些疑問,加深學(xué)習(xí)一下。

2、背景分析

  網(wǎng)路剛開始時(shí),只是在小范圍內(nèi)使用,并發(fā)量和響應(yīng)時(shí)間要求并不高,而隨著網(wǎng)路的普及,網(wǎng)路的范圍越來越大,對(duì)服務(wù)器的并發(fā)量和響應(yīng)時(shí)間要求越來越高,從而出現(xiàn)C10k問題。而現(xiàn)在C10k問題已經(jīng)得到解決,又出現(xiàn)新的挑戰(zhàn),為了滿足日益增長的需求主要采用分布式集群來分擔(dān)負(fù)荷,應(yīng)對(duì)大量的用戶請(qǐng)求。對(duì)網(wǎng)路的要求越來越高。

  網(wǎng)路的核心是報(bào)文的轉(zhuǎn)發(fā)過程,linux網(wǎng)路是通過內(nèi)核協(xié)議棧進(jìn)行轉(zhuǎn)發(fā)的,報(bào)文控制平面和數(shù)據(jù)轉(zhuǎn)發(fā)平面沒有分離,不適合處理大規(guī)模網(wǎng)絡(luò)數(shù)據(jù)包,因?yàn)閘inux分為內(nèi)核區(qū)和用戶區(qū),報(bào)文先進(jìn)入內(nèi)核區(qū)然后拷貝到用戶區(qū),供給上層應(yīng)用程序處理。并且為了全面的支持用戶空間的各個(gè)功能,協(xié)議棧中嵌入了大量用于對(duì)接的接口。如果能讓應(yīng)用程序直接接管網(wǎng)絡(luò)數(shù)據(jù)包處理、內(nèi)存管理以及CPU調(diào)度,那么性能可以得到一個(gè)質(zhì)的提升。

  如今的處理器都是多核,而且內(nèi)存也越來越大,可以提高多核和大內(nèi)存的擴(kuò)展性,減少CPU多核之間任務(wù)的切換,內(nèi)存cache miss,因?yàn)閮?nèi)存的訪問速度永遠(yuǎn)也趕不上cache和cpu的頻率,為了能讓性能平行擴(kuò)展,最好是少訪問。

  要提高網(wǎng)路報(bào)文轉(zhuǎn)發(fā),從如下幾個(gè)方面著手:

  1.控制層留給Linux做,其它數(shù)據(jù)層全部由應(yīng)用程序來處理。
  2.減少系統(tǒng)調(diào)度、系統(tǒng)調(diào)用、系統(tǒng)中斷,上下文切換等
  3.摒棄Linux內(nèi)核協(xié)議棧,將數(shù)據(jù)包傳輸?shù)接脩艨臻g定制協(xié)議棧
  4.使用多核編程技術(shù)替代多線程,將OS綁在指定核上運(yùn)行
  5.針對(duì)SMP系統(tǒng),使CPU盡量使用所在NUMA系統(tǒng)節(jié)點(diǎn)的內(nèi)存,減少內(nèi)存刷寫
  6.使用大頁面,減少訪問
  7.采用無鎖技術(shù)解競爭

3、DPDK的優(yōu)勢

移動(dòng)開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

  DPDK攔截中斷,不觸發(fā)后續(xù)中斷流程,并繞過協(xié)議棧,通過UIO技術(shù)將網(wǎng)卡收到的報(bào)文拷貝到應(yīng)用層處理,報(bào)文不再經(jīng)過內(nèi)核協(xié)議棧。減少了中斷,DPDK的包全部在用戶控件使用內(nèi)存池管理,內(nèi)核控件與用戶空間的內(nèi)存交互不用進(jìn)行拷貝,只做控制權(quán)轉(zhuǎn)移,減少報(bào)文拷貝過程,提高報(bào)文的轉(zhuǎn)發(fā)效率。

  DPDK核心技術(shù)如下:

 ?。?)通過UIO技術(shù)將報(bào)文拷貝到應(yīng)用空間處理

 ?。?)通過大頁內(nèi)存,降低cache miss ,提高命中率,進(jìn)而cpu訪問速度

 ?。?)通過CPU親和性,綁定網(wǎng)卡和線程到固定的core,減少cpu任務(wù)切換

 ?。?)通過無鎖隊(duì)列,減少資源競爭

  接下來深入學(xué)習(xí)總結(jié)一下dpdk所用到的技術(shù),加深理解。


網(wǎng)友評(píng)論