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

2021-07-27 10:43:08 字數 2091 閱讀 9048

本文討論的udp丟包是指網絡卡接收到資料報後,linux核心的tcp/ip協議棧在udp資料報處理過程中的丟包,主要原因有兩個:

1)        udp資料報格式錯誤或校驗和檢查失敗

2)        應用程式來不及處理udp資料報

對於原因1),udp資料報本身的錯誤很少見,應用程式也不可控,本文不討論。

首先介紹通用的udp丟包檢測方法,使用netstat命令,加-su引數。

# netstat -su

udp:

380408160 packets received

17 packets to unknown port received.

62314 packet receive errors

397718604 packets sent

從上面的輸出中,可以看到有一行輸出包含了「packet receive errors「,如果每隔一段時間執行netstat -su,發現行首的數字不斷變大,表明發生了udp丟包。

下面介紹一下udp丟包的常見原因:

1)    linux核心socket緩衝區設的太小

通過 cat /proc/sys/net/core/rmem_default 和cat /proc/sys/net/core/rmem_max可以檢視socket緩衝區的預設值和最大值。rmem_default和rmem_max設定為多大合適呢?如果伺服器的效能壓力不大,對處理時延也沒有很嚴格的要求,設定為1m左右即可。如果伺服器的效能壓力較大,或者對處理時延有很嚴格的要求,則必須謹慎設定rmem_default 和rmem_max,如果設得過小,會導致丟包,如果設得過大,會出現滾雪球。socket緩衝區設的過大導致滾雪球的問題,大家可以參考中的介紹,有定量的計算方法,分析得很深入。

2)    伺服器負載過高,占用了大量cpu資源,無法及時處理linux核心socket緩衝區中的udp資料報,導致丟包

一般來說,伺服器負載過高有兩個原因:收到的udp包過多;伺服器程序存在效能瓶頸。如果收到的udp包過多,就要考慮擴容了,從日常運營的經驗來看,公司現有的b5機器,在業務邏輯不複雜(簡單的打包解包和記憶體hash等操作)、不超過網絡卡流量限制的情況下,每秒可以處理25萬個udp包。至於如何提高伺服器的效能,屬於高效能伺服器的設計和實現範疇,功力有限,不敢在這裡班門弄斧,自己平時使用最多也就是三板斧:top+strace+ltrace,先使用top檢視cpu核心態時間和使用者態時間的比例,如果核心態時間佔大頭,就用strace檢視主要的系統呼叫有哪些;如果如果使用者態時間佔大頭,就用ltrace檢視主要的庫函式呼叫有哪些。找到效能瓶頸後,想辦法優化系統架構和業務邏輯,減少不必要的系統呼叫和庫函式呼叫。從以往的經驗來看,很容易犯的乙個錯誤是呼叫不必要的memset或memcpy操作一大片記憶體,當請求量小的時候,發現不了問題,一旦突發的請求過來,觸發大量的memset或memcpy操作,占用了cpu資源,導致丟包和滾雪球,讓人措手不及,所以系統上線前,一定要做好壓力測試,通過壓力測試找出效能瓶頸,將危險消滅在萌芽狀態。

3)     磁碟io忙

伺服器有大量io操作,會導致程序阻塞,cpu都在等待磁碟io,不能及時處理核心socket緩衝區中的udp資料報。如果業務本身就是io密集型的,要考慮在架構上進行優化,合理使用快取降低磁碟io。這裡有乙個容易忽視的問題:很多伺服器都有在本地磁碟記錄日誌的功能,由於運維誤操作導致日誌記錄的級別過高,或者某些錯誤突然大量出現,使得往磁碟寫日誌的io請求量很大,磁碟io忙,導致udp丟包。對於運維誤操作,可以加強運營環境的管理,防止出錯。如果業務確實需要記錄大量的日誌,可以使用記憶體log或者遠端log。

4)    物理記憶體不夠用,出現swap交換

swap交換本質上也是一種磁碟io忙,因為比較特殊,容易被忽視,所以單列出來。只要規劃好物理記憶體的使用,並且合理設定系統引數,可以避免這個問題。

5)    磁碟滿導致無法io

沒有規劃好磁碟的使用,監控不到位,導致磁碟被寫滿後伺服器程序無法io,處於阻塞狀態。公司的監控中心對機器的磁碟使用率有監控,使用率超過95%會通知機器負責人處理。但是如果機器負責人錯過了告警,或者沒有及時處理告警,仍然會導致磁碟被寫滿。最根本的辦法是規劃好磁碟的使用,防止業務資料或日誌檔案把磁碟塞滿,同時加強監控,例如開發乙個通用的工具,當磁碟使用率達到80%時就持續告警,留出充足的反應時間。

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 丟包問題分析思路

序言 在開始之前,我們先用一張 釋 linux 系統接收網路報文的過程。首先網路報文通過物理網線傳送到網絡卡 網路驅動程式會把網路中的報文讀出來放到 ring buffer 中,這個過程使用 dma direct memory access 不需要 cpu 參與 核心從 ring buffer 中讀...