使用dpdk測試平臺轉發效能
引言
Intel新的SKYLAKE微處理架構自15年釋出至今,已經相對成熟可以進入商用階段,最近很多供貨商也都在積極推廣;公司之前用的主要都是Sandy bridge架構,18年據說也要停產了,所以需要考慮升級相關事宜。從供貨商那邊選了兩款樣機,準備詳細測試下網路效能,是否有針對之前架構有效能提升,及提升效能能到多少。
本文主要記錄下測試方法,以及測試過程中遇到的問題和解決步驟,具體的測試對比結果只在內部開放,請諒解。
理論知識
Intel Skylake是英特爾第六代微處理器架構,採用14納米制程,是Intel Haswell微架構及其製程改進版Intel Broadwell微架構的繼任者, 提供更高的CPU和GPU效能並有效減少電源消耗。
主要特性包括:
- 14納米制程,6th Gen processor
- 同時支援DDR3L和DDR4-SDRAM兩種記憶體規格,最高支援64GB;
- PCIE支援3.0,速度最高支援8GT/s;
- 去掉了Haswell引入的FIVR,使用分離的PCH,DMI3.0
測試拓撲及環境準備
專案 | 描述 |
---|---|
作業系統 | linux,核心2.6.X (影響不大) |
CPU | Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz |
記憶體 | 32GB |
網絡卡晶片 | intel x710,4口10G |
dpdk版本 | dpdk-16.04 |
測試程式 | l2fwd,l3fwd |
測試套件 | Spirent RFC 2544套件 |
使用dpdk sample程式前需要做一些初始化動作,載入對應的module、驅動,配置對應的大頁記憶體等,寫了個初始化指令碼如下:
#!/bin/bash
mount -t hugetlbfs nodev /mnt/huge
#set hugepage memory
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
#add kernel module
modprobe uio
insmod /root/dpdk-16.04 /x86_64-native-linuxapp-gcc/kmod/igb_uio.ko
#down interfaces to disable routes
#ifconfig eth0 down
#display netcard driver before bind
/root/dpdk-16.04/tools/dpdk_nic_bind.py -s
#bind driver
/root/dpdk-16.04/tools/dpdk_nic_bind.py -b igb_uio 0000:01:00.0
/root/dpdk-16.04/tools/dpdk_nic_bind.py -b igb_uio 0000:01:00.1
/root/dpdk-16.04/tools/dpdk_nic_bind.py -b igb_uio 0000:01:00.2
/root/dpdk-16.04/tools/dpdk_nic_bind.py -b igb_uio 0000:01:00.3
#display netcard driver after bind
/root/dpdk-16.04/tools/dpdk_nic_bind.py -s
具體的測試拓撲如下:
測試過程及問題解決
由於dpdk的sample執行時需要手動繫結埠和CPU核的關係,所以在執行前最好能瞭解當前的核分佈情況:
root>python cpu_layout.py
============================================================
Core and Socket Information (as reported by '/proc/cpuinfo')
============================================================
cores = [0, 1, 2, 3]
sockets = [0]
Socket 0
--------
Core 0 [0, 4]
Core 1 [1, 5]
Core 2 [2, 6]
Core 3 [3, 7]
可以看出cpu有一個物理核,4個邏輯核,已經開啟了超執行緒。
一個口自收自發
先測試最簡單的情況,一個口自收自發,看能否達到線速。
- 使用l2fwd測試,1口1佇列
l2fwd -c0xf -n4 -- -p0x1
測試結果(兩組資料,後面的效果更好但沒測全,但都無法達到線速):
- 使用l2fwd測試,1口4佇列(標準的l2fwd不支援,需要修改程式碼支援)
l2fwd -c0xf -n4 -- -p0x1 -q4
測試結果:
理論上應該還能提升的,待進一步優化。
- 使用l3fwd測試,1口1佇列
命令如下:
l3fwd -l 0 -n4 -- -p1 -P --config="(0,0,0)"
測試結果:
- 使用l3fwd測試,1口2佇列
命令如下:
./l3fwd -l 0,1 -n4 -- -p1 -P --config="(0,0,0)(0,1,1)"
使用lcore 0,1, 埠1兩個佇列,每個佇列繫結一個lcore
測試結果:
結論:效能瓶頸和每個埠上的佇列有關係,和CPU基本沒關係。當使用l3fwd測試時,小包可以達到限速。使用l2fwd測試時,標準版本效果不是特別滿意,估計還是l2fwd的單佇列和轉發模型太過簡單。
兩個口互相轉發
接著測試兩個口互相轉發,看能否限速轉發。
直接測試最優的情況,使用l3fwd每個埠2佇列
./l3fwd -l 0,1,2,3 -n4 -- -p0xf -P --config="(0,0,0)(0,1,1)(1,0,2)(1,1,3)"
測試結果:
在這個測試過程中遇到一個問題,兩個完全相同的平臺,一個平臺64位元組可以線速轉發,另外一個只能到9%左右,如下圖:
排查思路:
1. 首先確定介面繫結是否正確,測試的軟體版本等是否一致。
2. 檢視網絡卡晶片的引數,確保使用PCI3 Gen3 x8 or Gen3 x16
lspci -s 01:00.1 -vv | grep LnkSta
LnkSta: Speed 8GT/s, Width x4, TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-
LnkSta2: Current De-emphasis Level: -6dB, EqualizationComplete-,
本次排查過程中發現出問題的網絡卡width引數為x4, 正常的網絡卡引數為x8. 這塊需要重點跟蹤下,x4的通道直接就減半了,通過和廠家溝通主機板上拉出的通道是支援x8的,可能的原因是網絡卡金手指上貼了膠帶,經過排查果然如此,之前測試x4的插槽時,做了相關動作。
3. 網絡卡引數正常後,發現測試結果仍然無法達到另外一個平臺測試的理想結果,此時可以檢視l3fwd的啟動日誌,看看網口啟動選擇rx和tx函式是否一致:
發現正常的平臺log資訊如下:
Initializing rx queues on lcore 4 ... rxq=1,1,0 PMD: check_rx_burst_bulk_alloc_preconditions(): Rx Burst Bulk Alloc Preconditions: rxq->nb_rx_desc=4096, I40E_MAX_RING_DESC=4096, RTE_PMD_I40E_RX_MAX_BURST=32
PMD: check_rx_burst_bulk_alloc_preconditions(): Rx Burst Bulk Alloc Preconditions: rxq->nb_rx_desc=4096, I40E_MAX_RING_DESC=4096, RTE_PMD_I40E_RX_MAX_BURST=32
PMD: i40e_dev_rx_queue_setup(): Rx Burst Bulk Alloc Preconditions are not satisfied, Scattered Rx is requested, or RTE_LIBRTE_I40E_RX_ALLOW_BULK_ALLOC is not enabled on port=1, queue=1.
PMD: i40e_set_tx_function(): Vector tx finally be used.
PMD: i40e_pf_config_rss(): Max of contiguous 2 PF queues are configured
PMD: i40e_set_rx_function(): Port[0] doesn't meet Vector Rx preconditions
PMD: i40e_set_rx_function(): Rx Burst Bulk Alloc Preconditions are not satisfied, or Scattered Rx is requested (port=0).
PMD: i40e_set_tx_function(): Vector tx finally be used.
PMD: i40e_pf_config_rss(): Max of contiguous 2 PF queues are configured
PMD: i40e_set_rx_function(): Port[1] doesn't meet Vector Rx preconditions
PMD: i40e_set_rx_function(): Rx Burst Bulk Alloc Preconditions are not satisfied, or Scattered Rx is requested (port=1).
而異常的平臺log資訊如下:
Initializing rx queues on lcore 0 ... rxq=0,0,0 PMD: i40e_dev_rx_queue_setup(): Rx Burst Bulk Alloc Preconditions are satisfied. Rx Burst Bulk Alloc function will be used on port=0, queue=0.
Initializing rx queues on lcore 1 ... rxq=0,1,0 PMD: i40e_dev_rx_queue_setup(): Rx Burst Bulk Alloc Preconditions are satisfied. Rx Burst Bulk Alloc function will be used on port=0, queue=1.
Initializing rx queues on lcore 2 ... rxq=1,0,0 PMD: i40e_dev_rx_queue_setup(): Rx Burst Bulk Alloc Preconditions are satisfied. Rx Burst Bulk Alloc function will be used on port=1, queue=0.
Initializing rx queues on lcore 3 ... rxq=1,1,0 PMD: i40e_dev_rx_queue_setup(): Rx Burst Bulk Alloc Preconditions are satisfied. Rx Burst Bulk Alloc function will be used on port=1, queue=1.
PMD: i40e_set_tx_function(): Vector tx finally be used.
PMD: i40e_pf_config_rss(): Max of contiguous 2 PF queues are configured
PMD: i40e_set_rx_function(): Port[0] doesn't meet Vector Rx preconditions
PMD: i40e_set_rx_function(): Rx Burst Bulk Alloc Preconditions are satisfied. Rx Burst Bulk Alloc function will be used on port=0.
PMD: i40e_set_tx_function(): Vector tx finally be used.
PMD: i40e_pf_config_rss(): Max of contiguous 2 PF queues are configured
PMD: i40e_set_rx_function(): Port[1] doesn't meet Vector Rx preconditions
PMD: i40e_set_rx_function(): Rx Burst Bulk Alloc Preconditions are satisfied. Rx Burst Bulk Alloc function will be used on port=1.
可以看出應該是nb_rx_desc 和 nb_tx_desc的設定不一樣導致的rx模式選擇不一樣,正常的選擇的是rx_recv_pkts,異常的選擇的是i40e_recv_pkts_bulk_alloc。現修改成一致的,測試通過。
結論:2埠互相轉發,64位元組也能達到線速轉發;存疑點:Burst模式應該是優於普通模式的,但實際的測試結果卻不是,應該有優化選項沒設定對,後續還要跟蹤下。
四個口互相轉發
接著測試四口相互轉發,重點關注小包是否能夠線速
測試命令:
1. 每個口一個佇列,一個核:
./l3fwd -l 0,1,2,3 -n4 -- -p0xf -P --config="(0,0,0)(1,0,1)(2,0,2)(3,0,3)"
測試結果:
兩個平臺測試引數略有差異,最高也就到53%~55%左右。
2. 使用超執行緒,每個口兩個佇列,每個佇列一個核
l3fwd -l 0,1,2,3,4,5,6,7 -n4 -- -p0xf -P --config="(0,0,0)(0,1,1)(1,0,2)(1,1,3)(2,0,4)(2,1,5)(3,0,6)(3,1,7)"
測試結果:
- 使用超執行緒,每個口兩個佇列,每個口一個核
./l3fwd -l 0,1,2,3,4,5,6,7 -n4 -- -p0xf -P --config="(0,0,0)(0,1,0)(1,0,1)(1,1,1)(2,0,2)(2,1,2)(3,0,3)(3,1,3)"
測試結果:
而此時cpu的利用情況如下:
結論:4個口小包無法達到線速轉發,此時CPU已經滿負載(瓶頸所在),256位元組之後可以。另外,發現開啟超執行緒對效能沒有太大提升,如果核的分配出現競爭的情況(如最後一次測試),效能反而會下降。
總結
以上是完整的測試過程,以及測試過程中遇到和解決問題的思路,希望能對大家有益。 關於l2fwd測試的效率低下這塊,後續還會再修改程式碼繼續研究,如果有成果,再和大家分享。
備註
csdn的markdown編輯器中關於有序列表部分真的讓人頭痛,copy過來還得重新編輯還不一定好使,大家湊合看吧。
相關推薦
使用dpdk測試平臺轉發效能
引言 Intel新的SKYLAKE微處理架構自15年釋出至今,已經相對成熟可以進入商用階段,最近很多供貨商也都在積極推廣;公司之前用的主要都是Sandy bridge架構,18年據說也要停產了,所以需要考慮升級相關事宜。從供貨商那邊選了兩款樣機,準備詳細測試下
Vmware搭建DPDK測試平臺
虛擬機器硬體配置:CPU: 4Core記憶體: 4G關機狀態下新增兩塊網絡卡 修改虛擬機器配置:修改檔案:DPDK-FWD.vmxhpet0.present = "true"numa.vcpu.maxPerVirtualNode = "1" ethernet1.virtualDev = "vmxnet3"
關於DPDK三層轉發的相關例子測試需註意的地方
DPDK 三層轉發 l3fwd lpm 在DPDK的l3fwd中,需要註意在LPM(Long Prefix Match)方式下,路由表的默認配置一般讓你無法測試,如果需要轉發所有包到第0號Port,則可以按如下方式設置: static struct ipv4_l3fwd_lpm_rout
結合jenkins以及PTP平臺的效能迴歸測試
此文已由作者餘笑天授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。 1背景簡介 1.1 jenkins Jenkins是一個用Java編寫的開源的持續整合工具。在與Oracle發生爭執後,專案從Hudson專案復刻。Jenkins提供了軟體開發的持續整合服務。它執行在Servlet容
淘寶效能自動化測試平臺搭建過程
導讀 ID:TOP100case 淘寶網的效能測試自動化平臺具備了分散式、高併發、低成本、可擴充套件等特性的效能測試平臺工具,它包括效能專案管理、環境管理、指令碼管理、場景管理、任務管理、監控管理、結果管理等模組,以及前端效能測試模組、效能測試報告模組、效能缺陷模組、和效能基線模組等,後臺還有完善
使用DPDK l3fwd測試硬體吞吐效能
作業系統版本:centOS6.4 DPDK版本:2.2.0 硬體裝置:某硬體廠商,四顆物理CPU,16個萬兆光口。 一:編譯l3fwd 官網下載dpdk-2.2.0.tar.gz,解壓 tar xvf dpdk-2.2.0.tar.gz 進入DPDK目錄,cd dpdk-2.2.
從0到1:打造移動端H5效能測試平臺
如何打造一個移動端H5效能平臺?聽起來是否有點高大上,不知道如何下手。不要緊張,我們來手把手教大家打造自己的移動端H5效能測試平臺。 【H5前端效能平臺可以做什麼–功能篇】 以前我們要測試移動端H5效能,通常會用到遠端連線+抓包分析,工具諸如:fiddl
聊聊效能測試平臺
1. 背景 在剛過去的2020年,我司的全鏈路壓測平臺已成功落地。今天呢,寶路就來聊聊自己對效能測試平臺設計的一些想法與思考! 2. 平臺思維導 2.1 需求工作流 工作流確保了測試按約定步驟推進,同時讓工作的透明度和可再現性。我們工作中常用的有JIRA、TAPD等。平臺是完全可以與之進
c語言中fflush的運用為什麽沒有效果呢,測試平臺linux
*** file 語言 stdlib.h clu author 年齡 blog name 1 /************************************************************************* 2 > F
VMware + JunOS + Linux 搭建安全測試平臺
vmware 眾所周知VMareWorkStion 是一個強大的桌面型的虛擬化軟件,比較可以建立Windows虛擬機、Linux虛擬機、甚至各網絡操作系統,比如CISCO ASA 、Juniper SRX等。並且可以利用VMWare自身的虛擬網卡host建立不同網段來組建測試平臺。下文就是就是在 VMWa
[持續交付實踐] 安全掃描自動化測試平臺實現
top jenkins 風險 security 直接 實施 job 模糊 app 前言 TesterHome有人專門加了我QQ問安全測試這個話題,所以這篇準備先聊聊持續交付中的安全測試。現在信息安全已經上升到了國家戰略的高度,特別是今年《中華人民共和國網絡安全法》頒布後,用
接口測試的另一種方式 – 接口測試平臺
please bst log nginx ont sch 大致 安裝模塊 c-c 接口測試的另一種方式 – 接口測試平臺 文章目錄[顯示] 搭建的初衷 現狀 目前,基於我們組所需要測試的點,很大一部分都是跟接口相關的,不管是我們系統內部的接口還是第三方(外部系統)的接
[原創]淺談互聯網金融接口測試平臺搭建
pos body 如果 角度 難解 金字塔 協議 當前 hive [原創]淺談互聯網金融接口測試平臺搭建 接口測試我想各位做測試都不陌生,尤其是在現在分層測試思想倡導下,接口測試可以說是互聯網行業必備的測試技能之一,我以前的博文也有講過類似的內容,要想了解可以移駕到以
基於python自動化測試平臺與虛擬化技術結合的思考
主力 根據 測試 導致 文件掛載 配置 存在 自動化 作用 背景: 自動化測試行業內,個人覺得主力語言是python、java。這裏討論下基於python自動化框架設計與case開發,用過python的都知道它的好處,但是根據實際項目需要有了很多迎面而來的困難--主機遷
Jenkins+Ant+Jmeter自動化測試平臺
java開發 描述 軟件 htm jenkin .org 自動化 OS org 持續集成 持續集成是一種軟件開發實踐,即團隊開發成員經常集成他們的工作,通常每個成員每天至少集成一次,也就意味著每天可能會發生多次集成。每次集成都通過
搭建DVWA滲透測試平臺
XMAPP DVWA 前言:由於工作需要,需要搭建一個滲透測試的平臺用於WAF產品的測試,今天使用XMAPP及DVWA在linux上搭建了一個用於安全測試的靶機,本日記用於記錄操作過程以及遇到的問題。DVWA的介紹可以參考下面的DVWA下載鏈接。一、環境操作系統:CentOS release 6.9
國外搭建的公開漏洞測試平臺
國外搭建的公開漏洞測試平臺http://www.vulnweb.com/ 上面有針對asp、php、aspx等的sql註入漏洞等測試感興趣的朋友,可以用這個來實際練習一下。# Awesome Vulnerable Web Applications |Name
Mininet(輕量級軟件定義網絡和測試平臺) 之一
mininet#Mininet -1 基本環境: parallels@parallels-vm:~$ uname -r 4.13.0-43-generic parallels@parallels-vm:~$ uname -a Linux parallels-vm 4.13.0-43-generic #48~
Mininet(輕量級軟件定義網絡和測試平臺) 之二
mininetMininet-2 進行回歸測試 mn --test 透過 --test可以對建立的拓樸進行測試 pingpair則可以測試主機之間連線是否正常(Ping between first two hosts, useful for testing) root@parallels-vm:~# mn
Mininet(輕量級軟件定義網絡和測試平臺) 之三
mininet ip_forward mininet-3 所需安裝套件:sudo apt-get install bridge utils 基本指令: brctl addbr br0 新增bridge(brctl = bridge control) brctl addif br