在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

多CPU下的Ring Buffer處理

科技綠洲 ? 來源:一起學(xué)嵌入式 ? 作者:一起學(xué)嵌入式 ? 2023-06-22 10:13 ? 次閱讀

1. 網(wǎng)卡處理數(shù)據(jù)包流程

一圖勝千言,先來看看網(wǎng)卡處理網(wǎng)絡(luò)數(shù)據(jù)流程圖:

圖片

圖片來自參考鏈接1

上圖中虛線步驟的解釋:

1 DMA 將 NIC 接收的數(shù)據(jù)包逐個(gè)寫入 sk_buff ,一個(gè)數(shù)據(jù)包可能占用多個(gè) sk_buff , sk_buff 讀寫順序遵循FIFO(先入先出)原則。

2 DMA 讀完數(shù)據(jù)之后,NIC 會(huì)通過 NIC Interrupt Handler 觸發(fā) IRQ (中斷請(qǐng)求)。

3 NIC driver 注冊 poll 函數(shù)。

4 poll 函數(shù)對(duì)數(shù)據(jù)進(jìn)行檢查,例如將幾個(gè) sk_buff 合并,因?yàn)榭赡芡粋€(gè)數(shù)據(jù)可能被分散放在多個(gè) sk_buff 中。

5 poll 函數(shù)將 sk_buff 交付上層網(wǎng)絡(luò)棧處理。

完整流程:

1 系統(tǒng)啟動(dòng)時(shí) NIC (network interface card) 進(jìn)行初始化,系統(tǒng)分配內(nèi)存空間給 Ring Buffer 。

2 初始狀態(tài)下,Ring Buffer 隊(duì)列每個(gè)槽中存放的 Packet Descriptor 指向 sk_buff ,狀態(tài)均為 ready。

3 DMA 將 NIC 接收的數(shù)據(jù)包逐個(gè)寫入 sk_buff ,一個(gè)數(shù)據(jù)包可能占用多個(gè) sk_buff ,sk_buff 讀寫順序遵循FIFO(先入先出)原則。

4 被寫入數(shù)據(jù)的 sk_buff 變?yōu)?used 狀態(tài)。

5 DMA 讀完數(shù)據(jù)之后,NIC 會(huì)通過 NIC Interrupt Handler 觸發(fā) IRQ (中斷請(qǐng)求)。

6 NIC driver 注冊 poll 函數(shù)。

7 poll 函數(shù)對(duì)數(shù)據(jù)進(jìn)行檢查,例如將幾個(gè) sk_buff 合并,因?yàn)榭赡芡粋€(gè)數(shù)據(jù)可能被分散放在多個(gè) sk_buff 中。

8 poll 函數(shù)將 sk_buff 交付上層網(wǎng)絡(luò)棧處理。

9 poll 函數(shù)清理 sk_buff,清理 Ring Buffer 上的 Descriptor 將其指向新分配的 sk_buff 并將狀態(tài)設(shè)置為 ready。

2. 多 CPU 下的 Ring Buffer 處理

因?yàn)榉峙浣o Ring Buffer 的空間是有限的,當(dāng)收到的數(shù)據(jù)包速率大于單個(gè) CPU 處理速度的時(shí)候 Ring Buffer 可能被占滿,占滿之后再來的新數(shù)據(jù)包會(huì)被自動(dòng)丟棄。

如果在多核 CPU 的服務(wù)器上,網(wǎng)卡內(nèi)部會(huì)有多個(gè) Ring Buffer,NIC 負(fù)責(zé)將傳進(jìn)來的數(shù)據(jù)分配給不同的 Ring Buffer,同時(shí)觸發(fā)的 IRQ 也可以分配到多個(gè) CPU 上,這樣存在多個(gè) Ring Buffer 的情況下, Ring Buffer 緩存的數(shù)據(jù)也同時(shí)被多個(gè) CPU 處理,就能提高數(shù)據(jù)的并行處理能力。

當(dāng)然,要實(shí)現(xiàn)“NIC 負(fù)責(zé)將傳進(jìn)來的數(shù)據(jù)分配給不同的 Ring Buffer”,NIC 網(wǎng)卡必須支持 Receive Side Scaling(RSS) 或者叫做 multiqueue 的功能。RSS 除了會(huì)影響到 NIC 將 IRQ 發(fā)到哪個(gè) CPU 之外,不會(huì)影響別的邏輯了。數(shù)據(jù)處理過程跟之前描述的是一樣的。

3. Ring Buffer 相關(guān)命令

在生產(chǎn)實(shí)踐中,因 Ring Buffer 寫滿導(dǎo)致丟包的情況很多。當(dāng)環(huán)境中的業(yè)務(wù)流量過大且出現(xiàn)網(wǎng)卡丟包的時(shí)候,考慮到 Ring Buffer 寫滿是一個(gè)很好的思路。

總結(jié)下 Ring Buffer 相關(guān)的命令:

3.1 網(wǎng)卡收到的數(shù)據(jù)包統(tǒng)計(jì)

[root@test ]$ ethtool -S em1 | more
NIC statistics:
     rx_packets: 35874336743
     tx_packets: 35163830212
     rx_bytes: 6337524253985
     tx_bytes: 3686383656436
     rx_broadcast: 15392577
     tx_broadcast: 873436
     rx_multicast: 45849160
     tx_multicast: 1784024

RX 就是收到數(shù)據(jù),TX 是發(fā)出數(shù)據(jù)。

3.2 帶有 drop 字樣的統(tǒng)計(jì)和 fifo_errors 的統(tǒng)計(jì)

[root@test ]$ethtool -S em1 | grep -iE "error|drop"
rx_crc_errors: 0
rx_missed_errors: 0
tx_aborted_errors: 0
tx_carrier_errors: 0
tx_window_errors: 0
rx_long_length_errors: 0
rx_short_length_errors: 0
rx_align_errors: 0
dropped_smbus: 0
rx_errors: 0
tx_errors: 0
tx_dropped: 0
rx_length_errors: 0
rx_over_errors: 0
rx_frame_errors: 0
rx_fifo_errors: 79270
tx_fifo_errors: 0
tx_heartbeat_errors: 0
rx_queue_0_drops: 16669
rx_queue_1_drops: 21522
rx_queue_2_drops: 0
rx_queue_3_drops: 5678
rx_queue_4_drops: 5730
rx_queue_5_drops: 14011
rx_queue_6_drops: 15240
rx_queue_7_drops: 420

發(fā)送隊(duì)列和接收隊(duì)列 drop 的數(shù)據(jù)包數(shù)量顯示在這里。并且所有 queue_drops 加起來等于 rx_fifo_errors。

所以總體上能通過 rx_fifo_errors 看到 Ring Buffer 上是否有丟包。如果有的話一方面是看是否需要調(diào)整一下每個(gè)隊(duì)列數(shù)據(jù)的分配,或者是否要加大 Ring Buffer 的大小。

3.3 查詢 Ring Buffer 大小

[root@test]$ ethtool -g em1
Ring parameters for em1:
Pre-set maximums:
RX: 4096
RX Mini: 0
RX Jumbo: 0
TX: 4096
Current hardware settings:
RX: 256
RX Mini: 0
RX Jumbo: 0
TX: 256

RX 和 TX 最大是 4096,當(dāng)前值為 256 。隊(duì)列越大丟包的可能越小,但數(shù)據(jù)延遲會(huì)增加。

3.4 調(diào)整 Ring Buffer 隊(duì)列數(shù)量

[root@test]$ ethtool -l em1
Channel parameters for em1:
Pre-set maximums:
RX:        0
TX:        0
Other:        1
Combined:    8
Current hardware settings:
RX:        0
TX:        0
Other:        1
Combined:    8

Combined = 8,說明當(dāng)前 NIC 網(wǎng)卡會(huì)使用 8 個(gè)進(jìn)程處理網(wǎng)絡(luò)數(shù)據(jù)。

更改 eth0 網(wǎng)卡 Combined 的值:

ethtool -L eth0 combined 8

需要注意的是,ethtool 的設(shè)置操作可能都要重啟一下才能生效。

3.4 調(diào)整 Ring Buffer 隊(duì)列大小 查看當(dāng)前 Ring Buffer 大小:

[root@test]$ ethtool -g em1
Ring parameters for em1:
Pre-set maximums:
RX:        4096
RX Mini:    0
RX Jumbo:    0
TX:        4096
Current hardware settings:
RX:        256
RX Mini:    0
RX Jumbo:    0
TX:        256

看到 RX 和 TX 最大是 4096,當(dāng)前值為 256。隊(duì)列越大丟包的可能越小,但數(shù)據(jù)延遲會(huì)增加。

設(shè)置 RX 和 TX 隊(duì)列大小:

ethtool -G em1 rx 4096

ethtool -G em1 tx 4096

3.5 調(diào)整 Ring Buffer 隊(duì)列的權(quán)重

NIC 如果支持 mutiqueue 的話 NIC 會(huì)根據(jù)一個(gè) Hash 函數(shù)對(duì)收到的數(shù)據(jù)包進(jìn)行分發(fā)。能調(diào)整不同隊(duì)列的權(quán)重,用于分配數(shù)據(jù)。

[root@test]$ ethtool -x em1
RX flow hash indirection table for em1 with 8 RX ring(s):
    0:      0     0     0     0     0     0     0     0
    8:      0     0     0     0     0     0     0     0
   16:      1     1     1     1     1     1     1     1
   24:      1     1     1     1     1     1     1     1
   32:      2     2     2     2     2     2     2     2
   40:      2     2     2     2     2     2     2     2
   48:      3     3     3     3     3     3     3     3
   56:      3     3     3     3     3     3     3     3
   64:      4     4     4     4     4     4     4     4
   72:      4     4     4     4     4     4     4     4
   80:      5     5     5     5     5     5     5     5
   88:      5     5     5     5     5     5     5     5
   96:      6     6     6     6     6     6     6     6
  104:      6     6     6     6     6     6     6     6
  112:      7     7     7     7     7     7     7     7
  120:      7     7     7     7     7     7     7     7
RSS hash key:
Operation not supported

我的 NIC 一共有 8 個(gè)隊(duì)列,一共有 128 個(gè)不同的 Hash 值,上面就是列出了每個(gè) Hash 值對(duì)應(yīng)的隊(duì)列是什么。最左側(cè) 0 8 16 是為了能讓你快速的找到某個(gè)具體的 Hash 值。比如 Hash 值是 76 的話我們能立即找到 72 那一行:"72: 4 4 4 4 4 4 4 4",從左到右第一個(gè)是 72 數(shù)第 5 個(gè)就是 76 這個(gè) Hash 值對(duì)應(yīng)的隊(duì)列是 4 。

設(shè)置 8 個(gè)隊(duì)列的權(quán)重。加起來不能超過 128 。128 是 indirection table 大小,每個(gè) NIC 可能不一樣。

3.6 更改 Ring Buffer Hash Field

分配數(shù)據(jù)包的時(shí)候是按照數(shù)據(jù)包內(nèi)的某個(gè)字段來進(jìn)行的,這個(gè)字段能進(jìn)行調(diào)整。

[root@test]$ ethtool -n em1 rx-flow-hash tcp4
TCP over IPV4 flows use these fields for computing Hash flow key:
IP SA
IP DA
L4 bytes 0 & 1 [TCP/UDP src port]
L4 bytes 2 & 3 [TCP/UDP dst port]

也可以設(shè)置 Hash 字段:查看 tcp4 的 Hash 字段。

ethtool -N em1 rx-flow-hash udp4 sdfn

sdfn 需要查看 ethtool 看其含義,還有很多別的配置值。

3.6 IRQ 統(tǒng)計(jì)

/proc/interrupts 能看到每個(gè) CPU 的 IRQ 統(tǒng)計(jì)。一般就是看看 NIC 有沒有支持 multiqueue 以及 NAPI 的 IRQ 合并機(jī)制是否生效。看看 IRQ 是不是增長的很快。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11017

    瀏覽量

    215443
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    9626

    瀏覽量

    87092
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4365

    瀏覽量

    63959
  • 網(wǎng)絡(luò)數(shù)據(jù)

    關(guān)注

    1

    文章

    44

    瀏覽量

    10218
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    什么是always on buffer?什么情況需要插always on buffer

    相比普通的buffer cell,always on buffer(AOB)有secondary always on pin,可以讓AOB即使在primary power off的情況保持on的狀態(tài);AOB在secondary
    的頭像 發(fā)表于 12-01 15:31 ?3630次閱讀
    什么是always on <b class='flag-5'>buffer</b>?什么情況<b class='flag-5'>下</b>需要插always on <b class='flag-5'>buffer</b>?

    Ring Buffer 有什么特別?

    的優(yōu)點(diǎn)。 首先,Ring Buffer 比鏈表要快,因?yàn)樗菙?shù)組,而且有一個(gè)容易預(yù)測的訪問模式。這很不錯(cuò),對(duì) CPU 高速緩存友好 (CPU-cache-friendly)-數(shù)據(jù)可以在
    發(fā)表于 05-25 00:41

    什么是Resilient Packet Ring

    什么是Resilient Packet Ring    英文縮寫: Resilient Packet Ring 中文譯名: 彈性分組環(huán)
    發(fā)表于 02-23 09:31 ?671次閱讀

    粉紅圈(pink ring),粉紅圈(pink ring)是

    粉紅圈(pink ring)定義成因/影響/改善 粉紅圈(pink ring)的定義 板面在氧化后,生成一絨毛層(氧化銅及氧化亞銅)。在本質(zhì)
    發(fā)表于 03-27 16:27 ?2749次閱讀

    什么是“計(jì)算虛擬化” CPU虛擬化簡介

    對(duì)于 X86 處理器來說,CPU 虛擬化的基礎(chǔ)是因?yàn)槠浔Wo(hù)模式下一共有 4 個(gè)不同優(yōu)先級(jí),分別從 Ring 0 直到 Ring3。這些 Ring
    發(fā)表于 05-07 17:25 ?2.3w次閱讀

    Ring buffer介紹

    種情況幾乎什么也不用做。此外,也不像鏈表那樣每增加一條數(shù)據(jù)都要?jiǎng)?chuàng)建對(duì)象-當(dāng)這些數(shù)據(jù)從鏈表里刪除時(shí),這些對(duì)象都要被清理掉。文章缺少的部分我沒有提到如何避免環(huán)重疊,以及怎么向 Ring Buffer
    發(fā)表于 04-02 14:32 ?3370次閱讀

    BPF ring buffer解決的問題及其背后的設(shè)計(jì)

    因此內(nèi)核 5.8 引入了 ringbuf 來解決這個(gè)問題。ringbuf 是一個(gè)“生產(chǎn)者、單消費(fèi)者”(multi-producer, single-consumer,MPSC) 隊(duì)列,可安全地在多個(gè) CPU 之間共享和操作。
    的頭像 發(fā)表于 05-07 11:12 ?1508次閱讀

    BPF ring buffer解決的問題及背后的設(shè)計(jì)

    文章介紹了 BPF ring buffer 解決的問題及背后的設(shè)計(jì),并給出了一些代碼示例和內(nèi)核 patch 鏈接,深度和廣度兼?zhèn)洌菍W(xué)習(xí) ring buffer 的極佳參考。
    的頭像 發(fā)表于 05-17 09:37 ?2524次閱讀

    Ring Clojure的Web框架

    ./oschina_soft/ring.zip
    發(fā)表于 06-13 09:38 ?1次下載
    <b class='flag-5'>Ring</b> Clojure的Web框架

    PF_RING高速數(shù)據(jù)包處理框架

    ./oschina_soft/PF_RING.zip
    發(fā)表于 06-22 09:32 ?0次下載
    PF_<b class='flag-5'>RING</b>高速數(shù)據(jù)包<b class='flag-5'>處理</b>框架

    簡述linux系統(tǒng)UDP丟包問題分析思路(上)

    過程使用 DMA(Direct Memory Access),不需要 CPU 參與 3. 內(nèi)核從 ring buffer 中讀取報(bào)文進(jìn)行處理,執(zhí)行 IP 和 TCP/UDP 層的邏輯
    的頭像 發(fā)表于 05-18 17:24 ?2997次閱讀
    簡述linux系統(tǒng)UDP丟包問題分析思路(上)

    簡述linux系統(tǒng)UDP丟包問題分析思路(

    過程使用 DMA(Direct Memory Access),不需要 CPU 參與 3. 內(nèi)核從 ring buffer 中讀取報(bào)文進(jìn)行處理,執(zhí)行 IP 和 TCP/UDP 層的邏輯
    的頭像 發(fā)表于 05-18 17:25 ?1721次閱讀

    單周期cpu周期cpu的區(qū)別 周期cpu和流水線的區(qū)別

    單周期cpu周期cpu的區(qū)別 周期cpu和流水線的區(qū)別? 單周期CPU
    的頭像 發(fā)表于 10-19 16:53 ?1.4w次閱讀

    周期cpu的設(shè)計(jì)思想是什么?怎樣實(shí)現(xiàn)cpu流水線?

    周期cpu的設(shè)計(jì)思想是什么?怎樣實(shí)現(xiàn)cpu流水線? 周期cpu的設(shè)計(jì)思想是針對(duì)傳統(tǒng)的單周期
    的頭像 發(fā)表于 10-19 16:53 ?3530次閱讀

    MSPM0 UART通信中DMA和Ring Buffer環(huán)形緩沖的應(yīng)用

    電子發(fā)燒友網(wǎng)站提供《MSPM0 UART通信中DMA和Ring Buffer環(huán)形緩沖的應(yīng)用.pdf》資料免費(fèi)下載
    發(fā)表于 09-05 11:01 ?0次下載
    MSPM0 UART通信中DMA和<b class='flag-5'>Ring</b> <b class='flag-5'>Buffer</b>環(huán)形緩沖的應(yīng)用
    主站蜘蛛池模板: 色婷婷影院在线视频免费播放 | 亚洲综合色色图 | 高清配种视频xxxxx | 国产黄色三级三级三级 | 久久人成| 天堂资源在线最新版 | 欧美顶级xxxxbbbb | 日韩三级免费看 | 色综合社区| 18年大片免费在线 | 中文字幕一二三区乱码老 | 韩国三级无遮挡床戏视频 | 国产资源站 | 免费jyzzjyzz在线播放大全 | 色噜噜噜噜噜 | 亚洲大成色www永久网 | 欧美成人午夜影院 | 色香影院 | 天天操天天摸天天干 | 免费在线黄网站 | 毛色毛片| 人人爽天天爽夜夜爽曰 | 色爱区综合 | 久久成人国产精品青青 | 欧美精品亚洲网站 | 2017天天天天做夜夜夜做 | 亚洲444kkk| 色视频在线观看完整免费版 | 国产你懂| 国产伦精品一区二区三区免费 | 开心激情婷婷 | 国产成人精品日本亚洲语音1 | 四虎最新网址在线观看 | 国产三级a三级三级野外 | 日本免费网站在线观看 | 性欧美丰满xxxx性久久久 | 黄色毛片免费网站 | 亚洲人成影院在线高清 | 日本三级强在线观看 | 偷窥自拍亚洲色图 | www.五月婷婷|