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

2021-10-25 18:31:33 字數 1602 閱讀 9337

序言

在開始之前,我們先用一張**釋 linux 系統接收網路報文的過程。

首先網路報文通過物理網線傳送到網絡卡

網路驅動程式會把網路中的報文讀出來放到 ring buffer 中,這個過程使用 dma(direct memory access),不需要 cpu 參與

核心從 ring buffer 中讀取報文進行處理,執行 ip 和 tcp/udp 層的邏輯,最後把報文放到應用程式的 socket buffer 中

應用程式從 socket buffer 中讀取報文進行處理

確認有 udp 丟包發生

網絡卡或者驅動丟包

linux 系統丟包

udp 報文錯誤

防火牆

udp buffer size 不足

系統負載過高

應用丟包

包丟在什麼地方

# dropwatch -l kas

initalizing kallsyms db

dropwatch> start

enabling monitoring...

kernel monitoring activated.

issue ctrl-c to stop monitoring

1 drops at tcp_v4_do_rcv+cd (0xffffffff81799bad)

10 drops at tcp_v4_rcv+80 (0xffffffff8179a620)

1 drops at sk_stream_kill_queues+57 (0xffffffff81729ca7)

4 drops at unix_release_sock+20e (0xffffffff817dc94e)

1 drops at igmp_rcv+e1 (0xffffffff817b4c41)

1 drops at igmp_rcv+e1 (0xffffffff817b4c41)

sudo perf record -g -a -e skb:kfree_skb

sudo perf script

總結如果發現伺服器丟包,首先通過監控檢視系統負載是否過高,先想辦法把負載降低再看丟包問題是否消失

如果系統負載過高,udp 丟包是沒有有效解決方案的。如果是應用異常導致 cpu、memory、io 過高,請及時定位異常應用並修復;如果是資源不夠,監控應該能及時發現並快速擴容

對於系統大量接收或者傳送 udp 報文的,可以通過調節系統和程式的 socket buffer size 來降低丟包的概率

應用程式在處理 udp 報文時,要採用非同步方式,在兩次接收報文之間不要有太多的處理邏輯

linux系統核心UDP丟包原因分析

linux系統核心udp丟包原因分析 1 udp校驗和錯誤 現象 可以用netstat su 檢視到有udp錯包。tcpdump捕包,在wireshark開啟捕獲的udp報文,開啟校驗和選項,有錯包。方案 查詢鏈路故障 www.ahlinux.com 2 防火牆開啟 現象 特定埠的包收不到 方案 使...

Linux系統核心UDP丟包原因分析

本文討論的udp丟包是指網絡卡接收到資料報後,linux核心的tcp ip協議棧在udp資料報處理過程中的丟包,主要原因有兩個 1 udp資料報格式錯誤或校驗和檢查失敗 2 應用程式來不及處理udp資料報 對於原因1 udp資料報本身的錯誤很少見,應用程式也不可控,本文不討論。首先介紹通用的udp丟...

Linux系統核心UDP丟包原因分析

本文討論的udp丟包是指網絡卡接收到資料報後,linux核心的tcp ip協議棧在udp資料報處理過程中的丟包,主要原因有兩個 1 udp資料報格式錯誤或校驗和檢查失敗 2 應用程式來不及處理udp資料報 對於原因1 udp資料報本身的錯誤很少見,應用程式也不可控,本文不討論。首先介紹通用的udp丟...