RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

簡(jiǎn)述linux系統(tǒng)UDP丟包問(wèn)題分析思路(下)

jf_78858299 ? 來(lái)源:cizixs ? 作者:吳偉 ? 2023-05-18 17:25 ? 次閱讀

防火墻

如果系統(tǒng)防火墻丟包,表現(xiàn)的行為一般是所有的 UDP 報(bào)文都無(wú)法正常接收,當(dāng)然不排除防火墻只 drop 一部分報(bào)文的可能性。

如果遇到丟包比率非常大的情況,請(qǐng)先檢查防火墻規(guī)則,保證防火墻沒(méi)有主動(dòng) drop UDP 報(bào)文。

UDP buffer size 不足

linux 系統(tǒng)在接收?qǐng)?bào)文之后,會(huì)把報(bào)文保存到緩存區(qū)中。因?yàn)榫彺鎱^(qū)的大小是有限的,如果出現(xiàn) UDP 報(bào)文過(guò)大(超過(guò)緩存區(qū)大小或者 MTU 大小)、接收到報(bào)文的速率太快,都可能導(dǎo)致 linux 因?yàn)榫彺鏉M而直接丟包的情況。

在系統(tǒng)層面,linux 設(shè)置了 receive buffer 可以配置的最大值,可以在下面的文件中查看,一般是 linux 在啟動(dòng)的時(shí)候會(huì)根據(jù)內(nèi)存大小設(shè)置一個(gè)初始值。

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

但是這些初始值并不是為了應(yīng)對(duì)大流量的 UDP 報(bào)文,如果應(yīng)用程序接收和發(fā)送 UDP 報(bào)文非常多,需要講這個(gè)值調(diào)大??梢允褂?sysctl 命令讓它立即生效:

sysctl -w net.core.rmem_max=26214400 # 設(shè)置為 25M

也可以修改 /etc/sysctl.conf 中對(duì)應(yīng)的參數(shù)在下次啟動(dòng)時(shí)讓參數(shù)保持生效。

如果報(bào)文報(bào)文過(guò)大,可以在發(fā)送方對(duì)數(shù)據(jù)進(jìn)行分割,保證每個(gè)報(bào)文的大小在 MTU 內(nèi)。

另外一個(gè)可以配置的參數(shù)是 netdev_max_backlog,它表示 linux 內(nèi)核從網(wǎng)卡驅(qū)動(dòng)中讀取報(bào)文后可以緩存的報(bào)文數(shù)量,默認(rèn)是 1000,可以調(diào)大這個(gè)值,比如設(shè)置成 2000:

sudo sysctl -w net.core.netdev_max_backlog=2000

系統(tǒng)負(fù)載過(guò)高

系統(tǒng) CPU、memory、IO 負(fù)載過(guò)高都有可能導(dǎo)致網(wǎng)絡(luò)丟包,比如 CPU 如果負(fù)載過(guò)高,系統(tǒng)沒(méi)有時(shí)間進(jìn)行報(bào)文的 checksum 計(jì)算、復(fù)制內(nèi)存等操作,從而導(dǎo)致網(wǎng)卡或者 socket buffer 出丟包;memory 負(fù)載過(guò)高,會(huì)應(yīng)用程序處理過(guò)慢,無(wú)法及時(shí)處理報(bào)文;IO 負(fù)載過(guò)高,CPU 都用來(lái)響應(yīng) IO wait,沒(méi)有時(shí)間處理緩存中的 UDP 報(bào)文。

linux 系統(tǒng)本身就是相互關(guān)聯(lián)的系統(tǒng),任何一個(gè)組件出現(xiàn)問(wèn)題都有可能影響到其他組件的正常運(yùn)行。對(duì)于系統(tǒng)負(fù)載過(guò)高,要么是應(yīng)用程序有問(wèn)題,要么是系統(tǒng)不足。對(duì)于前者需要及時(shí)發(fā)現(xiàn),debug 和修復(fù);對(duì)于后者,也要及時(shí)發(fā)現(xiàn)并擴(kuò)容。

應(yīng)用丟包

上面提到系統(tǒng)的 UDP buffer size,調(diào)節(jié)的 sysctl 參數(shù)只是系統(tǒng)允許的最大值,每個(gè)應(yīng)用程序在創(chuàng)建 socket 時(shí)需要設(shè)置自己 socket buffer size 的值。

linux 系統(tǒng)會(huì)把接受到的報(bào)文放到 socket 的 buffer 中,應(yīng)用程序從 buffer 中不斷地讀取報(bào)文。所以這里有兩個(gè)和應(yīng)用有關(guān)的因素會(huì)影響是否會(huì)丟包:socket buffer size 大小以及應(yīng)用程序讀取報(bào)文的速度。

對(duì)于第一個(gè)問(wèn)題,可以在應(yīng)用程序初始化 socket 的時(shí)候設(shè)置 socket receive buffer 的大小,比如下面的代碼把 socket buffer 設(shè)置為 20MB:

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

如果不是自己編寫(xiě)和維護(hù)的程序,修改應(yīng)用代碼是件不好甚至不太可能的事情。很多應(yīng)用程序會(huì)提供配置參數(shù)來(lái)調(diào)節(jié)這個(gè)值,請(qǐng)參考對(duì)應(yīng)的官方文檔;如果沒(méi)有可用的配置參數(shù),只能給程序的開(kāi)發(fā)者提 issue 了。

很明顯,增加應(yīng)用的 receive buffer 會(huì)減少丟包的可能性,但同時(shí)會(huì)導(dǎo)致應(yīng)用使用更多的內(nèi)存,所以需要謹(jǐn)慎使用。

另外一個(gè)因素是應(yīng)用讀取 buffer 中報(bào)文的速度,對(duì)于應(yīng)用程序來(lái)說(shuō),處理報(bào)文應(yīng)該采取異步的方式

包丟在什么地方

想要詳細(xì)了解 linux 系統(tǒng)在執(zhí)行哪個(gè)函數(shù)時(shí)丟包的話,可以使用 dropwatch 工具,它監(jiān)聽(tīng)系統(tǒng)丟包信息,并打印出丟包發(fā)生的函數(shù)地址:

# 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)

通過(guò)這些信息,找到對(duì)應(yīng)的內(nèi)核代碼處,就能知道內(nèi)核在哪個(gè)步驟中把報(bào)文丟棄,以及大致的丟包原因。

此外,還可以使用 linux perf 工具監(jiān)聽(tīng) kfree_skb(把網(wǎng)絡(luò)報(bào)文丟棄時(shí)會(huì)調(diào)用該函數(shù)) 事件的發(fā)生:

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

關(guān)于 perf 命令的使用和解讀,網(wǎng)上有很多文章可以參考。

總結(jié)

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

參考資料

  • 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/

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10854

    瀏覽量

    211578
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1353

    瀏覽量

    79055
  • UDP
    UDP
    +關(guān)注

    關(guān)注

    0

    文章

    325

    瀏覽量

    33931
  • 網(wǎng)絡(luò)驅(qū)動(dòng)

    關(guān)注

    0

    文章

    7

    瀏覽量

    7409
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    esp32 udp broadcast怎么避免?

    esp32 udp broadcast
    發(fā)表于 06-17 06:05

    udp數(shù)據(jù)的原因?

    編譯sdk/examples/protocols/sockets/udp_server 例子程序,修改了代碼,把發(fā)送回去的代碼注釋,只是記錄上次接收數(shù)據(jù)的時(shí)間和當(dāng)前接收數(shù)據(jù)的時(shí)間間隔,運(yùn)行一個(gè)
    發(fā)表于 06-25 07:03

    共享控制系統(tǒng)預(yù)測(cè)補(bǔ)償控制算法

    對(duì)共享控制系統(tǒng)中數(shù)據(jù)包在因特網(wǎng)傳輸過(guò)程發(fā)生的現(xiàn)象進(jìn)行建模,分析對(duì)
    發(fā)表于 03-21 15:01 ?16次下載

    LinuxUDP協(xié)議編程

    LinuxUDP協(xié)議編程 介紹UDP協(xié)議,并提供一個(gè)適用于客戶端和服務(wù)器端的實(shí)例子程序?! £P(guān)鍵詞:Linux
    發(fā)表于 10-16 22:22 ?3974次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>下</b>的<b class='flag-5'>UDP</b>協(xié)議編程

    網(wǎng)卡

    網(wǎng)卡率(Loss Tolerance或packet loss rate)是指測(cè)試中
    發(fā)表于 12-26 12:09 ?1302次閱讀

    網(wǎng)絡(luò)數(shù)據(jù)的原因及攝像機(jī)的原因

    不少人在使用網(wǎng)絡(luò)和監(jiān)控?cái)z像系統(tǒng)的時(shí)候都有遇到過(guò)數(shù)據(jù)的情況,數(shù)據(jù)的原因是多種多樣的,以下就為大家介紹一
    的頭像 發(fā)表于 01-11 09:27 ?1.3w次閱讀

    Linux應(yīng)用的延時(shí)和模擬

      本文將要介紹的是 RHCA 中的一個(gè) BDP 的測(cè)試,這也是公司很常用的一種延時(shí)和的模擬,你可以測(cè)試你的應(yīng)用軟件在不同的情況的性能,也可以測(cè)試你 tcp/ip 調(diào)優(yōu)后是否
    發(fā)表于 04-02 14:38 ?486次閱讀

    網(wǎng)絡(luò)時(shí)常用的排錯(cuò)思路

    今天浩道跟大家分享硬核網(wǎng)絡(luò)故障排錯(cuò)干貨,主要針對(duì)網(wǎng)絡(luò)時(shí)常用的排錯(cuò)思路。讓你遇到網(wǎng)絡(luò)時(shí),不再迷茫!
    的頭像 發(fā)表于 10-24 09:20 ?1684次閱讀

    Linux優(yōu)化實(shí)戰(zhàn):如何分析網(wǎng)絡(luò)的問(wèn)題

    所謂,是指在網(wǎng)絡(luò)數(shù)據(jù)的收發(fā)過(guò)程中,由于種種原因,數(shù)據(jù)還沒(méi)傳輸?shù)綉?yīng)用程序中,就被丟棄了。
    發(fā)表于 01-13 13:57 ?969次閱讀

    深入分析Linux網(wǎng)絡(luò)問(wèn)題!

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

    深入分析Linux網(wǎng)絡(luò)問(wèn)題

    所謂,是指在網(wǎng)絡(luò)數(shù)據(jù)的收發(fā)過(guò)程中,由于種種原因,數(shù)據(jù)還沒(méi)傳輸?shù)綉?yīng)用程序中,就被丟棄了。這些被丟棄的數(shù)量,除以總的傳輸數(shù),也就是我們
    的頭像 發(fā)表于 05-04 15:08 ?1394次閱讀
    深入<b class='flag-5'>分析</b><b class='flag-5'>Linux</b>網(wǎng)絡(luò)<b class='flag-5'>丟</b><b class='flag-5'>包</b>問(wèn)題

    簡(jiǎn)述linux系統(tǒng)UDP問(wèn)題分析思路(上)

    在開(kāi)始之前,我們先用一張圖解釋 linux 系統(tǒng)接收網(wǎng)絡(luò)報(bào)文的過(guò)程。 1. 首先網(wǎng)絡(luò)報(bào)文通過(guò)物理網(wǎng)線發(fā)送到網(wǎng)卡 2. 網(wǎng)絡(luò)驅(qū)動(dòng)程序會(huì)把網(wǎng)絡(luò)中的報(bào)文讀出來(lái)放到 ring buffer 中,這個(gè)
    的頭像 發(fā)表于 05-18 17:24 ?2763次閱讀
    <b class='flag-5'>簡(jiǎn)述</b><b class='flag-5'>linux</b><b class='flag-5'>系統(tǒng)</b><b class='flag-5'>UDP</b><b class='flag-5'>丟</b><b class='flag-5'>包</b>問(wèn)題<b class='flag-5'>分析</b><b class='flag-5'>思路</b>(上)

    如何解決MPSoC萬(wàn)兆以太網(wǎng)應(yīng)用中UDP接收問(wèn)題

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

    Linux模擬網(wǎng)絡(luò)時(shí)延和神器介紹

    今天浩道跟大家分享推薦一款Linux用于模擬網(wǎng)絡(luò)時(shí)延和神器!有這些業(yè)務(wù)運(yùn)維或測(cè)試場(chǎng)景的小伙伴,可以用起來(lái)了!
    發(fā)表于 07-02 14:07 ?1692次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>下</b>模擬網(wǎng)絡(luò)時(shí)延和<b class='flag-5'>丟</b><b class='flag-5'>包</b>神器介紹

    網(wǎng)絡(luò)問(wèn)題分析

    通常會(huì)帶來(lái)嚴(yán)重的性能下降,特別是對(duì) TCP 來(lái)說(shuō),通常意味著網(wǎng)絡(luò)擁塞和重傳,進(jìn)而還會(huì)導(dǎo)致網(wǎng)絡(luò)延遲增大、吞吐降低。 一、 哪里可能 接下來(lái),我就以最常用的反向代理服務(wù)器 Ngin
    的頭像 發(fā)表于 11-13 11:24 ?1008次閱讀
    網(wǎng)絡(luò)<b class='flag-5'>丟</b><b class='flag-5'>包</b>問(wèn)題<b class='flag-5'>分析</b>
    RM新时代网站-首页