序言
在開始之前,我們先用一張**釋 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丟...