参考文章链接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 系统接收网络报文的过程。

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

UDP数据丢包跟踪与总结相关推荐

  1. Udp数据丢包测试--iperf3

    1.背景 近期需要用UDP来传输大量数据,为了避免出现大量丢包,所以需要对UDP数据丢包进行测试.推动开发减少丢包率. 2.环境 目前demo测试使用的环境是windows环境(后期如有要求可以改为l ...

  2. UDP主要丢包原因及具体问题分析

    转载:https://www.cnblogs.com/Zhaols/p/6105926.html 一.主要丢包原因 1.接收端处理时间过长导致丢包:调用recv方法接收端收到数据后,处理数据花了一些时 ...

  3. UDP解决丢包问题总结

    收包率低/丢包率高的原因分析 (1) 缓存太小,不能及时接收数据. 连续多个UDP包超过了UDP接收缓冲区大小 ,比如: 如:UDP包过大 如:UDP发包速率过快,突发大数据流量超过了缓冲区上限 (2 ...

  4. linux tcp 丢包命令_在Linux下实现测试TCP和UDP的丢包检测!

    在Linux下实现测试TCP和UDP的丢包检测! 疯狂の猿猴 • 2020 年 12 月 11 日 前言 本人平时基本上都是win,一下子转战到linux,有点不习惯! 因此做个记录,便于以后自己查阅 ...

  5. K8S集群中Pod资源数据丢包排查思路

    K8S集群中Pod资源数据丢包排查思路 Pod资源可能会由于网络原因产生丢包的现象. 当Pod资源存在丢包的现象时,会出现下面的报错: Connect to 100.111.156.74 port 5 ...

  6. 利用mininet进行链路拥塞造成数据丢包的实验

    实验原理 网络链路拥塞是指在分组交换网络中传送分组的数目太多时,由于存储转发节点的资源有限而造成网络传输性能下降的情况.当网络发生拥塞时,一般会出现数据丢失,时延增加,吞吐量下降,严重时甚至会导致&q ...

  7. 服务器数据丢包是什么原因?服务器丢包怎么解决?

    服务器数据丢包是什么原因?服务器丢包怎么解决? 相信大家在服务器租用的使用过程中,往往会遇到数据丢包的情况,造成网站的延时或者访问打不开的情况,给用户造成了很大一些困恼,那么服务器数据丢包是什么原因造 ...

  8. 数据丢包怎么修复_一种网络传输中实时音频数据丢包恢复的方法与流程

    本发明涉及通信技术领域,具体涉及一种网络传输中实时音频数据丢包恢复的方法. 背景技术: 随着通信技术的发展,音频传输系统对实时性和准确性的要求越来越高.在网络的音频传输过程中,影响音频音质的主要因素是 ...

  9. 数据丢包怎么修复_交换机发生网络通信故障怎么解决?

    交换机故障一般可以分为硬件故障和软件故障两大类,交换机虽然不常发生故障,但是一旦发生故障后都不太好检测与排除.那么,当交换机发生网络通信故障了该怎么办呢?今天就由飞畅科技的小编来给大家说说交换机网络通 ...

  10. 数据丢包怎么修复_网络丢包率如何解决

    网络丢包率如何解决 网络丢包是我们在使用 ping (检测某个系统能否正 常运行) 对目站进行询问时, 数据包由于各 种原因在信道中丢失的现象. ping 使用了 ICMP 回送请求与回送回答报文. ...

最新文章

  1. DOM相关内容(课程来源:B站 后盾人)
  2. Java项目:电商书城平台系统设计和实现(java+springboot+mysql+spring+jsp)
  3. opencv利用直方图判断人脸光照质量
  4. 三种Shell脚本编程中避免SFTP输入密码的方法
  5. python 解析url上的xml_如何从python中的URL读取XML文件?
  6. Hibernate中createCriteria即QBC查询的详细用法 .Hibernate中createCriteria即QBC查询的详细用法 ....
  7. python gps 地图 轨迹_Apollo问答丨执行rtk_recorder.sh start录制循迹轨迹时报错怎么办?...
  8. Android的MediaPlayer架构介绍
  9. 什么场景下声明式事务会失效?如何解决?
  10. lua脚本java_java操作lua脚本
  11. 学计算机的逻辑学博士,逻辑学博士点
  12. idm无法集成到谷歌浏览器怎么解决?
  13. fms安装教程 linux_linux通过fms搭建流媒体服务器Flash Media Server
  14. 整数逆序输出, 例如输入一个整数12345,输出5 4 3 2 1
  15. 逆向破解——win7-vm逆向平台搭建
  16. Oracle数据库之oracle update set select from 关联更新
  17. [NOIP2016]天天爱跑步(lca+乱搞)
  18. Android快速SDK(24)第三方分享UmengShare【肌肉记忆,分钟接入】
  19. 在运行局域网中另一台电脑上的程序时,总是弹出“无法验证发行者,确定要运行此软件吗”
  20. R语言中如何进行PCA分析?利用ggplot和prcomp绘制基因表达量分析图

热门文章

  1. 华为 常用的查看命令
  2. js实现公历(阳历)和农历(阴历)的换算
  3. 一步解决桌面文件需要管理员权限才能删除问题
  4. 扒一扒那些叫欧拉的定理们(一)——基本介绍和简单多面体欧拉定理
  5. 实用分享-在线公式编辑器(可导图识别)
  6. 联通光纤猫虚拟服务器设置,联通光纤猫怎么设置 联通光纤猫设置方法【详细步骤】...
  7. ipad能不能编写python_【已解决】用ipad编写python代码
  8. 超好用的私人珍藏网站,送给你了!
  9. myscript 思路整理
  10. topgate镜像_AMOLED电流镜像像素电路的稳定性分析