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

    文章

    10855

    浏览量

    211611
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1353

    浏览量

    79059
  • UDP
    UDP
    +关注

    关注

    0

    文章

    325

    浏览量

    33933
  • 网络驱动
    +关注

    关注

    0

    文章

    7

    浏览量

    7409
收藏 人收藏

    评论

    相关推荐

    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 3974次阅读
    <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 1302次阅读

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

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

    Linux应用的延时和模拟

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

    网络时常用的排错思路

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

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

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

    深入分析Linux网络问题!

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

    深入分析Linux网络问题

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

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

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