Linux UDP丢包的原因

     2023-04-15     278

关键词:

【中文标题】Linux UDP丢包的原因【英文标题】:Causes of Linux UDP packet drops 【发布时间】:2011-08-20 06:37:08 【问题描述】:

我有一个接收有序 UDP 数据包的 Linux C++ 应用程序。由于排序,我可以很容易地确定数据包何时丢失或重新排序,即何时遇到“间隙”。系统具有处理间隙的恢复机制,但是,最好首先避免间隙。使用一个简单的基于 libpcap 的数据包嗅探器,我确定硬件级别的数据没有间隙。但是,我在我的申请中看到了很多空白。这表明内核正在丢弃数据包;通过查看 /proc/net/snmp 文件可以确认。当我的应用程序遇到间隙时,Udp InErrors 计数器会增加。

在系统层面,我们增加了最大接收缓冲区:

# sysctl net.core.rmem_max
net.core.rmem_max = 33554432

在应用程序级别,我们增加了接收缓冲区大小:

int sockbufsize = 33554432
int ret = setsockopt(my_socket_fd, SOL_SOCKET, SO_RCVBUF,
        (char *)&sockbufsize,  (int)sizeof(sockbufsize));
// check return code
sockbufsize = 0;
ret = getsockopt(my_socket_fd, SOL_SOCKET, SO_RCVBUF, 
        (char*)&sockbufsize, &size);
// print sockbufsize

在调用 getsockopt() 之后,打印的值始终是设置值的 2 倍(上例中为 67108864),但我相信这是意料之中的。

我知道未能足够快地使用数据会导致数据包丢失。然而,这个应用程序所做的只是检查排序,然后将数据推送到队列中;实际处理在另一个线程中完成。此外,这台机器很现代(双 Xeon X5560,8 GB RAM)并且负载非常轻。我们实际上有几十个相同的应用程序以更高的速率接收数据,它们没有遇到这个问题。

除了消耗太慢的应用程序之外,还有其他原因会导致 Linux 内核丢弃 UDP 数据包吗?

FWIW,这是在 CentOS 4 上,内核为 2.6.9-89.0.25.ELlargesmp。

【问题讨论】:

检查您的电缆,会发生位错误,尤其是当您将电缆缠绕在电噪声源上时。可能是一个有问题的驱动程序/网卡,看看你是否可以关闭/打开校验和卸载。请记住,交换机等网络元素可能会丢弃数据包。用wireshark监控你的流量并寻找可疑的东西。您可能需要对您的应用进行测试,以验证您在任何地方都没有出现过多的延迟(例如,在互斥体上等待的时间过长),因此您确定自己的阅读速度足够快。 pcap 应用程序确认 NIC 正在接收所有数据包,因此这不是接线或交换机问题。至于程序本身,我使用的代码与许多其他应用程序共享的完全相同。此连接是唯一有问题的连接。 入站校验和是否不正确? 【参考方案1】:

如果您的线程数多于内核数并且它们之间的线程优先级相同,则接收线程很可能需要时间来刷新传入缓冲区。考虑以比其他线程更高的优先级运行该线程。

类似地,虽然通常效率较低,但将接收线程绑定到一个内核,这样您就不会承受在内核之间切换和相关缓存刷新的开销。

【讨论】:

这听起来确实像是读取线程在这里被饿死了。不过,可能是系统中的其他进程导致了饥饿。 澄清一下:“刷新传入缓冲区”是指跟上传入消息的速度,还是有更微妙的含义? @aix: 是的,基本上读取套接字上所有可用的内容。 如果您运行top 并键入1 以启用每CPU 显示,是否有任何CPU/内核显示0% 空闲时间?如果是这样,那么接收线程饥饿很可能是问题所在。【参考方案2】:

我的程序也有类似的问题。它的任务是在一个线程中接收 udp 数据包,并使用阻塞队列,通过另一个线程将它们写入数据库。

我注意到(使用vmstat 1)当系统遇到繁重的 I/O 等待操作(读取)时,我的应用程序没有收到数据包,但系统正在接收它们。

问题是 - 当大量 I/O 等待发生时,正在写入数据库的线程在持有队列互斥锁时 I/O 不足。这样 udp 缓冲区就会被传入的数据包溢出,因为接收它们的主线程挂在 pthred_mutex_lock() 上。

我通过使用我的进程和数据库进程的 ioniceness(ionice 命令)来解决它。将 I/O 调度类更改为 Best Effort 有所帮助。令人惊讶的是,即使使用默认的 I/O,我现在也无法重现此问题。 我的内核是 2.6.32-71.el6.x86_64。

我仍在开发这个应用程序,所以我会在了解更多信息后尝试更新我的帖子。

【讨论】:

【参考方案3】:

int ret = setsockopt(my_socket_fd, SOL_SOCKET, SO_RCVBUF, (char *)&sockbufsize, (int)sizeof(sockbufsize));

首先,setsockopt 采用 (int, int, int, void *, socklen_t),因此不需要强制转换。

使用简单的基于 libpcap 的数据包嗅探器,我确定硬件级别的数据没有间隙。但是,我在我的申请中看到了很多空白。这表明内核正在丢弃数据包;

这表明您的环境不够快。众所周知,数据包捕获是处理密集型的,当您开始在一个接口上捕获诸如 iptraf-ng 或 tcpdump 之类的程序时,您会观察到接口上的全局传输速率将下降。

【讨论】:

不过,他可能是从另一台机器上捕获的。 我在与应用程序相同的机器上运行 pcap 程序。但是,无论嗅探器是否正在运行,都会发生下降。换句话说,即使没有运行嗅探器,我的应用程序也会记录间隙,并且 /proc/net/snmp Udp InErrors 计数器会增加。 (在我使用嗅探器之前,我不知道 /proc/net/snmp 文件。)【参考方案4】:

我没有足够的声誉来发表评论,但与@racic 类似,我有一个程序,其中我有一个接收线程和一个处理线程,它们之间有一个阻塞队列。我注意到丢弃数据包的同样问题,因为接收线程正在等待阻塞队列上的锁。

为了解决这个问题,我向接收线程添加了一个较小的本地缓冲区,并让它只将数据推送到缓冲区然后它没有被锁定(使用 std::mutex::try_lock)。

【讨论】:

浅谈udp(数据包长度,收包能力,丢包及进程结构选择)

UDP数据包长度UDP数据包的理论长度udp数据包的理论长度是多少,合适的udp数据包应该是多少呢?从TCP-IP详解卷一第11章的udp数据包的包头可以看出,udp的最大包长度是2^16-1的个字节。由于udp包头占8个字节,而在ip层进行封装后的i... 查看详情

网络--udp知识(代码片段)

...于IP编程.TCP对比UDP协议TCPUDP是否可靠可靠不可靠[大概率丢包,乱序,重复]协议流式协议报文协议形式点对点可广播/组播/流量控制,拥塞控制无策略UDP协议:即用户数据报协议,应用层将数据报文交给UDP之后,UDP啥也不做,直接透析给IP... 查看详情

网络丢包的四大原因和修复方法(转他人文章)

网络丢包的四大原因和修复方法??网络性能问题是一个老生长谈的问题。网络是应用和数据的基础。所以一旦这一层出现问题,那么将会影响上层应用的体验。造成网络性能问题的原因有很多种,但是在这篇文章中我们主要讨论... 查看详情

udp主要丢包原因及具体问题分析

UDP主要丢包原因及具体问题分析一、主要丢包原因 1、接收端处理时间过长导致丢包:调用recv方法接收端收到数据后,处理数据花了一些时间,处理完后再次调用recv方法,在这二次调用间隔里,发过来的包可能丢失。对于这... 查看详情

ping丢包故障处理方法

ping丢包故障处理方法1.Ping丢包故障定位思路故障分析Ping丢包是指Ping报文在网络中传输,由于各种原因(如线路过长、网络拥塞等)而产生部分Ping报文丢弃的现象。在使用Ping命令,出现Ping丢包的现象时,第一步需要确定Ping丢... 查看详情

用udp实现可靠传输

...vb,最好有vc的,谢谢了如何用vb的winsocket解决udp文件传送丢包的问题udp协议是1种无连接的协议,他和tcp协议比较有传输速度快,占用资源少的问题。但是由于udp协议本身没有自动找包的功能,因此经常会出现丢包的现象,会造... 查看详情

c#udp通信操作大数据时减少丢包的方法

...程序,开启一个线程进行数据接收,当数据量小时,没有丢包现象, 查看详情

UDP丢包率可能会增加?

】UDP丢包率可能会增加?【英文标题】:UDPpacketlossratemightincreaseonconditions?【发布时间】:2015-11-0318:43:01【问题描述】:考虑到数据包的大小,UDP数据包丢失百分比是否会增加?例如,如果我发送100\'000个数据包,首先尝试byte[]大... 查看详情

udp通信的消息处理方案(代码片段)

... 大家都知道当使用udp通信时,最大的一个问题是会出现丢包的情况,那么如何可以既使用udp来传输,又同时能有效防止丢包呢?  本文提供一种简单有效的方法,可以显著避免udp丢包的问题。此外,如果要达到类似tcp通信的... 查看详情

C UDP组播接收丢包

】CUDP组播接收丢包【英文标题】:CUDPMulticastreceivepacketlost【发布时间】:2015-01-2205:36:10【问题描述】:我编写了一个C程序来接收UDP多播数据包,它可以工作。但是,当程序运行几秒钟后,丢包的情况就经常发生。当我按Ctrl+C终... 查看详情

我用iperf测试udp包到vps的丢包率,一点反应都没有

参考技术Aiperf也可以用于UDP数据包吞吐量、丢包率和延迟指标,但是由于UDP协议是一个非面向连接的轻量级传输协议,并且不提供可靠的数据传输服务,因此对UDP应用的关注点不是传输数据有多快,而是它的丢包率和延时指标。... 查看详情

ftp传输大文件严重丢包的解决方法

...发给国外合作伙伴,经常遇到长距离网络不可避免的时延丢包及跨运营商的情况。怎么解决这个问题?其实不仅是大文件,网络上传输的各种内容,大多数都需要解决丢包和损坏问题。只是对于大文件传输,丢包和损坏的情况可... 查看详情

udp丢包和恢复

】udp丢包和恢复【英文标题】:udppacketlossandrecovery【发布时间】:2011-08-0811:53:20【问题描述】:我正在开发基于udp/tcp的P2P文件和实时视频流应用程序。该应用程序将使用c++为Linux和Windows平台开发。我们正在使用ICE(TCP/UDP打孔)... 查看详情

怎么解决ftp传输大文件严重丢包的问题?

...地,或者发往国外,经常遇到长距离网络不可避免的时延丢包及跨运营商的情况。如何解决这个问题?其实不仅是大文件,网络上传输的各种内容,大多数都需要解决丢包和损坏问题。只是对于大文件传输,丢包和损坏的情况可... 查看详情

golangudp编程

...性且属于非连接导向协议,UDP应用一般必须允许一定量的丢包、出错和复制粘贴。1在接收udp包时,如果接收包时给定的buffer太小的话,就要自己解决粘包问题。2udp包的发送和接收不保证一定成功,不保证按正确顺序抵达。3如果... 查看详情

网络分流器-网络丢包原因以及修复方法

戎腾网络分流器作为专业的流量监控采集设备,具有丢包率低,性能可靠,高速率等优势,是整个网络安全领域网络监控前端重要的基础装备!正交架构,支持1000以上10G和200以上100G,可根据需求进行调整!(正交图片过大,因... 查看详情

一种宿主机内核bug导致kvm虚拟机丢包的监控和处理方法

近期公司一台kvm虚拟机丢包引发应用异常,经过分析宿主机内核bug导致,没有包转发到虚拟机,体现为虚拟机丢包引发应用异常。原因分析和相关概念如下是现象和分析过程1、收集虚拟机内部的virtio0-input中断,执行如下命令,... 查看详情

zigbee协议栈中广播时间过短就出现严重丢包的解决方案

ZigBee协议栈中如果广播时间较短就会出现大量的丢包,原因在于协议中对广播时间做了限制,防止空中出现大量数据,具体在哪修改呢?在​​​NWK_GLOBALS_H​​中,打开这个头文件修改下面两个宏定义#defineMAX_BCAST500#defineBCAST_DEL... 查看详情