国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

Linux網卡收包流程

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2024-12-05 16:21 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Linux 網卡收包流程如下

網卡收到數據包

將數據包從網卡硬件緩存移動到服務器內存中(DMA方式,不經過CPU)

通過硬中斷通知CPU處理

CPU通過軟中斷通知內核處理

經過TCP/IP協議棧處理

應用程序通過read()從socket buffer讀取數據

9860dcb4-af11-11ef-93f3-92fbcf53809c.png

網卡丟包
我們先看下ifconfig的輸出:

# ifconfig eth0
eth0: flags=4163  mtu 1500
        inet 10.5.224.27  netmask 255.255.255.0  broadcast 10.5.224.255
        inet6 fe80::5054fea4:44ae  prefixlen 64  scopeid 0x20
        ether 52:54:00:a4:44:ae  txqueuelen 1000  (Ethernet)
        RX packets 9525661556  bytes 10963926751740 (9.9 TiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8801210220  bytes 12331600148587 (11.2 TiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0Copy

登錄系統底層,檢查管理網網卡收發是否存在持續增長的errors包,使用命令:

# watch -n 1 "ifconfig eth0"
# watch -n 1 ip -s link show eth0
說明:watch可以將命令的輸出結果輸出到標準輸出設備,多用于周期性執行命令/定時執行命令,-n或-interval來指定間隔的時間,缺省每2秒運行一下程序;eth1為網卡名稱。

正常的

987770b4-af11-11ef-93f3-92fbcf53809c.png

異常的

9883d2dc-af11-11ef-93f3-92fbcf53809c.png

RX(receive) 代表接收報文, TX(transmit) 表示發送報文。

RX errors: 表示總的收包的錯誤數量,這包括 too-long-frames 錯誤,Ring Buffer 溢出錯誤,crc 校驗錯誤,幀同步錯誤,fifo overruns 以及 missed pkg 等等。

RX dropped: 表示數據包已經進入了 Ring Buffer,但是由于內存不夠等系統原因,導致在拷貝到內存的過程中被丟棄。

RX overruns: 表示 fifo 的 overruns,由于 Ring Buffer(aka Driver Queue) 傳輸的 IO 大于 kernel 能夠處理的 IO 導致的,而 Ring Buffer 則是指在發起 IRQ 請求之前的那塊 buffer。很明顯,overruns 的增大意味著數據包沒到 Ring Buffer 就被網卡物理層給丟棄了,CPU 無法及時的處理中斷是造成 Ring Buffer 滿的原因之一,可能原因是因為 interruprs 分布的不均勻,沒有做 affinity 而造成的丟包。

RX frame: 表示 misaligned 的 frames。

dropped 與 overruns 的區別:

dropped,表示這個數據包已經進入到網卡的接收緩存 fifo 隊列,并且開始被系統中斷處理準備進行數據包拷貝(從網卡緩存 fifo 隊列拷貝到系統內存),但由于此時的系統原因(比如內存不夠等)導致這個數據包被丟掉,即這個數據包被 Linux 系統丟掉。

overruns,表示這個數據包還沒有被進入到網卡的接收緩存 fifo 隊列就被丟掉,因此此時網卡的 fifo 是滿的。為什么 fifo 會是滿的?因為系統繁忙,來不及響應網卡中斷,導致網卡里的數據包沒有及時的拷貝到系統內存, fifo 是滿的就導致后面的數據包進不來,即這個數據包被網卡硬件丟掉。所以,如果遇到 overruns 非0,需要檢測cpu負載與cpu中斷情況。

環形隊列Ring Buffer溢出
當網卡的緩存區(ring buffer)設置的太小。網絡數據包到達(生產)的速率快于內核處理(消費)的速率時, Ring Buffer 很快會被填滿,新來的數據包將被丟棄。
通過 ethtool 或 /proc/net/dev 可以查看因Ring Buffer滿而丟棄的包統計

[root@xxx ~]# ethtool -S ens2 | grep fifo
     rx_fifo_errors: 0
     tx_fifo_errors: 0
[root@xxx ~]# cat /proc/net/dev | grep ens2
  ens2:  659229    8107    0    0    0     0          0         0   249827    2833    0    0    0     0       0          0

可以通過ethtool 設置ring buffer 的緩沖區大小

# 修改網卡eth0接收與發送硬件緩存區大小
$ ethtool -G eth0 rx 4096 tx 4096
Pre-set maximums:
RX:     4096   
RX Mini:    0
RX Jumbo:   0
TX:     4096   
Current hardware settings:
RX:     4096   
RX Mini:    0
RX Jumbo:   0
TX:     4096

中斷過程中的問題

什么是中斷
中斷有兩種:一種硬中斷;一種軟中斷。硬中斷是由硬件產生的,比如,像磁盤,網卡,鍵盤;軟中斷是由當前正在運行的進程所產生的。

硬中斷,是一種由硬件產生的電信號直接發送到中斷控制器上,然后由中斷控制器向 CPU 發送信號,CPU 檢測到該信號后,會中斷當前的工作轉而去處理中斷。然后,處理器會通知內核已經產生中斷,這樣內核就會對這個中斷進行適當的處理。

當網卡收到數據包時會產生中斷請求(硬中斷)通知到 CPU,CPU 會中斷當前正在運行的任務,然后通知內核有新數據包,內核調用中斷處理程序(軟中斷)進行響應,把數據包從網卡緩存及時拷貝到內存,否則會因為緩存溢出被丟棄。剩下的處理和操作數據包的工作就會交給軟中斷。

什么是多隊列網卡
當網卡不斷的接收數據包,就會產生很多中斷,一個中斷請求只能被一個CPU處理, 而現在的機器都是用多個CPU,同時只有一個 CPU 去處理 Ring Buffer 數據會很低效,這個時候就產生了叫做 Receive Side Scaling(RSS) 或者叫做 multiqueue 的機制來處理這個問題, 這就是為啥需要多隊列的原因。

RSS(Receive Side Scaling)是網卡的硬件特性,實現了多隊列。通過多隊列網卡驅動加載,獲取網卡型號,得到網卡的硬件 queue 的數量,并結合 CPU 核的數量,最終通過 Sum=Min(網卡 queue,CPU core)得出所要激活的網卡 queue 數量。

NIC 收到 Frame 的時候能通過 Hash Function 來決定 Frame 該放在哪個 Ring Buffer 上,觸發的 IRQ 也可以通過操作系統或者手動配置 IRQ affinity 將 IRQ 分配到多個 CPU 上。這樣 IRQ 能被不同的 CPU 處理,從而做到 Ring Buffer 上的數據也能被不同的 CPU 處理,從而提高數據的并行處理能力。

RSS 除了會影響到 NIC 將 IRQ 發到哪個 CPU 之外,不會影響別的邏輯。

什么是RPS
Receive Packet Steering(RPS) 是在 NIC 不支持 RSS 時候在軟件中實現 RSS 類似功能的機制。其好處就是對 NIC 沒有要求,任何 NIC 都能支持 RPS,但缺點是 NIC 收到數據后 DMA 將數據存入的還是一個 Ring Buffer,NIC 觸發 IRQ 還是發到一個 CPU,還是由這一個 CPU 調用 driver 的 poll 來將 Ring Buffer 的數據取出來。RPS 是在單個 CPU 將數據從 Ring Buffer 取出來之后才開始起作用,它會為每個 Packet 計算 Hash 之后將 Packet 發到對應 CPU 的 backlog 中,并通過 Inter-processor Interrupt(IPI) 告知目標 CPU 來處理 backlog。后續 Packet 的處理流程就由這個目標 CPU 來完成。從而實現將負載分到多個 CPU 的目的。通常如果開啟了RPS會加重所有 CPU 的負擔.

IRQ 中斷請求 親和綁定
/proc/interrupts 文件中可以看到各個 CPU 上的中斷情況。

/proc/irq/[irq_num]/smp_affinity_list 可以查看指定中斷當前綁定的 CPU。

可以通過配置 IRQ affinity 指定 IRQ 由哪個 CPU 來處理中斷, 先通過 /proc/interrupts 找到 IRQ 號之后,將希望綁定的 CPU 號寫入 /proc/irq/IRQ_NUMBER/smp_affinity,寫入的是 16 進制的 bit mask。比如看到隊列 rx_0 對應的中斷號是 41 那就執行:

echo 6 > /proc/irq/41/smp_affinity
6 表示的是 CPU2 和 CPU1

0 號 CPU 的掩碼是 0x1 (0001),1 號 CPU 掩碼是 0x2 (0010),2 號 CPU 掩碼是 0x4 (0100),3 號 CPU 掩碼是 0x8 (1000) 依此類推。

softirq 數統計
通過 /proc/softirqs 能看到每個 CPU 上 softirq 數量統計:

cat /proc/softirqs
                    CPU0       CPU1       
          HI:          1          0
       TIMER: 1650579324 3521734270
      NET_TX:   10282064   10655064
      NET_RX: 3618725935       2446
       BLOCK:          0          0
BLOCK_IOPOLL:          0          0
     TASKLET:      47013      41496
       SCHED: 1706483540 1003457088
     HRTIMER:    1698047   11604871
         RCU: 4218377992 3049934909

NET_RX 表示網卡收到包時候觸發的 softirq,一般看這個統計是為了看看 softirq 在每個 CPU 上分布是否均勻,不均勻的話可能就需要做一些調整。比如上面看到 CPU0 和 CPU1 兩個差距很大,原因是這個機器的 NIC 不支持 RSS,沒有多個 Ring Buffer。開啟 RPS 后就均勻多了。

如何開啟RPS
RPS 默認是關閉的,當機器有多個 CPU 并且通過 softirqs 的統計 /proc/softirqs 發現 NET_RX 在 CPU 上分布不均勻或者發現網卡不支持 mutiqueue 時,就可以考慮開啟 RPS。

開啟 RPS 需要調整 /sys/class/net/DEVICE_NAME/queues/QUEUE/rps_cpus 的值。比如執行:

echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus
表示的含義是處理網卡 eth0 的 rx-0 隊列的 CPU 數設置為 f 。即設置有 15 個 CPU 來處理 rx-0 這個隊列的數據,如果你的 CPU 數沒有這么多就會默認使用所有 CPU 。

netdev_max_backlog調優
netdev_max_backlog 是內核從 NIC 收到包后,交由協議棧(如 IP、TCP )處理之前的緩沖隊列, 通過softnet_stat可以確定是否發生了netdev backlog隊列溢出

[root@xxx ~]# cat /proc/net/softnet_stat
000000bf 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000028 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
000000c7 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000031 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
000021d8 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000929 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

C#復制全屏

每一行代表每個 CPU 核的狀態統計,從 CPU0 依次往下。 每一列代表一個 CPU 核的各項統計:第一列代表中斷處理程序收到的包總數;第二列即代表由于 netdev_max_backlog 隊列溢出而被丟棄的包總數。 第3列表示軟中斷一次取走netdev_budget個數據包,或取數據包時間超過2ms的次數。 第4~8列固定為0,沒有意義。 第9列表示發送數據包時,對應的隊列被鎖住的次數。

netdev_max_backlog 的默認值是 1000,我們可以修改內核參數來調優:

sysctl -w net.core.netdev_max_backlog=2000

鏈接:https://www.cnblogs.com/OpenSourceSite/p/18121680

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

    關注

    88

    文章

    11758

    瀏覽量

    219006
  • 網卡
    +關注

    關注

    4

    文章

    339

    瀏覽量

    28904

原文標題:Linux之網絡排錯

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    hpm6750 兩個板載網卡+usbcdc_ecm網卡,多次調用ftp,切換網卡后,報錯

    hpm6750 兩個板載網卡+usbcdc_ecm網卡,多次調用ftp,多次切換網線后,出現報錯pbuf_free:p->ref>0;有時候出現[E
    發表于 01-19 16:05

    機器視覺網卡與普通網卡的5點關鍵不同

    統也使用網卡進行網絡連接,但其所需的網卡通常與普通網卡存在顯著差異。本文將深入探討機器視覺網卡與普通網卡的差異,分析這些差異背后的原因,以及
    的頭像 發表于 01-15 16:38 ?224次閱讀
    機器視覺<b class='flag-5'>網卡</b>與普通<b class='flag-5'>網卡</b>的5點關鍵不同

    機器視覺網卡的全面選型指南

    選擇適合的機器視覺網卡,不能只看“千兆”還是“萬兆”,更需要結合相機類型、傳輸距離、CPU資源占用以及工業環境來綜合考量,尤其在高分辨率、高幀率視覺應用日益普及的當下,網卡的穩定性直接決定系統是否
    的頭像 發表于 01-08 16:35 ?256次閱讀
    機器視覺<b class='flag-5'>網卡</b>的全面選型指南

    基于安路DR1M90 FPSoC的Linux系統全流程開發指南(4)

    本手冊由創龍科技研發,針對安路飛龍 DR1M90,詳述 Linux 系統開發流程:LinuxSDK 配置編譯、BOOT.bin(FSBL+U-Boot)開發、Kernel 與 Rootfs 開發
    的頭像 發表于 11-30 15:46 ?2181次閱讀
    基于安路DR1M90 FPSoC的<b class='flag-5'>Linux</b>系統全<b class='flag-5'>流程</b>開發指南(4)

    基于安路DR1M90 FPSoC 的Linux 系統全流程開發指南(3)

    本手冊由創龍科技研發,針對安路飛龍 DR1M90,詳述 Linux 系統開發流程:LinuxSDK 配置編譯、BOOT.bin(FSBL+U-Boot)開發、Kernel 與 Rootfs 開發
    的頭像 發表于 11-26 17:01 ?318次閱讀
    基于安路DR1M90 FPSoC 的<b class='flag-5'>Linux</b> 系統全<b class='flag-5'>流程</b>開發指南(3)

    基于安路DR1M90 FPSoC 的Linux 系統全流程開發指南(1)

    本手冊由創龍科技研發,針對安路飛龍 DR1M90,詳述 Linux 系統開發流程:LinuxSDK 配置編譯、BOOT.bin(FSBL+U-Boot)開發、Kernel 與 Rootfs 開發
    的頭像 發表于 11-25 14:09 ?384次閱讀
    基于安路DR1M90 FPSoC 的<b class='flag-5'>Linux</b> 系統全<b class='flag-5'>流程</b>開發指南(1)

    迅為3568開發板從零學習Linux驅動開發:迅為一站式資料如何讓我效率翻倍

    迅為3568開發板從零學習Linux驅動開發:迅為一站式資料如何讓我效率翻倍
    的頭像 發表于 11-05 11:16 ?400次閱讀
    迅為3568開發板從零學習<b class='flag-5'>Linux</b>驅動開發:迅為一站式資料<b class='flag-5'>包</b>如何讓我效率翻倍

    linux中使用env時如何下載軟件

    在windows的env中可以直接使用pkgs —update去下載軟件Linux環境下這個指令好像不生效,那么Linux環境下的軟件包下載指令是什么呢?
    發表于 10-11 09:23

    【HZ-T536開發板免費體驗】4- 雙網卡踩坑:選擇性斷網?IPv4 網關配置救星來了!

    via 192.168.2.1 dev eth1 onlink linkdown 翻譯下:系統所有 IPv4 數據,都要通過 “已斷開的 eth1 網卡” 發往網關 192.168.2.1
    發表于 08-23 12:37

    Linux服務器入侵檢測與應急響應流程

    作為一名運維工程師,你是否曾在凌晨3點接到告警電話?服務器異常、流量暴增、CPU飆升...這些可能都是入侵的征兆。本文將分享一套完整的Linux服務器入侵檢測與應急響應流程,讓你在面對安全事件時有條不紊,快速定位并解決問題。
    的頭像 發表于 08-21 17:29 ?1584次閱讀

    企業級Linux磁盤維護的完整流程

    在企業級Linux環境中,磁盤故障是導致系統宕機和數據丟失的主要原因之一。據統計,超過70%的企業級服務器故障與存儲系統相關。作為運維工程師,掌握完整的磁盤維護流程不僅能預防故障,更能在關鍵時刻拯救整個業務系統。
    的頭像 發表于 07-23 16:59 ?882次閱讀

    GM0-5602適配openEUler22.03-LST-SP2并安裝網卡驅動

    制作系統鏡像 系統鏡像:openEuler-22.03-LTS-SP2-x86_64-dvd 網卡源碼版本:yt6801-linux-driver-1.0.30 不要選DD模式做鏡像 要插網口卡并
    的頭像 發表于 07-10 17:03 ?902次閱讀
    GM0-5602適配openEUler22.03-LST-SP2并安裝<b class='flag-5'>網卡</b>驅動

    一文帶你了解什么是機器視覺網卡

    機器視覺網卡通常指的是在機器視覺系統中用于連接工業相機到計算機的以太網卡。它的核心作用是實現高速、穩定、低延遲的圖像數據傳輸。以下是關于機器視覺網卡的關鍵信息:1.核心功能:高速圖像傳輸:處理來自
    的頭像 發表于 07-09 16:18 ?657次閱讀
    一文帶你了解什么是機器視覺<b class='flag-5'>網卡</b>

    如何將Linux安裝快速轉成玲瓏

    本篇將以 motrix 為例為大家展示如何將 Linux 安裝快速轉成玲瓏
    的頭像 發表于 03-12 16:01 ?1661次閱讀
    如何將<b class='flag-5'>Linux</b>安裝<b class='flag-5'>包</b>快速轉成玲瓏<b class='flag-5'>包</b>