dpdk儲存系統

2021-08-21 07:46:23 字數 1653 閱讀 4881

普通的南北橋系統裡面主要是通過北橋進行資料的交換,這樣系統的瓶頸在北橋中,numa(非一致性記憶體架構non-uniform memory architecture)系統可以解決這樣的系統瓶頸。在這種架構下,在乙個配有四核的機器中,不需要乙個複雜的北橋就能將記憶體頻寬增加到之前的四倍,這樣有乙個問題就是該系統中,訪問記憶體花費的時間和處理器相關,之所以和處理器相關是因為該系統每個處理器都有本地記憶體,訪問本地記憶體時間很短,但是訪問遠端記憶體時間較長。

預取指令可以把即將用到的資料從記憶體中載入到cache中,這樣當前資料處理完畢後,即將用到的資料已經在cache中,大大減少了從記憶體中讀取的開銷。也減少了記憶體讀取的時間。

通過軟體預取指令,可以顯式的載入資料到cache,以提高程式執行的效率。

預取指令列表:

指令解釋

prefetch0

將資料存放在每一級cache,假設有**cache,則l1、l2、l3 cache都包含該資料的乙個備份

prefetch1

將資料存放在除了l1 cache之外的每一級cache,假設有**cache,則l2、l3 cache都包含該資料的乙個備份

prefetch2

將資料存放在除了l1、l2 cache之外的每一級cache,假設有**cache,則l3 cache包含該資料的乙個備份

prefetchnta

和prefetch0功能類似,區別是資料是作為非臨時資料存放,在使用完一次之後,cache認為該資料是可以被淘汰出去的

預取指令是彙編指令,c程式庫中的mmintrin.h包含了如下的程式模型:

void _mm_prefeatch(char *p, int i);
p是需要預取的記憶體位址,i對應相應的預取指令。

dpdk處理報文的邏輯是:

寫接收描述符到記憶體,填充資料緩衝區指標,網絡卡收到報文後就會根據這個位址把報文內容填充進去。

從記憶體中讀取接收描述符(當收到報文時,網絡卡會更新該結構)(記憶體讀),從而確認是否收到報文。

從接收描述符確認收到報文時,從記憶體中讀取控制結構體的指標(記憶體讀),再從記憶體中讀取控制結構體(記憶體讀),把從接收描述符讀取的資訊填充到該控制結構體。

更新接收佇列暫存器,表示軟體收到了新的報文。

記憶體中讀取報文頭部(記憶體讀),決定**埠。

從控制結構體把報文資訊填入到傳送佇列傳送描述符,更新傳送佇列到暫存器。

從記憶體中讀取傳送描述符(記憶體讀),檢查是否有包被硬體傳送出去。

如果有的話,從記憶體中讀取相應控制結構體(記憶體讀),釋放資料緩衝區。

dpdk處理一次報文要讀取6次報文,所以必須要保證cache命中,否則效能下降會非常嚴重。

以下**擷取於/examples/ip_reassembly/main.c

while (1) 

prev_tsc = cur_tsc;

}//從接收佇列讀資料報

for (i = 0; i < qconf->n_rx_queue; ++i)

//預取並**已預取的資料報

for (j = 0; j < (nb_rx - prefetch_offset); j++)

//**剩餘的預取包

for (; j < nb_rx; j++)

}}

DPDK中文 DPDK工具 pdump

翻譯自 注意 pdump只能是主dpdk程式準備ok了 pdump依賴基於pmd的libpcap。這個選項預設在編譯的配置檔案是disable的 由於libpcap必須實現被安裝在板子上,並且開發檔案libpcap dev這種也要安裝 同時把build的配置檔案。config修改 config rt...

dpdk環境搭建

步驟一 yum update yum install libpcap devel kernel 安裝程式依賴 config rte librte vhost numa y改為 config rte librte vhost numa n config rte kni kmod y改為 config ...

DPDK 中斷機制 eal intr handle

一 中斷初始化 在rte eal intr init 函式中初始化中斷。具體如下 1 首先初始化intr sources鍊錶。所有uio裝置的中斷都掛在這個鍊錶上,中斷處理執行緒通過遍歷這個鍊錶,來執行裝置的中斷。2 建立intr pipe管道,用於epoll模型的訊息通知。3 建立執行緒intr ...