Linux內(nèi)核網(wǎng)絡(luò)性能優(yōu)化
Linux內(nèi)核網(wǎng)絡(luò)性能優(yōu)化
本篇文章轉(zhuǎn)自Linux內(nèi)核之旅
作者: 梁金榮
原文: http://kerneltravel.net/blog/2021/ljr_network17/
前言
Linux網(wǎng)絡(luò)協(xié)議棧
sk_buff 結(jié)構(gòu)體來傳遞。網(wǎng)絡(luò)套接字是用 sock 結(jié)構(gòu)體來定義的,該結(jié)構(gòu)體在各網(wǎng)絡(luò)協(xié)議結(jié)構(gòu)體的開頭部分存放,例如 tcp_sock。網(wǎng)絡(luò)協(xié)議使用 proto 結(jié)構(gòu)體掛載到網(wǎng)絡(luò)套接字結(jié)構(gòu)體上,例如 tcp_prot、udp_prot 等,該結(jié)構(gòu)體中定義了一系列該網(wǎng)絡(luò)協(xié)議需要的回調(diào)函數(shù),包括 connect、sendmsg、recvmsg 等。
以接收數(shù)據(jù)包為例,可以概括為:
?加載網(wǎng)卡驅(qū)動,初始化?數(shù)據(jù)包從外部網(wǎng)絡(luò)進(jìn)入網(wǎng)卡?網(wǎng)卡(通過DMA)將包拷貝到內(nèi)核內(nèi)存中的 ring buffer?產(chǎn)生硬件中斷,通知系統(tǒng)收到了一個包?驅(qū)動調(diào)用 NAPI ,如果輪詢(poll)還沒有開始,就開始輪詢?ksoftirqd 軟中斷調(diào)用 NAPI 的 poll 函數(shù)從 ring buffer 收包(poll 函數(shù)是網(wǎng)卡驅(qū)動在初始化階段注冊的;每個cpu上都運(yùn)行著一個 ksoftirqd 進(jìn)程,在系統(tǒng)啟動期間就注冊了)?ring buffer 里面對應(yīng)的內(nèi)存區(qū)域解除映射(unmapped)?如果 packet steering 功能打開,或者網(wǎng)卡有多隊(duì)列,網(wǎng)卡收到的數(shù)據(jù)包會被分發(fā)到多個cpu?數(shù)據(jù)包從隊(duì)列進(jìn)入?yún)f(xié)議層?協(xié)議層處理數(shù)據(jù)包?數(shù)據(jù)包從協(xié)議層進(jìn)入相應(yīng) socket 的接收隊(duì)列?應(yīng)用程序從 socket 拿到數(shù)據(jù)包
DPDK

XDP
eXpress Data Path)為Linux內(nèi)核提供了高性能、可編程的網(wǎng)絡(luò)數(shù)據(jù)路徑。XDP使用網(wǎng)卡驅(qū)動程序中內(nèi)置的BPF鉤子直接訪問原始網(wǎng)絡(luò)幀數(shù)據(jù),直接告訴網(wǎng)卡應(yīng)該傳遞還是丟棄數(shù)據(jù)包,避免了TCP/IP協(xié)議棧處理的額外消耗。因?yàn)榫W(wǎng)絡(luò)包在未進(jìn)入網(wǎng)絡(luò)協(xié)議棧之前就處理,所以它給Linux網(wǎng)絡(luò)帶來了巨大的性能提升(性能比DPDK還要高)。
XDP主要的特性
?在網(wǎng)絡(luò)協(xié)議棧前處理?無鎖設(shè)計(jì)?批量I/O操作?輪詢式?直接隊(duì)列訪問?不需要分配skbuff?支持網(wǎng)絡(luò)卸載?DDIO?XDP程序快速執(zhí)行并結(jié)束,沒有循環(huán)?Packeting steering
XDP與DPDK的對比
優(yōu)點(diǎn):
?無需第三方代碼庫和許可?同時支持輪詢式和中斷式網(wǎng)絡(luò)?無需分配大頁?無需專用的CPU?無需定義新的安全網(wǎng)絡(luò)模型?可以回退到正常網(wǎng)絡(luò)棧處理過程
缺點(diǎn):
?XDP不提供緩存隊(duì)列(qdisc),TX設(shè)備太慢時直接丟包?XDP程序是專用的,不具備網(wǎng)絡(luò)協(xié)議棧的通用性
應(yīng)用場景
?快速DDoS緩解?軟件定義路由(SDR)
CPU負(fù)載均衡
NAPI

RSS(receive side scaling):網(wǎng)卡多隊(duì)列
?網(wǎng)卡對接收到的報(bào)文進(jìn)行解析,獲取IP地址、協(xié)議和端口五元組信息;?網(wǎng)卡通過配置的HASH函數(shù)根據(jù)五元組信息計(jì)算出HASH值,也可以根據(jù)二、三或四元組進(jìn)行計(jì)算;?取HASH值的低幾位(不同網(wǎng)卡可能不同)作為RETA(redirection table)的索引;?根據(jù)RETA中存儲的值分發(fā)到對應(yīng)的CPU。RSS需要硬件支持。基于RSS技術(shù)程序可以通過硬件在多個CPU之間來分發(fā)數(shù)據(jù)流,并且可以通過對RETA的修改來實(shí)現(xiàn)動態(tài)的負(fù)載均衡。
RPS(receive packet Steering):RSS的軟件實(shí)現(xiàn)
RPS是接收報(bào)文的時候處理,而XPS是發(fā)送報(bào)文的時候處理器優(yōu)化。
XPS(transmit packet Steering):應(yīng)用在發(fā)送方向
RFS(receive flwo Steering): 基于flow的RPS
總結(jié)
參考鏈接:
?https://www.cnblogs.com/sammyliu/p/5225623.html?https://blog.selectel.com/introduction-dpdk-architecture-principles/?https://medium.com/@jain.sm/express-data-path-xdp-introduction-d41b77ffbabf?https://tonydeng.github.io/sdn-handbook/linux/XDP/?http://cxd2014.github.io/2017/10/15/linux-napi/?https://chengqian90.com/%E6%9D%82%E8%B0%88/%E7%BD%91%E7%BB%9CRPS-RFS-GSO-GRO%E7%AD%89%E5%8A%9F%E8%83%BD%E9%87%8A%E4%B9%89.html
歡迎關(guān)注我的公眾號“須彌零一”,原創(chuàng)技術(shù)文章第一時間推送。
