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

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

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

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

網(wǎng)卡的Ring Buffer詳解

Linux愛好者 ? 來源:yangyidba ? 2023-03-17 14:25 ? 次閱讀

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

網(wǎng)卡處理網(wǎng)絡(luò)數(shù)據(jù)流程圖:

c32d4788-c48b-11ed-bfe3-dac502259ad0.png

圖片來自參考鏈接1

上圖中虛線步驟的解釋:

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

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

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

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

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

完整流程:

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

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

3 DMA 將 NIC 接收的數(shù)據(jù)包逐個寫入 sk_buff ,一個數(shù)據(jù)包可能占用多個 sk_buff ,sk_buff 讀寫順序遵循FIFO(先入先出)原則。4 被寫入數(shù)據(jù)的 sk_buff 變?yōu)?used 狀態(tài)。

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

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

7 poll 函數(shù)對數(shù)據(jù)進(jìn)行檢查,例如將幾個 sk_buff 合并,因?yàn)榭赡芡粋€數(shù)據(jù)可能被分散放在多個 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ù)包速率大于單個 CPU 處理速度的時候 Ring Buffer 可能被占滿,占滿之后再來的新數(shù)據(jù)包會被自動丟棄。

如果在多核 CPU 的服務(wù)器上,網(wǎng)卡內(nèi)部會有多個 Ring Buffer,NIC 負(fù)責(zé)將傳進(jìn)來的數(shù)據(jù)分配給不同的 Ring Buffer,同時觸發(fā)的 IRQ 也可以分配到多個 CPU 上,這樣存在多個 Ring Buffer 的情況下 Ring Buffer 緩存的數(shù)據(jù)也同時被多個 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 除了會影響到 NIC 將 IRQ 發(fā)到哪個 CPU 之外,不會影響別的邏輯了。數(shù)據(jù)處理過程跟之前描述的是一樣的。

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

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

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

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

[root@test]$ethtool-Sem1|more
NICstatistics:
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-Sem1|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)整一下每個隊(duì)列數(shù)據(jù)的分配,或者是否要加大 Ring Buffer 的大小。

3.3 查詢 Ring Buffer 大小

[root@test]$ethtool-gem1
Ringparametersforem1:
Pre-setmaximums:
RX:4096
RXMini:0
RXJumbo:0
TX:4096
Currenthardwaresettings:
RX:256
RXMini:0
RXJumbo:0
TX:256

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

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

[root@test]$ethtool-lem1
Channelparametersforem1:
Pre-setmaximums:
RX:0
TX:0
Other:1
Combined:8
Currenthardwaresettings:
RX:0
TX:0
Other:1
Combined:8

Combined = 8,說明當(dāng)前 NIC 網(wǎng)卡會使用 8 個進(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-gem1
Ringparametersforem1:
Pre-setmaximums:
RX:4096
RXMini:0
RXJumbo:0
TX:4096
Currenthardwaresettings:
RX:256
RXMini:0
RXJumbo:0
TX:256

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

設(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 會根據(jù)一個 Hash 函數(shù)對收到的數(shù)據(jù)包進(jìn)行分發(fā)。能調(diào)整不同隊(duì)列的權(quán)重,用于分配數(shù)據(jù)。

[root@test]$ethtool-xem1
RXflowhashindirectiontableforem1with8RXring(s):
0:00000000
8:00000000
16:11111111
24:11111111
32:22222222
40:22222222
48:33333333
56:33333333
64:44444444
72:44444444
80:55555555
88:55555555
96:66666666
104:66666666
112:77777777
120:77777777
RSShashkey:
Operationnotsupported

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

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

3.6 更改 Ring Buffer Hash Field

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

[root@test]$ethtool-nem1rx-flow-hashtcp4
TCPoverIPV4flowsusethesefieldsforcomputingHashflowkey:
IPSA
IPDA
L4bytes0&1[TCP/UDPsrcport]
L4bytes2&3[TCP/UDPdstport]

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

ethtool -N em1 rx-flow-hash udp4 sdfn

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

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

/proc/interrupts 能看到每個 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ī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 網(wǎng)卡
    +關(guān)注

    關(guān)注

    4

    文章

    314

    瀏覽量

    27463
  • buffer
    +關(guān)注

    關(guān)注

    2

    文章

    120

    瀏覽量

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

    關(guān)注

    3

    文章

    4346

    瀏覽量

    62977
  • dma
    dma
    +關(guān)注

    關(guān)注

    3

    文章

    566

    瀏覽量

    100963
  • NIC
    NIC
    +關(guān)注

    關(guān)注

    0

    文章

    23

    瀏覽量

    12469

原文標(biāo)題:網(wǎng)卡的 Ring Buffer 詳解

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    網(wǎng)卡知識詳解

    網(wǎng)卡知識詳解關(guān)于網(wǎng)卡名稱       計(jì)算機(jī)與外界局域網(wǎng)的連接是通過主機(jī)箱內(nèi)插入一塊網(wǎng)絡(luò)接口板(或者是在筆記本電腦中插入一塊
    發(fā)表于 06-30 22:50

    網(wǎng)卡芯片詳解

    網(wǎng)卡芯片詳解1.RTL8139D  8139/8139A/8139B/8139C/8139C+/8139D/8130/810X/8169/8110系列網(wǎng)卡是市場上最常見的網(wǎng)卡芯片產(chǎn)品,
    發(fā)表于 10-19 13:28

    Ring Buffer 有什么特別?

    首先 - Ring Buffer。我對 Disruptor 的最初印象只有 Ring Buffer。后來我漸漸明白 Ring
    發(fā)表于 05-25 00:41

    什么是Resilient Packet Ring

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

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

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

    linux下網(wǎng)卡配置詳解

    linux下網(wǎng)卡配置詳解
    發(fā)表于 12-15 22:38 ?0次下載

    Ring buffer介紹

    首先 - Ring Buffer。我對 Disruptor 的最初印象只有 Ring Buffer。后來我漸漸明白 Ring
    發(fā)表于 04-02 14:32 ?3261次閱讀

    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 ?2361次閱讀

    Ring Clojure的Web框架

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

    網(wǎng)卡Ring Buffer詳解

    DMA 將 NIC 接收的數(shù)據(jù)包逐個寫入 sk_buff ,一個數(shù)據(jù)包可能占用多個 sk_buff , sk_buff 讀寫順序遵循FIFO(先入先出)原則。
    的頭像 發(fā)表于 04-04 09:15 ?1201次閱讀

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

    在開始之前,我們先用一張圖解釋 linux 系統(tǒng)接收網(wǎng)絡(luò)報(bào)文的過程。 1. 首先網(wǎng)絡(luò)報(bào)文通過物理網(wǎng)線發(fā)送到網(wǎng)卡 2. 網(wǎng)絡(luò)驅(qū)動程序會把網(wǎng)絡(luò)中的報(bào)文讀出來放到 ring buffer 中,這個
    的頭像 發(fā)表于 05-18 17:24 ?2850次閱讀
    簡述linux系統(tǒng)UDP丟包問題分析思路(上)

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

    在開始之前,我們先用一張圖解釋 linux 系統(tǒng)接收網(wǎng)絡(luò)報(bào)文的過程。 1. 首先網(wǎng)絡(luò)報(bào)文通過物理網(wǎng)線發(fā)送到網(wǎng)卡 2. 網(wǎng)絡(luò)驅(qū)動程序會把網(wǎng)絡(luò)中的報(bào)文讀出來放到 ring buffer 中,這個
    的頭像 發(fā)表于 05-18 17:25 ?1567次閱讀

    多CPU下的Ring Buffer處理

    1. 網(wǎng)卡處理數(shù)據(jù)包流程 一圖勝千言,先來看看網(wǎng)卡處理網(wǎng)絡(luò)數(shù)據(jù)流程圖: 圖片來自參考鏈接1 上圖中虛線步驟的解釋: 1 DMA 將 NIC 接收的數(shù)據(jù)包逐個寫入 sk_buff ,一個數(shù)據(jù)包可能占用
    的頭像 發(fā)表于 06-22 10:13 ?925次閱讀
    多CPU下的<b class='flag-5'>Ring</b> <b class='flag-5'>Buffer</b>處理

    物聯(lián)網(wǎng)卡的流量到底是什么?超全詳解

    物聯(lián)網(wǎng)卡的流量到底是什么?超全詳解
    的頭像 發(fā)表于 08-31 09:13 ?2528次閱讀
    物聯(lián)<b class='flag-5'>網(wǎng)卡</b>的流量到底是什么?超全<b class='flag-5'>詳解</b>!

    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)用
    主站蜘蛛池模板: 亚洲网站在线观看 | 久久夜色tv网站免费影院 | 多男一女一级淫片免费播放口 | 色88888久久久久久影院 | 99精品国产在热久久 | 午夜欧美精品久久久久久久久 | 午夜湿 | 女人张开腿双腿让男人桶 | 免费你懂的| 国模娜娜扒开嫩木耳 | 国产资源在线观看 | 九色在线播放 | 涩狠狠狠狠色 | 99久在线 | 五月激情视频 | 天天操天天拍 | 七月丁香八月婷婷综合激情 | 琪琪午夜免费影院在线观看 | 中国人黑人xxⅹ性猛 | 日韩欧美黄色 | 亚洲国产七七久久桃花 | 韩国韩宝贝2020vip福利视频 | 午夜影皖普通区 | 开心综合网 | 最好免费高清视频观看韩国 | 丁香激情小说 | 亚洲三级视频在线观看 | 日韩欧美一卡二区 | 福利三区 | 精品亚洲国产国拍 | 久热福利视频 | 国产日韩欧美一区二区 | 欧美日韩乱国产 | 天堂网在线最新版www | 高清欧美一级在线观看 | 伊人www| 一级骚片超级骚在线观看 | 欧美四虎 | 天堂资源在线种子资源 | 色图视频 | 日本欧美一区二区三区视频 |