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

    文章

    10442

    浏览量

    206564
  • Linux
    +关注

    关注

    87

    文章

    10991

    浏览量

    206736
  • dma
    dma
    +关注

    关注

    3

    文章

    535

    浏览量

    99021
  • 网络驱动
    +关注

    关注

    0

    文章

    7

    浏览量

    7380
收藏 人收藏

    评论

    相关推荐

    UDP高速传输问题

    ,发送过快也会。如果是要实现高速不,用那种方式,实现较妥当?labview的UDP接收数据函数最大可接收多少字节的数据呢?、现将我写
    发表于 05-24 10:48

    无线433应用率高

    无线433应用在LED电源驱动板率高
    发表于 07-14 11:23

    cc2540 的问题

    本人用的是公司自己做的板子。发现发送数据间隔相同,TI的开发板能够不,但是我们自己做的板子却比较严重。只有加大发送数据的间隔才能使自己做的板子不
    发表于 05-14 01:03

    ATK-LORA-01产生现象

    目前在做一款产品 监测系统 就是传感器将数据采集后通过407开发板发给无线模块 但是模块有个fifo512k的缓存 在发送过程中就不接受存数了 这样会产生现象 接收部分同理 各位大神帮忙给
    发表于 01-24 06:35

    请问STM32F1 LWIP UDP广播发送数据严重该怎么办?

    如题:STM32F1 LWIP UDP 一个设备广播发送数据到同一个物理网络的其他 N 个设备,接收广播数据的设备数量不固定而且IP也不确定,这些设备都通过网线连接到一个交换机上,接受广播数据的设备经常
    发表于 09-02 20:32

    网络常见故障分析及处理方式

      网络有问题,首先我们会进行ping命令,所谓网络是我们在使用ping命令(检测某个系统能否正常运行)对目的站进行询问时,数据由于各种原因在信道中丢失的现象。  测试是否
    发表于 12-01 16:04

    网络数据及摄像机的原因

      不少人在使用网络和监控摄像系统的时候都有遇到过数据的情况,数据的原因是多种多样的,以下就为大家介绍一下网络数据
    发表于 02-19 17:30

    嵌入式Linux系统简述

    简述嵌入式Linux系统一般是将应用程序与文件系统、内核、资源文件等放在不同的分区,产品量产后内核、文件系统这些一般不会升级,应用程序可能升
    发表于 12-21 08:15

    怎样去解决CAN发送与接收的问题

    CAN发送与接收的问题硬件:STM32F4IGT6操作系统:RTTV4.1.0CAN使用RTT的设备驱动CAN波特率 1Mbps通讯线不超过1米,电机CAN线和单片机CAN线与分析
    发表于 11-08 11:27

    esp32 udp broadcast问题如何解决?

    https://www.esp32.com/viewtopic.php?f=1 ... ee512eccf2我遇到和这个一样的问题(我也没有使用蓝牙),请问有人知道如何解决吗?
    发表于 02-14 06:41

    Linux操作系统简述

    Linux操作系统简述一、计算机软件与操作系统  功能强大的计算机自从走进了人类的生活就发挥着越来越重要的作用,随着时代的发展,计算机已
    发表于 01-18 12:43 1171次阅读

    Linux下的UDP协议编程

    Linux下的UDP协议编程 介绍UDP协议,并提供一个适用于客户端和服务器端的实例子程序。  关键词:LinuxUDP协议;TCP/I
    发表于 10-16 22:22 3872次阅读
    <b class='flag-5'>Linux</b>下的<b class='flag-5'>UDP</b>协议编程

    利用6 个 Linux 运维典型问题来分析处理问题的思路

    结合上面介绍的 Linux 运维问题的解决思路后,下面我们挑选了6个比较典型的 Linux 运维问题,来看看是如何分析和解决的。
    的头像 发表于 01-13 10:37 2767次阅读

    微波拉远系统问题分析及解决思路

    微波拉远系统问题分析及解决思路分享。
    发表于 06-08 10:13 11次下载

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

    在开始之前,我们先用一张图解释 linux 系统接收网络报文的过程。 1. 首先网络报文通过物理网线发送到网卡 2. 网络驱动程序会把网络中的报文读出来放到 ring buffer 中,这个
    的头像 发表于 05-18 17:25 1163次阅读