1、前言

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

2、背景分析

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

  網(wǎng)路的核心是報(bào)文的轉(zhuǎn)發(fā)過(guò)程,linux網(wǎng)路是通過(guò)內(nèi)核協(xié)議棧進(jìn)行轉(zhuǎn)發(fā)的,報(bào)文控制平面和數(shù)據(jù)轉(zhuǎn)發(fā)平面沒(méi)有分離,不適合處理大規(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)存也越來(lái)越大,可以提高多核和大內(nèi)存的擴(kuò)展性,減少CPU多核之間任務(wù)的切換,內(nèi)存cache miss,因?yàn)閮?nèi)存的訪問(wèn)速度永遠(yuǎn)也趕不上cache和cpu的頻率,為了能讓性能平行擴(kuò)展,最好是少訪問(wèn)。

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

  1.控制層留給Linux做,其它數(shù)據(jù)層全部由應(yīng)用程序來(lái)處理。
  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.使用大頁(yè)面,減少訪問(wèn)
  7.采用無(wú)鎖技術(shù)解競(jìng)爭(zhēng)

3、DPDK的優(yōu)勢(shì)

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

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

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

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

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

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

 ?。?)通過(guò)無(wú)鎖隊(duì)列,減少資源競(jìng)爭(zhēng)

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