UDP数据丢包跟踪与总结
参考文章链接1:https://www.cnblogs.com/h2zZhou/p/12015409.html(侵权必删)
丢包检查方法
- 给每个UDP包编号,对比收发端的接收到的包。对于UDP协议层上的包,例如RTP包,可以从RTP包中读出包的序列号进行判断。
- 抓包。发送端和接收端分别抓包。linux下可以使用tcpdump,windows下使用wireshark。
- linux下,可以使用watch netstat -su查看丢包统计。主要看RcvbufErrors和SndbufErrors。如果两个统计项的数字都在不断增加,表明网卡有丢包。
发送方丢包
发送的包太大
发送的包比64K大会导致UDP协议sendto返回错误。
发送的包比MTU大,UDP包在接收端容易丢包,可查看接收端的网卡统计。可考虑把包切分到MTU一下再发送。
发包速度太快
发包速度太快的话,可能有两个问题:1.接收端来不及接收导致接收端丢包。2.发送端网卡处理不过来。这个时候sendto没有返回错误,但是用netstat查看会发现SndbufErrors不断上升,有可能是网卡的输出队列太小导致。可以考虑使用ifconfig命令把txqueuelen设置大一些。
UDP包流量太大
同一个端口发送的数据量太大时会导致网卡丢包,这个时候可以用netstat查看会发现SndbufErrors不断上升。sendto会返回-1.这个时候可以考虑增大/proc/sys/net/core/wmem_max的值。
这种情况尤其是同时给多个客户端发送音视频数据时导致。笔者曾经遇到过这么一次情况。一个端口向8个客户端发送视频流时,网卡流量大概400M/s,sendto会返回-1,errno 11.程序里也调用setsockopt设置了发送缓冲区为60M,然而还是会丢包。后来将系统参数/proc/sys/net/core/wmem_max设到60M才解决问题。
接收端丢包
接收缓冲区太小
接收缓冲区小于发送客户端的包的大小,或者接收客户端recvfrom速度太慢,导致接收缓冲区满丢弃数据。前一种问题,可以考虑增大接收缓冲区。后一种问题,可以考虑将接收操作和业务处理操作分离到不同的线程来处理
参考文章链接2:https://www.cnblogs.com/lsgxeva/p/11124762.html(侵权必删)
解决方案:通过开启网卡多队列以及中断绑定来解决大流量下的网络丢包问题(暂时未测试)
1、判断当前系统环境是否支持多队列网卡,执行命令:
lspci -vvv
如果在Ethernet项中。含有MSI-X: Enable+ Count=9 Masked-语句,则说明当前系统环境是支持多队列网卡的,否则不支持。
2、ethtool -l eth0命令可以看到eth0网卡是否支持多队列,最多支持多少、当前开启多少
3、设置网卡当前使用多队列。运行命令:ethtool -L eth0 combined <N> N为要使能的队列数
4、要确保多队列确实生效,可以查看文件:
# ls /sys/class/net/eth0/queues/
rx-0 rx-2 rx-4 rx-6 tx-0 tx-2 tx-4 tx-6
rx-1 rx-3 rx-5 rx-7 tx-1 tx-3 tx-5 tx-7
如上,如果rx数量是设定值,则正确。
X86系统采用中断机制协同处理CPU与其他设备工作。长久以来网卡的中断默认由cpu0处理,在大量小包的网络环境下可能出现cpu0负载高,而其他cpu空闲。后来出现网卡多队列技术解决这个问题。
通过命令cat /proc/interrupts 查看系统中断信息,应该是长下面这个样子。第一列是中断号,后面是每个cpu的中断数,可以通过grep过滤网卡来看相关的中断再那个CPU上执行
5、中断绑定
我们可以绑定中断号与处理CPU之间的关系,Linux系统用irqbalance服务优化中断分配,它能自动收集数据,调度中断请求。为了了解中断绑定,我们把irqbalance服务关掉,手工调整绑定关系。
/proc/irq/{IRQ_ID}/smp_affinity,中断IRQ_ID的CPU亲和配置文件,16进制
/proc/irq/{IRQ ID}/smp_affinity_list,10进制,与smp_affinity相通,修改一个相应改变。
[root@localhost ~]# cat /proc/interrupts | grep eth0
CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7
143: 0 0 0 0 1 0 0 0 IR-PCI-MSI-edge eth0
144: 68 67 58 297886391 69 57 68 59 IR-PCI-MSI-edge eth0-TxRx-0
145: 282217533 59 54 55 62 61 56 57 IR-PCI-MSI-edge eth0-TxRx-1
146: 52 269243896 51 46 55 50 53 54 IR-PCI-MSI-edge eth0-TxRx-2
147: 44 10 14 11 35 292342171 12 7 IR-PCI-MSI-edge eth0-TxRx-3[root@localhost ~]# cat /proc/irq/144/smp_affinity
08
[root@localhost ~]# cat /proc/irq/144/smp_affinity_list
3#上面表示的是08【00001000】,表示在cpu3上(从右往左,依次从CPU0~CPU7),和下面的3保持一致
[root@localhost ~]# echo 4 > /proc/irq/144/smp_affinity
修订后在进行压力测试,观察eth0的中断分压
RPS/RFS
RSS需要硬件支持,在不支持RSS的环境中,RPS/RFS提供了软件的解决方案。RPS(Receive Packet Steering)是把一个rx队列的软中断分发到多个CPU核上,从而达到负载均衡的目的。RFS(Receive Flow Steering)是RPS的扩展,RPS只依靠hash来控制数据包,提供负载平衡,但是没有考虑到应用程序的位置(指应用程序所在CPU)。RFS目标是通过指派应用线程正在运行的CPU处理中断,增加数据缓存的命中率。
参考文章链接3:https://cloud.tencent.com/developer/article/1638140
在开始之前,我们先用一张图解释 linux 系统接收网络报文的过程。
- 首先网络报文通过物理网线发送到网卡
- 网络驱动程序会把网络中的报文读出来放到 ring buffer 中,这个过程使用 DMA(Direct Memory Access),不需要 CPU 参与
- 内核从 ring buffer 中读取报文进行处理,执行 IP 和 TCP/UDP 层的逻辑,最后把报文放到应用程序的 socket buffer 中
- 应用程序从 socket buffer 中读取报文进行处理
UDP数据丢包跟踪与总结相关推荐
- Udp数据丢包测试--iperf3
1.背景 近期需要用UDP来传输大量数据,为了避免出现大量丢包,所以需要对UDP数据丢包进行测试.推动开发减少丢包率. 2.环境 目前demo测试使用的环境是windows环境(后期如有要求可以改为l ...
- UDP主要丢包原因及具体问题分析
转载:https://www.cnblogs.com/Zhaols/p/6105926.html 一.主要丢包原因 1.接收端处理时间过长导致丢包:调用recv方法接收端收到数据后,处理数据花了一些时 ...
- UDP解决丢包问题总结
收包率低/丢包率高的原因分析 (1) 缓存太小,不能及时接收数据. 连续多个UDP包超过了UDP接收缓冲区大小 ,比如: 如:UDP包过大 如:UDP发包速率过快,突发大数据流量超过了缓冲区上限 (2 ...
- linux tcp 丢包命令_在Linux下实现测试TCP和UDP的丢包检测!
在Linux下实现测试TCP和UDP的丢包检测! 疯狂の猿猴 • 2020 年 12 月 11 日 前言 本人平时基本上都是win,一下子转战到linux,有点不习惯! 因此做个记录,便于以后自己查阅 ...
- K8S集群中Pod资源数据丢包排查思路
K8S集群中Pod资源数据丢包排查思路 Pod资源可能会由于网络原因产生丢包的现象. 当Pod资源存在丢包的现象时,会出现下面的报错: Connect to 100.111.156.74 port 5 ...
- 利用mininet进行链路拥塞造成数据丢包的实验
实验原理 网络链路拥塞是指在分组交换网络中传送分组的数目太多时,由于存储转发节点的资源有限而造成网络传输性能下降的情况.当网络发生拥塞时,一般会出现数据丢失,时延增加,吞吐量下降,严重时甚至会导致&q ...
- 服务器数据丢包是什么原因?服务器丢包怎么解决?
服务器数据丢包是什么原因?服务器丢包怎么解决? 相信大家在服务器租用的使用过程中,往往会遇到数据丢包的情况,造成网站的延时或者访问打不开的情况,给用户造成了很大一些困恼,那么服务器数据丢包是什么原因造 ...
- 数据丢包怎么修复_一种网络传输中实时音频数据丢包恢复的方法与流程
本发明涉及通信技术领域,具体涉及一种网络传输中实时音频数据丢包恢复的方法. 背景技术: 随着通信技术的发展,音频传输系统对实时性和准确性的要求越来越高.在网络的音频传输过程中,影响音频音质的主要因素是 ...
- 数据丢包怎么修复_交换机发生网络通信故障怎么解决?
交换机故障一般可以分为硬件故障和软件故障两大类,交换机虽然不常发生故障,但是一旦发生故障后都不太好检测与排除.那么,当交换机发生网络通信故障了该怎么办呢?今天就由飞畅科技的小编来给大家说说交换机网络通 ...
- 数据丢包怎么修复_网络丢包率如何解决
网络丢包率如何解决 网络丢包是我们在使用 ping (检测某个系统能否正 常运行) 对目站进行询问时, 数据包由于各 种原因在信道中丢失的现象. ping 使用了 ICMP 回送请求与回送回答报文. ...
最新文章
- DOM相关内容(课程来源:B站 后盾人)
- Java项目:电商书城平台系统设计和实现(java+springboot+mysql+spring+jsp)
- opencv利用直方图判断人脸光照质量
- 三种Shell脚本编程中避免SFTP输入密码的方法
- python 解析url上的xml_如何从python中的URL读取XML文件?
- Hibernate中createCriteria即QBC查询的详细用法 .Hibernate中createCriteria即QBC查询的详细用法 ....
- python gps 地图 轨迹_Apollo问答丨执行rtk_recorder.sh start录制循迹轨迹时报错怎么办?...
- Android的MediaPlayer架构介绍
- 什么场景下声明式事务会失效?如何解决?
- lua脚本java_java操作lua脚本
- 学计算机的逻辑学博士,逻辑学博士点
- idm无法集成到谷歌浏览器怎么解决?
- fms安装教程 linux_linux通过fms搭建流媒体服务器Flash Media Server
- 整数逆序输出, 例如输入一个整数12345,输出5 4 3 2 1
- 逆向破解——win7-vm逆向平台搭建
- Oracle数据库之oracle update set select from 关联更新
- [NOIP2016]天天爱跑步(lca+乱搞)
- Android快速SDK(24)第三方分享UmengShare【肌肉记忆,分钟接入】
- 在运行局域网中另一台电脑上的程序时,总是弹出“无法验证发行者,确定要运行此软件吗”
- R语言中如何进行PCA分析?利用ggplot和prcomp绘制基因表达量分析图
热门文章
- 华为 常用的查看命令
- js实现公历(阳历)和农历(阴历)的换算
- 一步解决桌面文件需要管理员权限才能删除问题
- 扒一扒那些叫欧拉的定理们(一)——基本介绍和简单多面体欧拉定理
- 实用分享-在线公式编辑器(可导图识别)
- 联通光纤猫虚拟服务器设置,联通光纤猫怎么设置 联通光纤猫设置方法【详细步骤】...
- ipad能不能编写python_【已解决】用ipad编写python代码
- 超好用的私人珍藏网站,送给你了!
- myscript 思路整理
- topgate镜像_AMOLED电流镜像像素电路的稳定性分析