最近工做中遇到某個服務器應用程序 UDP 丟包,在排查過程當中查閱了不少資料,總結出來這篇文章,供更多人蔘考。linux
在開始以前,咱們先用一張圖解釋 linux 系統接收網絡報文的過程。服務器
● 首先網絡報文經過物理網線發送到網卡
● 網絡驅動程序會把網絡中的報文讀出來放到 ring buffer 中,這個過程使用 DMA(Direct Memory Access),不須要 CPU 參與
● 內核從 ring buffer 中讀取報文進行處理,執行 IP 和 TCP/UDP 層的邏輯,最後把報文放到應用程序的 socket buffer 中網絡
● 應用程序從 socket buffer 中讀取報文進行處理socket
在接收 UDP 報文的過程當中,圖中任何一個過程均可能會主動或者被動地把報文丟棄,所以丟包可能發生在網卡和驅動,也可能發生在系統和應用。code
之因此沒有分析發送數據流程,一是由於發送流程和接收相似,只是方向相反;另外發送流程報文丟失的機率比接收小,只有在應用程序發送的報文速率大於內核和網卡處理速率時纔會發生。blog
本篇文章假定機器只有一個名字爲 eth0 的 interface,若是有多個 interface 或者 interface 的名字不是 eth0,請按照實際狀況進行分析。it
NOTE:文中出現的 RX
(receive) 表示接收報文,TX
(transmit) 表示發送報文。程序
確認有 UDP 丟包發生im