DPDK簡介之二

前沿

DPDK是專爲快速收發包所開發的一系列的庫文件和驅動代碼。可以在Intel的芯片上運行。可以用來在極短的時間裏面完成收發包(一般低於80個週期)。可以運行第三方的快速路徑棧而DPDK最大的優點就是改進小封包吞吐量與作業負荷效能,傳統的網路架構都是針對大封包吞吐量進行最佳化,而Intel® DPDK可以解決小封包所帶來效能不佳的問題。除了應用在企業終端外, Intel DPDK 也可以在軟件定義網路 (SDN) 與網路功能虛擬化 (NFV) 中扮演着重要的角色。

基本概念

UIO

UIO指的是運行在用戶空間的I/O技術,是實現用戶空間下驅動程序的支撐機制。在用戶空間用應用程序調用即可,而UIO則是將驅動的很少一部分運行在內核空間,而在用戶空間實現驅動的絕大多數功能。使用UIO可以避免設備的驅動程序需要隨着內核的更新而更新的問題。由於DPDK是應用層平臺,所以與此緊密相連的網卡驅動程序(主要是intel自身的千兆igb與萬兆ixgbe驅動程序)都通過uio機制運行在用戶態下。 Intel® DPDK 的igb_uio內核模塊依賴於內核的UIO。 需要以模塊方式編譯可以通過如下命令進行編譯
sudo /sbin/modprobe uio

Hugepages 機制

大內存頁指的是爲包處理的緩衝區緩衝區分配更大的大內存池,利用大內存頁的主要好處當然是通過利用大內存頁提高內存使用效率。可以得到明顯的性能提高,因爲需要更少的頁,更少的TLB( Translation Lookaside Buffers),減少了虛擬頁地址到物理頁地址的轉換時間。如果不使用大內存頁機制的話,TLB的命中率會降低,反而會降低性能。大內存頁最好在啓動的時候進行分配,這樣可以避免物理空間中有太多的碎片,提高發包的效率。普通的頁大小爲4KB, 默認的大內存頁的大小爲2MB,也可以設置其他的大內存頁大小,可以從CPU的標識中看出支持哪種大內存頁,如果有 “pse”的標識,說明支持2M的大內存頁。 如果有“pdpe1gb”的標識,說明支持1G的大內存頁,如果64位機建議使用1GB的大頁。

如何使用大內存頁

如果已經配置好了大內存頁機制,就可以讓DPDK利用大內存頁的機制了。
可以輸入如下的命令
mkdir /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
在運行程序 的時候,最好把分配給大頁的所有空間都利用起來。如果DPDK的程序在運行的時候傳遞了-m 或者–socket-mem的參數,大內存頁的分配在啓動的時候會自動加載。如果傳遞給程序的內存頁數量比程序要求的要少,也就是內存頁不夠用,程序將會中止。

TLB

其中TLB(Translation Lookaside Buffer)指的是旁路轉換緩衝,或稱爲頁表緩衝,是一個存放着頁表緩存(虛擬地址到物理地址的轉換表)的內存管理單元,用於改進虛擬地址到物理地址轉換速度。
X86體系的系統內存裏存放了兩級頁表,第一級頁表稱爲頁目錄,第二級稱爲頁表。由於“頁表”存儲在主存儲器中,查詢頁表所付出的代價很大,由此產生了TLB。
TLB是內存裏存放的頁表的緩存,那麼它裏邊存放的數據實際上和內存頁表區的數據是一致的,在內存的頁表區裏,每一條記錄虛擬頁面和物理頁框對應關係的記錄稱之爲一個頁表條目(Entry),同樣地,在TLB裏邊也緩存了同樣大小的頁表條目(Entry)。

1:在X86體系的CPU裏邊,一般都設有如下4組TLB:
第一組:緩存一般頁表(4K字節頁面)的指令頁表緩存(Instruction-TLB);
第二組:緩存一般頁表(4K字節頁面)的數據頁表緩存(Data-TLB);
第三組:緩存大尺寸頁表(2M/4M字節頁面)的指令頁表緩存(Instruction-TLB);
第四組:緩存大尺寸頁表(2M/4M字節頁面)的數據頁表緩存(Data-TLB);
2:TLB命中和TLB失敗
如果TLB中正好存放着所需的頁表,則稱爲TLB命中(TLB Hit);
如果TLB中沒有所需的頁表,則稱爲TLB失敗(TLB Miss)。
當CPU收到應用程序發來的虛擬地址後,
首先到TLB中查找相應的頁表數據,如果TLB中正好存放着所需的頁表,則稱爲TLB命中(TLB Hit)
接下來CPU再依次看TLB中頁表所對應的物理內存地址中的數據是不是已經在一級、二級緩存裏了,若沒有則到內存中取相應地址所存放的數據。

CPU的物理核,邏輯核概念

一個物理封裝的CPU(通過physical id區分判斷)可以有多個核(通過core id區分判斷)。而每個核可以有多個邏輯cpu(通過processor區分判斷)。一個核通過多個邏輯cpu實現這個核自己的超線程技術。

物理處理器封裝個數

Sockets, 中文翻譯成“插槽”,也就是所謂的物理處理器封裝個數,即俗稱的“物理CPU數”,管理員可能會稱之爲“路”。
例如一塊“Intel Core i3-2310M”只有1個“物理處理器封裝個數”。若對於有多個處理器插槽的服務器,“物理處理器封裝個數”很可能會大於1。
可以使用如下命令查詢物理處理器的封裝個數。
cat /proc/cpuinfo| grep “physical id”| sort| uniq| wc –l
具有相同physical id的CPU是同一個CPU封裝的線程或核心
或者使用
lscpu | grep “CPU socket”(iscpu可以看到很多cat /proc/cpuinfo看不到的東西,建議使用)

處理器核心數

processor cores,即俗稱的“CPU核心數”,也就是每個物理CPU中core的個數
例如“Intel Core i3-2310M”是雙核處理器,它有2個“處理器核心數”。
可以通過以下的命令來查看:
cat /proc/cpuinfo| grep “cpu cores”| uniq
具有相同core id的CPU是同一個core的超線程

邏輯處理器數

邏輯處理器數英文名是logical processors,即俗稱的“邏輯CPU數”,
邏輯核心處理器,就是虛擬物理核心處理器的一個超線程技術
例如“Intel Core i3-2310M”支持超線程,一個物理核心能模擬爲兩個邏輯處理器,即一塊“Intel Core i3-2310M”有4個“邏輯處理器數”。
可以使用
cat /proc/cpuinfo| grep “processor”| wc –l

SIBLING

SIBLING是內核認爲的單個物理處理器所有的超線程個數,也就是一個物理封裝中的邏輯核的個數。

如果SIBLING等於實際物理核數的話,就說明沒有啓動超線程,反之啓用超線程。
也就是說使用cat /proc/cpu命令

如果“siblings”和“cpu cores”一致,則說明不支持超線程,或者超線程未打開。
如果“siblings”是“cpu cores”的兩倍,則說明支持超線程,並且超線程已打開

超線程

超線程全名爲Hyper-Threading,利用特殊的硬件指令,把兩個邏輯內核模擬成兩個物理芯片,讓單個處理器都能使用線程級並行計算,進而兼容多線程操作系統和軟件,減少了CPU的閒置時間,提高的CPU的運行速度。

採用超線程即是可在同一時間裏,應用程序可以使用芯片的不同部分。
雖然單線程芯片每秒鐘能夠處理成千上萬條指令,但是在任一時刻只能夠對一條指令進行操作。而超線程技術可以使芯片同時進行多線程處理,使芯片性能得到提升。

雖然採用超線程技術能同時執行兩個線程,但它並不象兩個真正的CPU那樣,每個CPU都具有獨立的資源。當兩個線程都同時需要某一個資源時,其中一個要暫時停止,並讓出資源,直到這些資源閒置後才能繼續。因此超線程的性能並不等於兩顆CPU的性能。

如果有兩個邏輯CPU具有相同的”core id”,那麼超線程是打開的。

CPU親和性

CPU的親和性也就是cpu affinity機制,指的是進程要在指定的 CPU 上儘量長時間地運行而不被遷移到其他處理器, 通過處理器關聯可以將虛擬處理器映射到一個或多個物理處理器上 , 也就是說把一個程序綁定到一個物理CPU上。

在越來越多核心的cpu機器上,如何提高外設以及程序工作效率的最直觀想法就是讓各個cpu核心各自幹專門的事情。而且在多核運行的機器上,每個CPU本身自己會有緩存,緩存着進程使用的信息,而進程可能會被OS調度到其他CPU上,如此,CPU cache命中率就低了,當綁定CPU後,程序就會一直在指定的cpu跑,不會由操作系統調度到其他CPU上,性能有一定的提高。

另外一種使用綁核考慮就是將重要的業務進程隔離開,對於部分實時進程調度優先級高,可以將其綁定到一個指定核上,既可以保證實時進程的調度,也可以避免其他CPU上進程被該實時進程干擾。

DPDK利用cpu affinity主要是將控制面線程以及各個數據面線程綁定到不同的cpu,省卻了來回反覆調度的性能消耗,線程之間互不干擾的完成工作。

編譯DPDK工具鏈

把從官網下到的DPDK的安裝包,並解壓以後可以得到如下的目錄
user@droid:~/rte-source$ ls
app/ config/ examples/ lib/ LICENSE.GPL LICENSE.LGPL Makefile mk/ scripts/ tools/

• lib: DPDK的庫函數
• app:的應用的源文件
• examples:應用的一些例程源碼
• config, tools, scripts, mk: makefiles,腳本和一些配置文件。

指得一提的是,官方文檔中約定rte-source爲軟件解壓的目錄路徑。

加載DPDK igb_uio模塊

要運行DPDK的所有程序,必須首先加載igb_uio模塊。 Linux系統中一般的驅動設備都是運行在內核空間,但是DPDK是應用層平臺,所以與此緊密相連的網卡驅動程序都通過uio機制運行在用戶態下。可以使用如下命令加載模塊:
sudo insmod kmod/igb_uio.ko

網絡端口綁定到igb_uio上

dpdk會讓網卡脫離系統內核,重新綁定到igb_uio上,然會從用戶態裏去控制網卡,可以在執行程序的時候使用-b的選項讓某個端口不被解綁。一定從內核驅動中解綁,從系統角度是看不到這張網卡,也就是說通過ifconfig命令,看不到這張網卡的信息,而且所有網絡應該程序也都用不了這張網卡。要用這個網卡,就需要用DPDK的API來寫發包,收包程序。如果這個網卡要配IP,則需要在程序裏自已實現TCP/IP協議。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章