那曲檬骨新材料有限公司

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

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

3天內不再提示

簡述linux系統UDP丟包問題分析思路(下)

jf_78858299 ? 來源:cizixs ? 作者:吳偉 ? 2023-05-18 17:25 ? 次閱讀

防火墻

如果系統防火墻丟包,表現的行為一般是所有的 UDP 報文都無法正常接收,當然不排除防火墻只 drop 一部分報文的可能性。

如果遇到丟包比率非常大的情況,請先檢查防火墻規則,保證防火墻沒有主動 drop UDP 報文。

UDP buffer size 不足

linux 系統在接收報文之后,會把報文保存到緩存區中。因為緩存區的大小是有限的,如果出現 UDP 報文過大(超過緩存區大小或者 MTU 大小)、接收到報文的速率太快,都可能導致 linux 因為緩存滿而直接丟包的情況。

在系統層面,linux 設置了 receive buffer 可以配置的最大值,可以在下面的文件中查看,一般是 linux 在啟動的時候會根據內存大小設置一個初始值。

  • /proc/sys/net/core/rmem_max:允許設置的 receive buffer 最大值
  • /proc/sys/net/core/rmem_default:默認使用的 receive buffer 值
  • /proc/sys/net/core/wmem_max:允許設置的 send buffer 最大值
  • /proc/sys/net/core/wmem_dafault:默認使用的 send buffer 最大值

但是這些初始值并不是為了應對大流量的 UDP 報文,如果應用程序接收和發送 UDP 報文非常多,需要講這個值調大??梢允褂?sysctl 命令讓它立即生效:

sysctl -w net.core.rmem_max=26214400 # 設置為 25M

也可以修改 /etc/sysctl.conf 中對應的參數在下次啟動時讓參數保持生效。

如果報文報文過大,可以在發送方對數據進行分割,保證每個報文的大小在 MTU 內。

另外一個可以配置的參數是 netdev_max_backlog,它表示 linux 內核從網卡驅動中讀取報文后可以緩存的報文數量,默認是 1000,可以調大這個值,比如設置成 2000:

sudo sysctl -w net.core.netdev_max_backlog=2000

系統負載過高

系統 CPU、memory、IO 負載過高都有可能導致網絡丟包,比如 CPU 如果負載過高,系統沒有時間進行報文的 checksum 計算、復制內存等操作,從而導致網卡或者 socket buffer 出丟包;memory 負載過高,會應用程序處理過慢,無法及時處理報文;IO 負載過高,CPU 都用來響應 IO wait,沒有時間處理緩存中的 UDP 報文。

linux 系統本身就是相互關聯的系統,任何一個組件出現問題都有可能影響到其他組件的正常運行。對于系統負載過高,要么是應用程序有問題,要么是系統不足。對于前者需要及時發現,debug 和修復;對于后者,也要及時發現并擴容。

應用丟包

上面提到系統的 UDP buffer size,調節的 sysctl 參數只是系統允許的最大值,每個應用程序在創建 socket 時需要設置自己 socket buffer size 的值。

linux 系統會把接受到的報文放到 socket 的 buffer 中,應用程序從 buffer 中不斷地讀取報文。所以這里有兩個和應用有關的因素會影響是否會丟包:socket buffer size 大小以及應用程序讀取報文的速度。

對于第一個問題,可以在應用程序初始化 socket 的時候設置 socket receive buffer 的大小,比如下面的代碼把 socket buffer 設置為 20MB:

uint64_t receive_buf_size = 20*1024*1024;  //20 MBsetsockopt(socket_fd, SOL_SOCKET, SO_RCVBUF, &receive_buf_size, sizeof(receive_buf_size));

如果不是自己編寫和維護的程序,修改應用代碼是件不好甚至不太可能的事情。很多應用程序會提供配置參數來調節這個值,請參考對應的官方文檔;如果沒有可用的配置參數,只能給程序的開發者提 issue 了。

很明顯,增加應用的 receive buffer 會減少丟包的可能性,但同時會導致應用使用更多的內存,所以需要謹慎使用。

另外一個因素是應用讀取 buffer 中報文的速度,對于應用程序來說,處理報文應該采取異步的方式

包丟在什么地方

想要詳細了解 linux 系統在執行哪個函數時丟包的話,可以使用 dropwatch 工具,它監聽系統丟包信息,并打印出丟包發生的函數地址:

# dropwatch -l kasInitalizing kallsyms dbdropwatch>startEnabling 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)

通過這些信息,找到對應的內核代碼處,就能知道內核在哪個步驟中把報文丟棄,以及大致的丟包原因。

此外,還可以使用 linux perf 工具監聽 kfree_skb(把網絡報文丟棄時會調用該函數) 事件的發生:

sudo perf record -g -a -e skb:kfree_skbsudo perf script

關于 perf 命令的使用和解讀,網上有很多文章可以參考。

總結

  • UDP 本身就是無連接不可靠的協議,適用于報文偶爾丟失也不影響程序狀態的場景,比如視頻音頻、游戲、監控等。對報文可靠性要求比較高的應用不要使用 UDP,推薦直接使用 TCP。當然,也可以在應用層做重試、去重保證可靠性
  • 如果發現服務器丟包,首先通過監控查看系統負載是否過高,先想辦法把負載降低再看丟包問題是否消失
  • 如果系統負載過高,UDP 丟包是沒有有效解決方案的。如果是應用異常導致 CPU、memory、IO 過高,請及時定位異常應用并修復;如果是資源不夠,監控應該能及時發現并快速擴容
  • 對于系統大量接收或者發送 UDP 報文的,可以通過調節系統和程序的 socket buffer size 來降低丟包的概率
  • 應用程序在處理 UDP 報文時,要采用異步方式,在兩次接收報文之間不要有太多的處理邏輯

參考資料

  • Pivotal: Network troubleshooting guide
  • What are udp “packet receive errors” and “packets to unknown port received”
  • Lost multicast packets troubleshooting guide
  • splunk Answers: UDP Drops on Linux

作者:吳偉

原文:

https://cizixs.com/2018/01/13/linux-udp-packet-drop-debug/

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

    關注

    68

    文章

    10902

    瀏覽量

    213013
  • TCP
    TCP
    +關注

    關注

    8

    文章

    1378

    瀏覽量

    79301
  • UDP
    UDP
    +關注

    關注

    0

    文章

    327

    瀏覽量

    34043
  • 網絡驅動
    +關注

    關注

    0

    文章

    7

    瀏覽量

    7423
收藏 人收藏

    評論

    相關推薦

    esp32 udp broadcast怎么避免?

    esp32 udp broadcast
    發表于 06-17 06:05

    udp數據的原因?

    編譯sdk/examples/protocols/sockets/udp_server 例子程序,修改了代碼,把發送回去的代碼注釋,只是記錄上次接收數據的時間和當前接收數據的時間間隔,運行一個
    發表于 06-25 07:03

    共享控制系統預測補償控制算法

    對共享控制系統中數據包在因特網傳輸過程發生的現象進行建模,分析
    發表于 03-21 15:01 ?16次下載

    LinuxUDP協議編程

    LinuxUDP協議編程 介紹UDP協議,并提供一個適用于客戶端和服務器端的實例子程序?! £P鍵詞:Linux
    發表于 10-16 22:22 ?3995次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>下</b>的<b class='flag-5'>UDP</b>協議編程

    網卡

    網卡率(Loss Tolerance或packet loss rate)是指測試中
    發表于 12-26 12:09 ?1306次閱讀

    網絡數據的原因及攝像機的原因

    不少人在使用網絡和監控攝像系統的時候都有遇到過數據的情況,數據的原因是多種多樣的,以下就為大家介紹一
    的頭像 發表于 01-11 09:27 ?1.3w次閱讀

    Linux應用的延時和模擬

      本文將要介紹的是 RHCA 中的一個 BDP 的測試,這也是公司很常用的一種延時和的模擬,你可以測試你的應用軟件在不同的情況的性能,也可以測試你 tcp/ip 調優后是否
    發表于 04-02 14:38 ?528次閱讀

    網絡時常用的排錯思路

    今天浩道跟大家分享硬核網絡故障排錯干貨,主要針對網絡時常用的排錯思路。讓你遇到網絡時,不再迷茫!
    的頭像 發表于 10-24 09:20 ?1782次閱讀

    Linux優化實戰:如何分析網絡的問題

    所謂,是指在網絡數據的收發過程中,由于種種原因,數據還沒傳輸到應用程序中,就被丟棄了。
    發表于 01-13 13:57 ?1026次閱讀

    深入分析Linux網絡問題!

    那到底是哪里發生了呢?排查之前,我們可以回憶一 Linux 的網絡收發流程,先從理論上分析,哪里有可能會發生
    的頭像 發表于 04-21 09:09 ?1185次閱讀

    深入分析Linux網絡問題

    所謂,是指在網絡數據的收發過程中,由于種種原因,數據還沒傳輸到應用程序中,就被丟棄了。這些被丟棄的數量,除以總的傳輸數,也就是我們
    的頭像 發表于 05-04 15:08 ?1602次閱讀
    深入<b class='flag-5'>分析</b><b class='flag-5'>Linux</b>網絡<b class='flag-5'>丟</b><b class='flag-5'>包</b>問題

    簡述linux系統UDP問題分析思路(上)

    在開始之前,我們先用一張圖解釋 linux 系統接收網絡報文的過程。 1. 首先網絡報文通過物理網線發送到網卡 2. 網絡驅動程序會把網絡中的報文讀出來放到 ring buffer 中,這個
    的頭像 發表于 05-18 17:24 ?2847次閱讀
    <b class='flag-5'>簡述</b><b class='flag-5'>linux</b><b class='flag-5'>系統</b><b class='flag-5'>UDP</b><b class='flag-5'>丟</b><b class='flag-5'>包</b>問題<b class='flag-5'>分析</b><b class='flag-5'>思路</b>(上)

    如何解決MPSoC萬兆以太網應用中UDP接收問題

    本文介紹如何使能 Linux 網絡協議棧中的 RFS(receive flow steering)功能以優化 MPSoC APU 的并行處理能力,解決問題。
    的頭像 發表于 06-14 10:10 ?1064次閱讀
    如何解決MPSoC萬兆以太網應用中<b class='flag-5'>UDP</b>接收<b class='flag-5'>丟</b><b class='flag-5'>包</b>問題

    Linux模擬網絡時延和神器介紹

    今天浩道跟大家分享推薦一款Linux用于模擬網絡時延和神器!有這些業務運維或測試場景的小伙伴,可以用起來了!
    發表于 07-02 14:07 ?1759次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>下</b>模擬網絡時延和<b class='flag-5'>丟</b><b class='flag-5'>包</b>神器介紹

    網絡問題分析

    通常會帶來嚴重的性能下降,特別是對 TCP 來說,通常意味著網絡擁塞和重傳,進而還會導致網絡延遲增大、吞吐降低。 一、 哪里可能 接下來,我就以最常用的反向代理服務器 Ngin
    的頭像 發表于 11-13 11:24 ?1116次閱讀
    網絡<b class='flag-5'>丟</b><b class='flag-5'>包</b>問題<b class='flag-5'>分析</b>
    百家乐游戏机路法| 大发888laohuji| 百家乐官网平台注册送彩金| 太阳城百家乐娱乐开户| 八大胜官网| 24山向中那个向最好| 宝马会娱乐城网址| 百家乐试玩平台| 百家乐官网制胜法宝| 百家乐策略网络游戏信誉怎么样 | 澳门金沙官网| 利记百家乐现金网| 皇冠在线娱乐| 百家乐b28博你| 百家乐官网博彩资讯论坛| 百家乐代理合作| 百家乐官网注册就送| 百家乐技巧技巧| 百家乐官网玩揽法大全| 钱柜娱乐城现金网| 做生意戴什么珠子招财| 百家乐官网游戏官网| 大发888娱| 帝王百家乐新足球平台| 澳门赌场图片| 百家乐下注技巧| 百家乐怎么压对子| 百家乐官网平注赢钱法| 六合彩网址大全| 公海百家乐的玩法技巧和规则 | 澳门百家乐官网海星王娱乐城| 六合彩大全| 皇冠网百家乐啊| 风水24向吉项| 百家乐官网10个人| 阳泉市| 大发888在线娱乐| 百家乐五湖四海赌场娱乐网规则| 转载24山五行相克| 百家乐官网和| 金豪娱乐|