<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Linux內(nèi)核網(wǎng)絡(luò)性能優(yōu)化

          共 3460字,需瀏覽 7分鐘

           ·

          2021-04-28 02:53

          須彌零一

          Linux內(nèi)核網(wǎng)絡(luò)性能優(yōu)化

          本篇文章轉(zhuǎn)自Linux內(nèi)核之旅
          作者:  梁金榮
          原文: http://kerneltravel.net/blog/2021/ljr_network17/

          前言

          本文將簡單介紹Linux內(nèi)核網(wǎng)絡(luò)協(xié)議棧的流程,并總結(jié)常見的網(wǎng)絡(luò)優(yōu)化技術(shù),使用盡量多的圖片幫助理解原理,感謝閱讀。

          Linux網(wǎng)絡(luò)協(xié)議棧

          數(shù)據(jù)包在內(nèi)核中使用 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_protudp_prot 等,該結(jié)構(gòu)體中定義了一系列該網(wǎng)絡(luò)協(xié)議需要的回調(diào)函數(shù),包括 connectsendmsgrecvmsg 等。
          通常Linux內(nèi)核網(wǎng)絡(luò)協(xié)議棧接收和發(fā)送數(shù)據(jù)時的流程是醬樣子的:

          以接收數(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

          為了提高數(shù)據(jù)包處理能力,進(jìn)而提高網(wǎng)絡(luò)性能,出現(xiàn)了DPDK這樣的內(nèi)核協(xié)議棧繞過繞過技術(shù)。DPDK需要應(yīng)用程序在用戶態(tài)實(shí)現(xiàn)自己的網(wǎng)絡(luò)協(xié)議棧,這樣可以直接向網(wǎng)卡設(shè)備驅(qū)動程序發(fā)送數(shù)據(jù),也可以直接從網(wǎng)卡內(nèi)存中讀取數(shù)據(jù)包,通過避免數(shù)據(jù)的多次復(fù)制來提高網(wǎng)絡(luò)性能。
          缺點(diǎn):因?yàn)镈PDK繞過了內(nèi)核中的整個網(wǎng)絡(luò)協(xié)議棧,所以無法使用傳統(tǒng)工具進(jìn)行跟蹤和性能分析。

          XDP

          XDPeXpress 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ù)載均衡

          通常狀況下,CPU處理網(wǎng)絡(luò)數(shù)據(jù)包,一個單獨(dú)的網(wǎng)卡一般只會向一個CPU發(fā)送中斷,這可能導(dǎo)致該CPU資源全部用于處理中斷和網(wǎng)絡(luò)協(xié)議棧,進(jìn)而成為全系統(tǒng)的性能瓶頸。下面將介紹一些常見的用于處理網(wǎng)絡(luò)數(shù)據(jù)包的CPU負(fù)載均衡技術(shù):

          NAPI

          在NAPI架構(gòu)中,當(dāng)接收到數(shù)據(jù)包產(chǎn)生中斷時,驅(qū)動程序會通知網(wǎng)絡(luò)子系統(tǒng)有新的數(shù)據(jù)包到來(而不是立即處理數(shù)據(jù)包),這樣就可以在ISR(Interrupt Service Routines - 中斷服務(wù)程序)上下文之外使用輪詢的方式來一次性接收多個數(shù)據(jù)包。
          驅(qū)動程序不再使用數(shù)據(jù)包接收隊(duì)列,網(wǎng)卡本身需要維護(hù)一個緩沖區(qū)來保存接收到數(shù)據(jù)包,并且可以禁止中斷。這種方法減少了中斷的產(chǎn)生并且在突發(fā)情況下減少了丟包的可能性,避免了接收隊(duì)列的飽和,進(jìn)而提升了網(wǎng)絡(luò)性能。

          RSS(receive side scaling):網(wǎng)卡多隊(duì)列

          RSS(Receive Side Scaling)是一種能夠在多處理器系統(tǒng)下使接收報(bào)文在多個CPU之間高效分發(fā)的網(wǎng)卡驅(qū)動技術(shù)。

          ?網(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(Receive Package Steering)其原理是以軟件方式實(shí)現(xiàn)接收的報(bào)文在cpu之間平均分配,即利用報(bào)文的hash值找到匹配的cpu,然后將報(bào)文送至該cpu對應(yīng)的backlog隊(duì)列中進(jìn)行下一步的處理。
          報(bào)文hash值,可以是由網(wǎng)卡計(jì)算得到,也可以是由軟件計(jì)算得到,具體的計(jì)算也因報(bào)文協(xié)議不同而有所差異,以tcp報(bào)文為例,tcp報(bào)文的hash值是根據(jù)四元組信息,即源IP地址、源端口、目的IP地址和目的端口進(jìn)行hash計(jì)算得到的。

          RPS是接收報(bào)文的時候處理,而XPS是發(fā)送報(bào)文的時候處理器優(yōu)化。

          XPS(transmit packet Steering):應(yīng)用在發(fā)送方向

          較上述RPS,XPS是軟件支持的發(fā)數(shù)據(jù)包時的多隊(duì)列,

          RFS(receive flwo Steering): 基于flow的RPS

          RPS只是根據(jù)報(bào)文的hash值從分發(fā)處理報(bào)文的cpu列表中選取一個目標(biāo)cpu,這樣雖然負(fù)載均衡的效果很好,但是當(dāng)用戶態(tài)處理報(bào)文的cpu和內(nèi)核處理報(bào)文軟中斷的cpu不同的時候,就會導(dǎo)致cpu的緩存不命中,影響性能。而RFS(Receive Flow Steering)就是用來處理這種情況的,RFS的目標(biāo)是通過指派處理報(bào)文的應(yīng)用程序所在的cpu來在內(nèi)核態(tài)處理報(bào)文,以此來增加cpu的緩存命中率。

          總結(jié)

          本文只總結(jié)了常見的網(wǎng)絡(luò)優(yōu)化技術(shù),并使用盡量多的圖片幫助理解原理,但未深入具體去介紹原理和用法,目的是以后需要時可以宏觀上知道該怎么去做,進(jìn)而微觀上深入內(nèi)核來解決問題。

          參考鏈接:

          ?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


          ---- END ----



          歡迎關(guān)注我的公眾號“須彌零一”,原創(chuàng)技術(shù)文章第一時間推送。


          瀏覽 1623
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色婷婷色婷婷色婷婷视频 | 成人做爰免费A片在线观看视频网站 | 色逼成人综合一二三区 | 亚洲日韩小电影 | 亚洲免费黄 |