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

    文章

    11216

    浏览量

    222928
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1418

    浏览量

    83015
  • UDP
    UDP
    +关注

    关注

    0

    文章

    331

    浏览量

    35212
  • 网络驱动
    +关注

    关注

    0

    文章

    7

    浏览量

    7528
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    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协议,并提供一个适用于客户端和服务器端的实例子程序。  关键词:Linux
    发表于 10-16 22:22 4117次阅读
    <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 1396次阅读

    网络数据的原因及摄像机的原因

    不少人在使用网络和监控摄像系统的时候都有遇到过数据的情况,数据的原因是多种多样的,以下就为大家介绍一
    的头像 发表于 01-11 09:27 1.4w次阅读

    Linux应用的延时和模拟

      本文将要介绍的是 RHCA 中的一个 BDP 的测试,这也是公司很常用的一种延时和的模拟,你可以测试你的应用软件在不同的情况的性能,也可以测试你 tcp/ip 调优后是否
    发表于 04-02 14:38 795次阅读

    网络时常用的排错思路

    今天浩道跟大家分享硬核网络故障排错干货,主要针对网络时常用的排错思路。让你遇到网络时,不再迷茫!
    的头像 发表于 10-24 09:20 2544次阅读

    Linux优化实战:如何分析网络的问题

    所谓,是指在网络数据的收发过程中,由于种种原因,数据还没传输到应用程序中,就被丢弃了。
    发表于 01-13 13:57 1547次阅读

    深入分析Linux网络问题!

    那到底是哪里发生了呢?排查之前,我们可以回忆一 Linux 的网络收发流程,先从理论上分析,哪里有可能会发生
    的头像 发表于 04-21 09:09 1770次阅读

    深入分析Linux网络问题

    所谓,是指在网络数据的收发过程中,由于种种原因,数据还没传输到应用程序中,就被丢弃了。这些被丢弃的数量,除以总的传输数,也就是我们
    的头像 发表于 05-04 15:08 3787次阅读
    深入<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 3407次阅读
    <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 1839次阅读
    如何解决MPSoC万兆以太网应用中<b class='flag-5'>UDP</b>接收<b class='flag-5'>丢</b><b class='flag-5'>包</b>问题

    Linux模拟网络时延和神器介绍

    今天浩道跟大家分享推荐一款Linux用于模拟网络时延和神器!有这些业务运维或测试场景的小伙伴,可以用起来了!
    发表于 07-02 14:07 2230次阅读
    <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 2224次阅读
    网络<b class='flag-5'>丢</b><b class='flag-5'>包</b>问题<b class='flag-5'>分析</b>