lwip协议栈优化_干货分享 | KNI性能优化实践
友情提示:全文5000多文字,預(yù)計(jì)閱讀時(shí)間15分鐘
文章源自現(xiàn)網(wǎng)實(shí)踐對支撐及用戶態(tài)/內(nèi)核態(tài)網(wǎng)絡(luò)報(bào)文交換場景的認(rèn)識,歡迎有Linux/FreeBSD內(nèi)核、網(wǎng)絡(luò)協(xié)議棧、DPDK優(yōu)化實(shí)踐經(jīng)驗(yàn)的同學(xué)留言探討~
DPDK簡介
Intel DPDK全稱為Intel Date Plane Development Kit, Intel處理器架構(gòu)下用戶空間高效的數(shù)據(jù)包處理提供了庫函數(shù)和驅(qū)動(dòng)的支持,它不同于 Linux/FreeBSD等操作系統(tǒng)以通用性設(shè)計(jì)為目的,而是專注于網(wǎng)絡(luò)應(yīng)用中網(wǎng)絡(luò)報(bào)文的高性能處理。操作系統(tǒng)與DPDK應(yīng)用程序網(wǎng)絡(luò)處理如下圖所示:
Flow Bifurcation on Intel Ethernet Controller X710/XL710 --Jingjing Wu; Anjali
左側(cè)slowpath
在Linux/FreeBSD等操作系統(tǒng),網(wǎng)卡通過硬件中斷方式通知內(nèi)核驅(qū)動(dòng)有網(wǎng)絡(luò)報(bào)文到達(dá),內(nèi)核響應(yīng)硬件中斷處理,進(jìn)一步移交由網(wǎng)卡驅(qū)動(dòng)硬件中斷處理喚醒網(wǎng)卡驅(qū)動(dòng)收包例程(中斷上半部),內(nèi)核調(diào)度網(wǎng)卡驅(qū)動(dòng)收包例程執(zhí)行網(wǎng)絡(luò)報(bào)文接收處理(中斷下半部)。在經(jīng)由一系列的內(nèi)核網(wǎng)絡(luò)協(xié)議處理流程后,最終由位于用戶態(tài)的應(yīng)用程序處理網(wǎng)絡(luò)報(bào)文內(nèi)容,完成網(wǎng)絡(luò)報(bào)文接收過程
在整個(gè)網(wǎng)絡(luò)報(bào)文接收過程涉及一系列的軟硬件中斷搶占處理、內(nèi)存拷貝/缺頁異常處理、系統(tǒng)調(diào)用(用戶態(tài)/內(nèi)核上下文切換)、應(yīng)用程序進(jìn)程切換等CPU處理資源開銷,直接影響操作系統(tǒng)網(wǎng)絡(luò)報(bào)文的處理能力,進(jìn)而影響網(wǎng)絡(luò)性能。
右側(cè)fastpath
DPDK采用Kernel Bypass方式實(shí)現(xiàn), 在用戶空間實(shí)現(xiàn)了一套數(shù)據(jù)平面進(jìn)行網(wǎng)絡(luò)報(bào)文的收發(fā)與處理。DPDK應(yīng)用程序基于大頁內(nèi)存、核綁定、用戶態(tài)輪詢機(jī)制的驅(qū)動(dòng)實(shí)現(xiàn),通過重載網(wǎng)卡驅(qū)動(dòng)進(jìn)行網(wǎng)絡(luò)報(bào)文收發(fā),直接交由上層應(yīng)用程序處理。從而避免操作系統(tǒng)內(nèi)核/用戶態(tài)的網(wǎng)絡(luò)報(bào)文拷貝、線程調(diào)度、系統(tǒng)調(diào)用、中斷等CPU處理資源損耗,以達(dá)到DPDK應(yīng)用程序網(wǎng)絡(luò)處理高性能目的。對于操作系統(tǒng)而言,DPDK應(yīng)用程序只是一個(gè)普通的用戶態(tài)進(jìn)程,與普通應(yīng)用程序并無差別。
用戶態(tài)/內(nèi)核態(tài)交換網(wǎng)絡(luò)報(bào)文交換
在非SRIOV或虛擬機(jī)場景網(wǎng)卡被用戶態(tài)DPDK應(yīng)用程序接管,該網(wǎng)卡所有網(wǎng)絡(luò)報(bào)文將由用戶態(tài)的DPDK應(yīng)用程序接收處理。對于部分控制面、轉(zhuǎn)發(fā)面分離的高性能DPDK應(yīng)用實(shí)現(xiàn)中,存在采用fastpath、slowpath相結(jié)合進(jìn)行網(wǎng)絡(luò)報(bào)文收發(fā)處理場景,如DPDK+Nginx+Keepalive高可用場景, 如下圖所示:
DPDK+Nginx+Keepalive流量
基于DPDK用戶態(tài)TCP/IP協(xié)議棧與Nginx相結(jié)合,通過fastpath提供高性能HTTP應(yīng)用服務(wù)。Keepalive應(yīng)用程序沿用操作系統(tǒng)slowpath協(xié)議棧進(jìn)行網(wǎng)絡(luò)報(bào)文收發(fā)處理邏輯,通過VRRP協(xié)議提供DPDK+Nginx 高可用場景下的VIP主備切換控制。在用戶態(tài)/內(nèi)核態(tài)交換網(wǎng)絡(luò)報(bào)文交換場景,KNI是DPDK引入的實(shí)現(xiàn)方式之一。
KNI
KNI(Kernel NIC Interface)是DPDK用于用戶態(tài)與內(nèi)核態(tài)協(xié)議棧網(wǎng)絡(luò)報(bào)文交換的一種機(jī)制。其實(shí)現(xiàn)原理通過共享內(nèi)存方式實(shí)現(xiàn)用戶態(tài)DPDK應(yīng)用程序與內(nèi)核態(tài)網(wǎng)絡(luò)協(xié)議棧網(wǎng)絡(luò)報(bào)文傳遞, 采用注冊KNI虛擬網(wǎng)絡(luò)設(shè)備接口方式實(shí)現(xiàn)網(wǎng)絡(luò)報(bào)文收發(fā)以達(dá)到利用內(nèi)核協(xié)議棧,最終將網(wǎng)絡(luò)報(bào)文轉(zhuǎn)發(fā)至上層應(yīng)用程序的目的。如下圖所示:
Components of a DPDK KNI Application
KNI注冊的虛擬網(wǎng)絡(luò)設(shè)備接口兼容支持Linux網(wǎng)絡(luò)工具如ethtool、ifconfig 、tcpdump對網(wǎng)絡(luò)接口的配置管理。對內(nèi)核網(wǎng)絡(luò)協(xié)議棧而言,KNI虛擬網(wǎng)絡(luò)設(shè)備接口與普通網(wǎng)卡網(wǎng)絡(luò)設(shè)備接口進(jìn)行網(wǎng)絡(luò)報(bào)文收發(fā)處理類似。
KNI 實(shí)現(xiàn)用戶態(tài)/內(nèi)核態(tài)交換網(wǎng)絡(luò)報(bào)文交換由兩部分組成: 內(nèi)核態(tài)RTE_KNI模塊、用戶態(tài)KNI網(wǎng)絡(luò)報(bào)文收發(fā)接口, 如下圖所示:
Packet Flow via mbufs in the DPDK KNI
左側(cè)內(nèi)核態(tài)RTE_KNI模塊?
內(nèi)核態(tài)RTE_KNI模塊負(fù)責(zé)創(chuàng)建初始化KNI虛擬網(wǎng)絡(luò)設(shè)備操作接口與注冊網(wǎng)絡(luò)報(bào)文接收內(nèi)核線程實(shí)現(xiàn)網(wǎng)絡(luò)報(bào)文收發(fā)。
KNI網(wǎng)絡(luò)報(bào)文接收內(nèi)核線程負(fù)責(zé)從rx_q網(wǎng)絡(luò)報(bào)文接收隊(duì)列讀取網(wǎng)絡(luò)報(bào)文,移交內(nèi)核網(wǎng)絡(luò)協(xié)議棧入口netif_rx進(jìn)一步處理。
KNI虛擬網(wǎng)絡(luò)設(shè)備kni_net_tx接口負(fù)責(zé)處理來自內(nèi)核網(wǎng)絡(luò)協(xié)議棧的網(wǎng)絡(luò)報(bào)文發(fā)送請求,最終將網(wǎng)絡(luò)報(bào)文移交至tx_q,后續(xù)由用戶態(tài)DPDK應(yīng)用程序網(wǎng)絡(luò)報(bào)文發(fā)送線程處理,完成網(wǎng)絡(luò)報(bào)文發(fā)送。
KNI網(wǎng)絡(luò)報(bào)文接收內(nèi)核線程存在單線程、多線程兩種模式選擇,可在加載內(nèi)核模塊時(shí)指定。在未指定情況下默認(rèn)單線程模式,加載KNI內(nèi)核模塊設(shè)置線程模式如下:
insmod kmod/rte_kni.ko? kthread_mode=single或kthread_mode=multiple
單線程、多線程兩種模式主要區(qū)別在于:
單線程模式:KNI內(nèi)核模塊所有KNI虛擬網(wǎng)絡(luò)接口創(chuàng)建共享一個(gè)內(nèi)核線程進(jìn)行網(wǎng)絡(luò)報(bào)文接收處理。
多線程模式:KNI內(nèi)核模塊為每個(gè)KNI虛擬網(wǎng)絡(luò)接口創(chuàng)建單獨(dú)一個(gè)內(nèi)核線程進(jìn)行網(wǎng)絡(luò)報(bào)文接收處理。在多個(gè)KNI虛擬網(wǎng)絡(luò)接口場景建議采用多線程模式,以提高單個(gè)KNI虛擬網(wǎng)絡(luò)設(shè)備網(wǎng)絡(luò)接收性能。
右側(cè)用戶態(tài)KNI網(wǎng)絡(luò)報(bào)文收發(fā)接口
用戶態(tài)KNI網(wǎng)絡(luò)報(bào)文收發(fā)主要涉及兩個(gè)接口:
rte_kni_tx_burst接口:在用戶態(tài)DPDK應(yīng)用程序網(wǎng)絡(luò)報(bào)文接收處理線程通過rte_eth_rx_burst接口從網(wǎng)卡完成網(wǎng)絡(luò)報(bào)文讀取后,負(fù)責(zé)將需移交至內(nèi)核態(tài)的網(wǎng)絡(luò)報(bào)文添加至rx_q網(wǎng)絡(luò)報(bào)文接收隊(duì)列,后續(xù)由內(nèi)核態(tài)KNI網(wǎng)絡(luò)報(bào)文接收線程處理。
rte_kni_rx_burst接口:在用戶態(tài)DPDK應(yīng)用程序網(wǎng)絡(luò)報(bào)文發(fā)送處理線程負(fù)責(zé)讀取tx_q網(wǎng)絡(luò)報(bào)文發(fā)送隊(duì)列中待發(fā)送網(wǎng)絡(luò)報(bào)文,通過rte_eth_tx_burst網(wǎng)卡發(fā)送接口將網(wǎng)絡(luò)報(bào)文發(fā)送。
遇到的問題
現(xiàn)網(wǎng)環(huán)境虛擬化計(jì)算節(jié)點(diǎn)復(fù)用一對業(yè)務(wù)萬兆光口來承載兩種流量:1)overlay虛擬機(jī)流量 2)underlay塊存儲(chǔ)流量。DPDK-OVS接管業(yè)務(wù)萬兆光口后,通過DPDK KNI注冊虛擬化計(jì)算節(jié)點(diǎn)存儲(chǔ)虛擬網(wǎng)絡(luò)接口,實(shí)現(xiàn)虛擬化計(jì)算節(jié)點(diǎn)通過存儲(chǔ)虛擬網(wǎng)絡(luò)接口訪問塊存儲(chǔ)。在虛擬機(jī)內(nèi)部讀寫塊設(shè)備,虛擬化計(jì)算節(jié)點(diǎn)KNI虛擬網(wǎng)絡(luò)設(shè)備存儲(chǔ)網(wǎng)絡(luò)接口統(tǒng)計(jì)計(jì)數(shù)出現(xiàn)大量TX dropped。
KNI虛擬網(wǎng)絡(luò)設(shè)備內(nèi)核態(tài)網(wǎng)絡(luò)報(bào)文發(fā)送接口kni_net_tx處理過程簡述如下:
檢查網(wǎng)絡(luò)報(bào)文長度及alloc_q/tx_q無可用共享內(nèi)存緩存,否則釋放內(nèi)核態(tài)網(wǎng)絡(luò)報(bào)文skb即跳轉(zhuǎn)至drop丟包處理,并更新KNI虛擬網(wǎng)絡(luò)設(shè)備TX dropped統(tǒng)計(jì)信息。
從alloc_q隊(duì)列獲取用戶態(tài) mbuf網(wǎng)絡(luò)報(bào)文緩存,通過內(nèi)存物理地址/虛擬地址轉(zhuǎn)換后完成skb至 mbuf 網(wǎng)絡(luò)報(bào)文內(nèi)容復(fù)制,最終將mbuf添加至tx_q,移交由用戶態(tài)DPDK應(yīng)用網(wǎng)絡(luò)報(bào)文發(fā)送線程處理,并釋放內(nèi)核態(tài)網(wǎng)絡(luò)報(bào)文skb。
初步分析與alloc_q/tx_q無可用共享內(nèi)存緩存有關(guān)。具體源碼實(shí)現(xiàn)請查閱:dpdk/kernel/linux/kni/kni_net.c ?KNI虛擬網(wǎng)絡(luò)設(shè)備網(wǎng)絡(luò)報(bào)文發(fā)送kni_net_tx接口。
問題模擬復(fù)現(xiàn)
通過DPDK examples/kni例子,模擬現(xiàn)網(wǎng)KNI網(wǎng)絡(luò)報(bào)文轉(zhuǎn)發(fā)處理過程。簡述如下:
在完成大頁內(nèi)存設(shè)置/核隔離/網(wǎng)卡綁定等DPDK初始化環(huán)境后,啟動(dòng)DPDK KNI
/root/dpdk-19.08/examples/kni/x86_64-native-linuxapp-gcc/kni -l 0-2 -- -P -p 0x1 --config="(0,1,2,0)"
參數(shù)說明:
-l? 指定DPDK EAL lcore參數(shù)即邏輯CPU ID或掩碼
-p 指定DPDK port
--config 指定參數(shù)(port,lcore_rx,lcore_tx,lcore_kthread)涉及port、KNI網(wǎng)絡(luò)報(bào)文接收線程CPU ID、KNI網(wǎng)絡(luò)報(bào)文發(fā)送線程CPU ID、內(nèi)核KNI網(wǎng)絡(luò)報(bào)文接收線程綁定CPU ID
詳細(xì)請參見: DPDK Sample Applications User Guides Release 19.08 ?Kernel NIC Interface Sample Application小節(jié)
配置KNI虛擬網(wǎng)絡(luò)設(shè)備地址:
ifconfig vEth0_0 ?*.*.*.*??netmask *.*.*.*? up
查看用戶態(tài)KNI網(wǎng)絡(luò)報(bào)文收發(fā)統(tǒng)計(jì)計(jì)數(shù):
kill -SIGUSR1 8072
客戶端通過KNI虛擬網(wǎng)絡(luò)設(shè)備網(wǎng)口運(yùn)行iperf模擬內(nèi)核態(tài)/用戶態(tài)轉(zhuǎn)發(fā)流量:
iperf3 -c *.*.*.*? -t 10
服務(wù)端運(yùn)行iperf接收
iperf3 –s
查看用戶態(tài)KNI網(wǎng)絡(luò)報(bào)文收發(fā)統(tǒng)計(jì)計(jì)數(shù),無丟包統(tǒng)計(jì)
查看內(nèi)核態(tài)KNI網(wǎng)絡(luò)設(shè)備統(tǒng)計(jì)計(jì)數(shù)出現(xiàn)TX dropped
Iperf服務(wù)端接收速率在33.4Mb/s, 因KNI虛擬網(wǎng)絡(luò)設(shè)備丟包導(dǎo)致網(wǎng)絡(luò)性能較差。
改進(jìn)思路
1)DPDK KNI alloc_q mbuf緩存參數(shù)調(diào)整
通過對問題模擬復(fù)現(xiàn)基本確定內(nèi)核態(tài)的RTE_KNI模塊kni_net_tx 在發(fā)送網(wǎng)絡(luò)報(bào)文時(shí)因kni_fifo_count(kni->alloc_q) == 0觸發(fā)丟包處理邏輯,導(dǎo)致TCP報(bào)文重傳間接影響網(wǎng)絡(luò)性能。
DPDK KNI用戶態(tài)在對alloc_q 填充在初始化階段由rte_kni_alloc調(diào)用kni_allocate_mbufs進(jìn)行初始化填充。運(yùn)行時(shí)由用戶態(tài)DPDK應(yīng)用程序網(wǎng)絡(luò)報(bào)文發(fā)送處理線程調(diào)用rte_kni_rx_burst從tx_q獲取待發(fā)送網(wǎng)絡(luò)報(bào)文后回調(diào)kni_allocate_mbufs進(jìn)行alloc_q 回填操作,以確保內(nèi)核態(tài)kni_net_tx在網(wǎng)絡(luò)報(bào)文發(fā)送時(shí)存在可用的mbuf進(jìn)行網(wǎng)絡(luò)報(bào)文內(nèi)容復(fù)制傳遞至用戶態(tài)處理。在kni_allocate_mbufs在極端情況下以申請MAX_MBUF_BURST_NUM數(shù)量mbuf回填alloc_q。
在調(diào)整MAX_MBUF_BURST_NUM后重新編譯DPDK KNI驗(yàn)證,如下:
客戶端通過KNI虛擬網(wǎng)絡(luò)設(shè)備網(wǎng)口運(yùn)行iperf模擬內(nèi)核態(tài)/用戶態(tài)轉(zhuǎn)發(fā)流量:
iperf3 -c *.*.*.*?-t 10
服務(wù)端運(yùn)行iperf接收
iperf3 –s
查看用戶態(tài)KNI網(wǎng)絡(luò)報(bào)文收發(fā)統(tǒng)計(jì)計(jì)數(shù):
kill -SIGUSR1 8072
查看內(nèi)核態(tài)KNI網(wǎng)絡(luò)設(shè)備統(tǒng)計(jì)計(jì)數(shù)無TX dropped
Iperf服務(wù)端接收速率在652Mb/s相對未調(diào)整前的33.4Mb/s, iperf吞吐接近20倍的差距。
2) KNI虛擬網(wǎng)絡(luò)設(shè)備內(nèi)核網(wǎng)絡(luò)報(bào)文接收線程、KNI用戶態(tài)進(jìn)程、iperf進(jìn)程核分離
KNI虛擬網(wǎng)絡(luò)設(shè)備內(nèi)核網(wǎng)絡(luò)報(bào)文接收線程、KNI用戶態(tài)進(jìn)程、iperf進(jìn)程核分離主要是驗(yàn)證上述KNI內(nèi)核態(tài)/用戶態(tài)網(wǎng)絡(luò)報(bào)文交換吞吐是否存在改善空間及進(jìn)程切換對網(wǎng)絡(luò)吞吐性能的影響。
通過【pidstate –t –p 進(jìn)程ID 1】采樣,查看KNI虛擬網(wǎng)絡(luò)設(shè)備內(nèi)核網(wǎng)絡(luò)報(bào)文接收線程、KNI用戶態(tài)進(jìn)程、iperf進(jìn)程CPU運(yùn)行狀態(tài)及占用率:
KNI虛擬網(wǎng)絡(luò)設(shè)備內(nèi)核網(wǎng)絡(luò)報(bào)文接收線程、KNI用戶態(tài)進(jìn)程、iperf進(jìn)程均在爭取CPU0處理器資源【注:模擬環(huán)境虛擬機(jī)CPU0~CPU3,其中CPU1,CPU2己進(jìn)行核隔離用于用戶態(tài)DPDK/KNI收發(fā)線程】。
taskset –pc 3 52722將用戶態(tài)DPDK/KNI master lcore調(diào)整至CPU3,避免其與KNI虛擬網(wǎng)絡(luò)設(shè)備內(nèi)核網(wǎng)絡(luò)報(bào)文接收線程、iperf進(jìn)程爭取CPU0處理器資源。
客戶端通過KNI虛擬網(wǎng)絡(luò)設(shè)備網(wǎng)口運(yùn)行iperf模擬內(nèi)核態(tài)/用戶態(tài)轉(zhuǎn)發(fā)流量:
iperf3 -c *.*.*.*? -t 10
服務(wù)端運(yùn)行iperf接收
iperf3 –s
Iperf服務(wù)端接收速率在1.23Gb/s。從未調(diào)整前的33.4Mb/s至1.23Gb/s或許仍有進(jìn)一步改進(jìn)的空間,有待嘗試驗(yàn)證。
后續(xù)
后續(xù)改進(jìn)涉及底層處理邏輯修改及相關(guān)功能實(shí)現(xiàn)優(yōu)化,改進(jìn)思路簡述如下:
1)DPDK KNI虛擬網(wǎng)絡(luò)設(shè)備引入多隊(duì)列多收包線程
DPDK KNI虛擬網(wǎng)絡(luò)設(shè)備用戶態(tài)與內(nèi)核態(tài)網(wǎng)絡(luò)報(bào)文傳遞采用單FIFO共享隊(duì)列實(shí)現(xiàn),針對不同場景可考慮多FIFO共享隊(duì)列與多收包線程方式,充分利用多核CPU資源以達(dá)到優(yōu)化改善網(wǎng)絡(luò)吞吐性能的目的。
2)DPDK網(wǎng)卡特性透穿至KNI虛擬網(wǎng)絡(luò)設(shè)備
現(xiàn)網(wǎng)采用DPDK-OVS VHOST-USER與Qemu協(xié)商實(shí)現(xiàn)網(wǎng)卡特性透傳至虛擬機(jī)網(wǎng)卡涉及如:TSO、UFO、GSO、CheckSum Offload等。利用網(wǎng)卡特性釋放虛擬機(jī)在處理網(wǎng)絡(luò)報(bào)文時(shí)的CPU處理資源消耗,達(dá)到提高虛擬機(jī)網(wǎng)絡(luò)吞吐性能的目的,并進(jìn)一步優(yōu)化DPDK-OVS KNI處理轉(zhuǎn)發(fā)效率。對于DPDK KNI虛擬網(wǎng)絡(luò)設(shè)備可借鑒該實(shí)現(xiàn)原理,提高KNI內(nèi)核態(tài)與用戶態(tài)網(wǎng)絡(luò)報(bào)文交換網(wǎng)絡(luò)轉(zhuǎn)發(fā)性能。
3)其它改進(jìn)措施待研究,歡迎提供參考建議
上述均在虛擬機(jī)環(huán)境進(jìn)行模擬驗(yàn)證,涉及環(huán)境變更可能存在偏差,改進(jìn)思路僅供參考。
參考說明
DPDK之PMD原理
https://cloud.tencent.com/developer/article/1411982
絕對干貨!初學(xué)者也能看懂的DPDK解析
https://www.cnblogs.com/qcloud1001/p/9585724.html
DPDK之KNI原理
https://cloud.tencent.com/developer/article/1418603
DPDK內(nèi)核模塊KNI
http://www.freesion.com/article/148821991/
《DPDK Programmer's Guide Release 19.08》
《DPDK Sample Applications User Guides Release 19.08》
《Flow Bifurcation on Intel Ethernet Controller X710/XL710 --Jingjing Wu; Anjali Singhai》
-End:)
往期精選
1、干貨分享 | 基于RocketMQ構(gòu)建MQTT集群系列(1)—從MQTT協(xié)議和MQTT集群架構(gòu)說起
2、干貨分享 | 虛擬化性能提升之本地?zé)徇w移
3、干貨分享 | 時(shí)序數(shù)據(jù)庫Graphite在BC-DeepWatch中的設(shè)計(jì)與使用
總結(jié)
以上是生活随笔為你收集整理的lwip协议栈优化_干货分享 | KNI性能优化实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue进行判断使用class_vue如何
- 下一篇: linux 可执行文件_linux中EL