攻城獅自述丨OK1043A-C DPDK環境體驗

飛凌嵌入式今年6月推出的——FET1043A-C核心板 ,採用NXP公司的QorIQ® LS1043A處理器設計,擁有四顆ARMv8-A架構的Cortex-A53核,主頻1.6G,低功耗,高能效。四通道高達10GB的SerDes包含多種靈活配置,在飛凌設計的配套底板中最大程度上發揮了QorIQ® LS1043A 處理器網絡性能,採用一個萬兆,六個千兆的設計,配合處理器內部的DPAA1加速引擎,再加上2GB大容量DDR4內存簡直就是網絡性能怪獸。

攻城獅自述丨OK1043A-C DPDK環境體驗

硬件如此的優秀,那麼傳統的Linux內核還是否與其門當戶對?答案是否定的。

原因有以下幾個方面:

❶ 中斷處理。當網絡中大量數據包到來時,會產生頻繁的硬件中斷請求,這些硬件中斷可以打斷之前較低優先級的軟中斷或者系統調用的執行過程,如果這種打斷頻繁的話,將會產生較高的性能開銷。

❷ 內存拷貝。正常情況下,一個網絡數據包從網卡到應用程序需要經過如下的過程:數據從網卡通過DMA等方式傳到內核開闢的緩衝區,然後從內核空間拷貝到用戶態空間,在Linux內核協議棧中,這個耗時操作甚至佔到了數據包整個處理流程的57.1%。

❸ 上下文切換。頻繁到達的硬件中斷和軟中斷都可能隨時搶佔系統調用的運行,這會產生大量的上下文切換開銷。另外,在基於多線程的服務器設計框架中,線程間的調度也會產生頻繁的上下文切換開銷,同樣,鎖競爭的耗能也是一個非常嚴重的問題。

❹ 局部性失效。如今主流的處理器都是多個核心的,這意味着一個數據包的處理可能跨多個CPU 核心,比如一個數據包可能中斷在cpu0,內核態處理在cpu1,用戶態處理在cpu2,這樣跨多個核心,容易造成CPU 緩存失效,造成局部性失效。如果是NUMA 架構,更會造成跨NUMA 訪問內存,性能受到很大影響。

❺ 內存管理。傳統服務器內存頁爲4K,爲了提高內存的訪問速度,避免cache miss,可以增加cache 中映射表的條目,但這又會影響CPU 的檢索效率。

綜合以上問題,可以看出內核本身就是一個非常大的瓶頸所在。那很明顯解決方案就是想辦法繞過內核。經很多前輩先驅的研究,DPDK在衆多方案脫穎而出。

攻城獅自述丨OK1043A-C DPDK環境體驗

攻城獅自述丨OK1043A-C DPDK環境體驗

“紙上得來終覺淺,絕知此事要躬行”,下面我們通過一個實例來體驗下DPDK。

首先,使用DPDK環境,需要修改設備樹,將網絡配置到用戶態。需要使用到的設備樹文件:

OK10xx-linux-fs/flexbuild/build/linux/linux/arm64/fsl-ls1043a-rdb-usdpaa.dtb

將fsl-ls1043a-rdb-usdpaa.dtb拷貝到開發板根目錄,使用如下命令替換設備樹:

mv/run/media/mmcblk0p2/fsl-ls1043a-rdb-sdk.dtb/run/media/mmcblk0p2/fsl-ls1043a-rdb-sdk.dtb.bak

cp/fsl-ls1043a-rdb-usdpaa.dtb /run/media/mmcblk0p2/boot

ln-s /run/media/mmcblk0p2/boot/fsl-ls1043a-rdb-usdpaa.dtb/run/media/mmcblk0p2/boot/fsl-ls1043a-rdb-sdk.dtb

reboot

替換成功後啓動開發板輸入:ifconfigfm1-mac1

如果提示Devicenot found 就是已經替換成功。

測試DPDK完成後恢復默認配置方法:

cp/run/media/mmcblk0p2/fsl-ls1043a-rdb-sdk.dtb.bak/run/media/mmcblk0p2/fsl-ls1043a-rdb-sdk.dtb

reboot

將網絡配置到用戶態之後,那麼我們該如何使用它們呢?TCP/UDP咋用?不要急在DPDK中使用TCP或者UDP的話還需要移植一個協議棧到DPDK中。入門階段我們還是先來體驗一把DPDK中包含了二層轉發的測試例程吧。

二層轉發網絡拓撲如下圖所示:

攻城獅自述丨OK1043A-C DPDK環境體驗

使用OK1043A-C平臺的Port2和Port3(對應fm1-mac3和fm1-mac4),對LinuxHost 和 OK1012A-C之間的數據進行轉發。LinuxHost 和 OK1012A-C您可以替換成其他的網絡設備。

配置OK1043A-C:

l2fwd-c 0xf -n 1 -- -p 0xc -q 1 --no-mac-updating

參數

說明

-c

Core mask 0xf 使用4核

-n

內存通道數

-p

Port mask 0xc 二進制1100使用port3 port2

-q

每個核的隊列數量默認爲1

--no-mac-updating

轉換後不替換MAC

配置OK1012A-C:

ifconfigeth0 192.168.1.200

tcpdump-i eth0 -vv -n -e

配置Linux Host:

ifconfigeth0 192.168.1.120

sudomodprobe pktgen.ko

echo"add_deviceeth0"> /proc/net/pktgen/kpktgend_0

echo"dst_mac6e:56:7d:85:ce:4d"> /proc/net/pktgen/eth0

echo"dst192.168.1.200">/proc/net/pktgen/eth0

echo"pkt_size64"> /proc/net/pktgen/eth0

echo"count1000000"> /proc/net/pktgen/eth0

echo"start"> /proc/net/pktgen/pgctrl

我們讓LinuxHost主機發送100萬個64字節大小的包出去,測試OK1043A-CDPDK對這些數據包的轉發能力。

攻城獅自述丨OK1043A-C DPDK環境體驗

通過查看OK1043A-C的串口打印信息,我們發現DPDK已經將所有收到的數據包完完全全的轉發了出去。同時細心的你會發現採用DPDK進行數據轉發時,CPU的負載一直居高不下,因爲它一直在應用層輪詢,查看是否有數據包需要處理。

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