女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

多CPU下的Ring Buffer處理

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

1. 網卡處理數據包流程

一圖勝千言,先來看看網卡處理網絡數據流程圖:

圖片

圖片來自參考鏈接1

上圖中虛線步驟的解釋:

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

2 DMA 讀完數據之后,NIC 會通過 NIC Interrupt Handler 觸發 IRQ (中斷請求)。

3 NIC driver 注冊 poll 函數。

4 poll 函數對數據進行檢查,例如將幾個 sk_buff 合并,因為可能同一個數據可能被分散放在多個 sk_buff 中。

5 poll 函數將 sk_buff 交付上層網絡棧處理。

完整流程:

1 系統啟動時 NIC (network interface card) 進行初始化,系統分配內存空間給 Ring Buffer 。

2 初始狀態下,Ring Buffer 隊列每個槽中存放的 Packet Descriptor 指向 sk_buff ,狀態均為 ready。

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

4 被寫入數據的 sk_buff 變為 used 狀態。

5 DMA 讀完數據之后,NIC 會通過 NIC Interrupt Handler 觸發 IRQ (中斷請求)。

6 NIC driver 注冊 poll 函數。

7 poll 函數對數據進行檢查,例如將幾個 sk_buff 合并,因為可能同一個數據可能被分散放在多個 sk_buff 中。

8 poll 函數將 sk_buff 交付上層網絡棧處理。

9 poll 函數清理 sk_buff,清理 Ring Buffer 上的 Descriptor 將其指向新分配的 sk_buff 并將狀態設置為 ready。

2. 多 CPU 下的 Ring Buffer 處理

因為分配給 Ring Buffer 的空間是有限的,當收到的數據包速率大于單個 CPU 處理速度的時候 Ring Buffer 可能被占滿,占滿之后再來的新數據包會被自動丟棄。

如果在多核 CPU 的服務器上,網卡內部會有多個 Ring Buffer,NIC 負責將傳進來的數據分配給不同的 Ring Buffer,同時觸發的 IRQ 也可以分配到多個 CPU 上,這樣存在多個 Ring Buffer 的情況下, Ring Buffer 緩存的數據也同時被多個 CPU 處理,就能提高數據的并行處理能力。

當然,要實現“NIC 負責將傳進來的數據分配給不同的 Ring Buffer”,NIC 網卡必須支持 Receive Side Scaling(RSS) 或者叫做 multiqueue 的功能。RSS 除了會影響到 NIC 將 IRQ 發到哪個 CPU 之外,不會影響別的邏輯了。數據處理過程跟之前描述的是一樣的。

3. Ring Buffer 相關命令

在生產實踐中,因 Ring Buffer 寫滿導致丟包的情況很多。當環境中的業務流量過大且出現網卡丟包的時候,考慮到 Ring Buffer 寫滿是一個很好的思路。

總結下 Ring Buffer 相關的命令:

3.1 網卡收到的數據包統計

[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 就是收到數據,TX 是發出數據。

3.2 帶有 drop 字樣的統計和 fifo_errors 的統計

[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

發送隊列和接收隊列 drop 的數據包數量顯示在這里。并且所有 queue_drops 加起來等于 rx_fifo_errors。

所以總體上能通過 rx_fifo_errors 看到 Ring Buffer 上是否有丟包。如果有的話一方面是看是否需要調整一下每個隊列數據的分配,或者是否要加大 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,當前值為 256 。隊列越大丟包的可能越小,但數據延遲會增加。

3.4 調整 Ring Buffer 隊列數量

[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,說明當前 NIC 網卡會使用 8 個進程處理網絡數據。

更改 eth0 網卡 Combined 的值:

ethtool -L eth0 combined 8

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

3.4 調整 Ring Buffer 隊列大小 查看當前 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,當前值為 256。隊列越大丟包的可能越小,但數據延遲會增加。

設置 RX 和 TX 隊列大小:

ethtool -G em1 rx 4096

ethtool -G em1 tx 4096

3.5 調整 Ring Buffer 隊列的權重

NIC 如果支持 mutiqueue 的話 NIC 會根據一個 Hash 函數對收到的數據包進行分發。能調整不同隊列的權重,用于分配數據。

[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 個隊列,一共有 128 個不同的 Hash 值,上面就是列出了每個 Hash 值對應的隊列是什么。最左側 0 8 16 是為了能讓你快速的找到某個具體的 Hash 值。比如 Hash 值是 76 的話我們能立即找到 72 那一行:"72: 4 4 4 4 4 4 4 4",從左到右第一個是 72 數第 5 個就是 76 這個 Hash 值對應的隊列是 4 。

設置 8 個隊列的權重。加起來不能超過 128 。128 是 indirection table 大小,每個 NIC 可能不一樣。

3.6 更改 Ring Buffer Hash Field

分配數據包的時候是按照數據包內的某個字段來進行的,這個字段能進行調整。

[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]

也可以設置 Hash 字段:查看 tcp4 的 Hash 字段。

ethtool -N em1 rx-flow-hash udp4 sdfn

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

3.6 IRQ 統計

/proc/interrupts 能看到每個 CPU 的 IRQ 統計。一般就是看看 NIC 有沒有支持 multiqueue 以及 NAPI 的 IRQ 合并機制是否生效。看看 IRQ 是不是增長的很快。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    11033

    瀏覽量

    215968
  • 服務器
    +關注

    關注

    13

    文章

    9683

    瀏覽量

    87271
  • 函數
    +關注

    關注

    3

    文章

    4368

    瀏覽量

    64178
  • 網絡數據
    +關注

    關注

    1

    文章

    44

    瀏覽量

    10233
收藏 人收藏

    評論

    相關推薦
    熱點推薦

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

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

    Ring Buffer 有什么特別?

    的優點。 首先,Ring Buffer 比鏈表要快,因為它是數組,而且有一個容易預測的訪問模式。這很不錯,對 CPU 高速緩存友好 (CPU-cache-friendly)-數據可以在
    發表于 05-25 00:41

    什么是Resilient Packet Ring

    什么是Resilient Packet Ring    英文縮寫: Resilient Packet Ring 中文譯名: 彈性分組環
    發表于 02-23 09:31 ?674次閱讀

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

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

    什么是“計算虛擬化” CPU虛擬化簡介

    對于 X86 處理器來說,CPU 虛擬化的基礎是因為其保護模式下一共有 4 個不同優先級,分別從 Ring 0 直到 Ring3。這些 Ring
    發表于 05-07 17:25 ?2.3w次閱讀

    Ring buffer介紹

    種情況幾乎什么也不用做。此外,也不像鏈表那樣每增加一條數據都要創建對象-當這些數據從鏈表里刪除時,這些對象都要被清理掉。文章缺少的部分我沒有提到如何避免環重疊,以及怎么向 Ring Buffer
    發表于 04-02 14:32 ?3389次閱讀

    BPF ring buffer解決的問題及其背后的設計

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

    BPF ring buffer解決的問題及背后的設計

    文章介紹了 BPF ring buffer 解決的問題及背后的設計,并給出了一些代碼示例和內核 patch 鏈接,深度和廣度兼備,是學習 ring buffer 的極佳參考。
    的頭像 發表于 05-17 09:37 ?2559次閱讀

    Ring Clojure的Web框架

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

    PF_RING高速數據包處理框架

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

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

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

    簡述linux系統UDP丟包問題分析思路(

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

    單周期cpu周期cpu的區別 周期cpu和流水線的區別

    單周期cpu周期cpu的區別 周期cpu和流水線的區別? 單周期CPU
    的頭像 發表于 10-19 16:53 ?1.5w次閱讀

    周期cpu的設計思想是什么?怎樣實現cpu流水線?

    周期cpu的設計思想是什么?怎樣實現cpu流水線? 周期cpu的設計思想是針對傳統的單周期
    的頭像 發表于 10-19 16:53 ?3609次閱讀

    MSPM0 UART通信中DMA和Ring Buffer環形緩沖的應用

    電子發燒友網站提供《MSPM0 UART通信中DMA和Ring Buffer環形緩沖的應用.pdf》資料免費下載
    發表于 09-05 11:01 ?0次下載
    MSPM0 UART通信中DMA和<b class='flag-5'>Ring</b> <b class='flag-5'>Buffer</b>環形緩沖的應用