0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

简述linux系统UDP丢包问题分析思路(上)

jf_78858299 来源:cizixs 作者:吴伟 2023-05-18 17:24 次阅读

最近工作中遇到某个服务器应用程序 UDP 丢包,在排查过程中查阅了很多资料,总结出来这篇文章,供更多人参考。

在开始之前,我们先用一张图解释 linux 系统接收网络报文的过程。

  1. 首先网络报文通过物理网线发送到网卡
  2. 网络驱动程序会把网络中的报文读出来放到 ring buffer 中,这个过程使用 DMA(Direct Memory Access),不需要 CPU 参与
  3. 内核从 ring buffer 中读取报文进行处理,执行 IP 和 TCP/UDP 层的逻辑,最后把报文放到应用程序的 socket buffer 中
  4. 应用程序从 socket buffer 中读取报文进行处理

图片

在接收 UDP 报文的过程中,图中任何一个过程都可能会主动或者被动地把报文丢弃,因此丢包可能发生在网卡和驱动,也可能发生在系统和应用。

之所以没有分析发送数据流程,一是因为发送流程和接收类似,只是方向相反;另外发送流程报文丢失的概率比接收小,只有在应用程序发送的报文速率大于内核和网卡处理速率时才会发生。

本篇文章假定机器只有一个名字为 eth0 的 interface,如果有多个 interface 或者 interface 的名字不是 eth0,请按照实际情况进行分析。

NOTE:文中出现的 RX(receive) 表示接收报文,TX(transmit) 表示发送报文。

确认有 UDP 丢包发生

要查看网卡是否有丢包,可以使用 ethtool -S eth0 查看,在输出中查找 bad 或者 drop 对应的字段是否有数据,在正常情况下,这些字段对应的数字应该都是 0。如果看到对应的数字在不断增长,就说明网卡有丢包。

另外一个查看网卡丢包数据的命令是 ifconfig,它的输出中会有 RX(receive 接收报文)和 TX(transmit 发送报文)的统计数据:

~#ifconfig eth0...        RX packets 3553389376  bytes 2599862532475 (2.3 TiB)        RX errors 0  dropped 1353  overruns 0  frame 0        TX packets 3479495131  bytes 3205366800850 (2.9 TiB)        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0...

此外,linux 系统也提供了各个网络协议的丢包信息,可以使用 netstat -s 命令查看,加上 --udp 可以只看 UDP 相关的报文数据:

[root@holodesk02 GOD]# netstat -s -uIcmpMsg:    InType0: 3    InType3: 1719356    InType8: 13    InType11: 59    OutType0: 13    OutType3: 1737641    OutType8: 10    OutType11: 263Udp:    517488890 packets received    2487375 packets to unknown port received.    47533568 packet receive errors    147264581 packets sent    12851135 receive buffer errors    0 send buffer errorsUdpLite:IpExt:    OutMcastPkts: 696    InBcastPkts: 2373968    InOctets: 4954097451540    OutOctets: 5538322535160    OutMcastOctets: 79632    InBcastOctets: 934783053    InNoECTPkts: 5584838675

对于上面的输出,关注下面的信息来查看 UDP 丢包的情况:

  • packet receive errors 不为空,并且在一直增长说明系统有 UDP 丢包
  • packets to unknown port received 表示系统接收到的 UDP 报文所在的目标端口没有应用在监听,一般是服务没有启动导致的,并不会造成严重的问题
  • receive buffer errors 表示因为 UDP 的接收缓存太小导致丢包的数量

NOTE:并不是丢包数量不为零就有问题,对于 UDP 来说,如果有少量的丢包很可能是预期的行为,比如丢包率(丢包数量/接收报文数量)在万分之一甚至更低。

网卡或者驱动丢包

之前讲过,如果 ethtool -S eth0 中有 rx_***_errors 那么很可能是网卡有问题,导致系统丢包,需要联系服务器或者网卡供应商进行处理。

# ethtool -S eth0 | grep rx_ | grep errors     rx_crc_errors: 0     rx_missed_errors: 0     rx_long_length_errors: 0     rx_short_length_errors: 0     rx_align_errors: 0     rx_errors: 0     rx_length_errors: 0     rx_over_errors: 0     rx_frame_errors: 0     rx_fifo_errors: 0

netstat -i 也会提供每个网卡的接发报文以及丢包的情况,正常情况下输出中 error 或者 drop 应该为 0。

如果硬件或者驱动没有问题,一般网卡丢包是因为设置的缓存区(ring buffer)太小,可以使用 ethtool 命令查看和设置网卡的 ring buffer。

ethtool -g 可以查看某个网卡的 ring buffer,比如下面的例子

# ethtool -g eth0Ring parameters for eth0:Pre-set maximums:RX:        4096RX Mini:    0RX Jumbo:    0TX:        4096Current hardware settings:RX:        256RX Mini:    0RX Jumbo:    0TX:        256

Pre-set 表示网卡最大的 ring buffer 值,可以使用 ethtool -G eth0 rx 8192 设置它的值。

Linux 系统丢包

linux 系统丢包的原因很多,常见的有:UDP 报文错误、防火墙、UDP buffer size 不足、系统负载过高等,这里对这些丢包原因进行分析。

UDP 报文错误

如果在传输过程中UDP 报文被修改,会导致 checksum 错误,或者长度错误,linux 在接收到 UDP 报文时会对此进行校验,一旦发明错误会把报文丢弃。

如果希望 UDP 报文 checksum 及时有错也要发送给应用程序,可以在通过 socket 参数禁用 UDP checksum 检查:

int disable = 1;setsockopt(sock_fd, SOL_SOCKET, SO_NO_CHECK, (void*)&disable, sizeof(disable)

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10855

    浏览量

    211610
  • Linux
    +关注

    关注

    87

    文章

    11296

    浏览量

    209361
  • dma
    dma
    +关注

    关注

    3

    文章

    561

    浏览量

    100554
  • 网络驱动
    +关注

    关注

    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次下载

    网卡

    网卡率(Loss Tolerance或packet loss rate)是指测试中
    发表于 12-26 12:09 1302次阅读

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

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

    Linux应用的延时和模拟

    合适之类,很多地方可以用到。  我们做的应用软件,还有测试 TCP/UDP  对比,测试 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:25 1506次阅读

    如何解决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>神器介绍

    网络故障如何定位

    是数据被包了,类似情况想必大家都不陌生。针对网络,本人提供一些常见的故障定位方法,希望能够帮助大家对网络
    的头像 发表于 11-10 11:27 1281次阅读
    网络<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>