udp丢包问题排查

背景:

类似于实时语音转译文本的产品,录音软件将客户端的语音流推送至后台服务,由后端服务转译后推送至客户端界面,后端服务使用到了redis,但是不和后端服务部署在一起。由于仅用于演示作用,所以找了个已有的测试环境,同时找了台笔记本部署录音软件。

服务的部署情况如下:

录音软件:笔记本,连接公司办公网

后台服务:腾讯云服务器

redis服务:公司服务器

问题:

客户端界面显示的转译文本不全,而且转译结果很慢

排查:

后端服务排查发现,录音软件推送过来的udp包有丢失问题,导致转译不准。同时发现,后端服务调用redis耗费的时长比较大。运维那边反馈腾讯云访问公司服务器网络质量不好,所以后端服务去访问redis时效果会很差。

1、转译结果很慢。后端服务排查发现调用redis耗费的时长比较大。运维那边反馈腾讯云访问公司服务器网络质量不好,所以后端服务去访问redis时效果会很差,去掉访问redis的代码后转译速度快了很多。

2、转译文本不全。后端服务排查发现录音软件推送过来的udp包不全,基本丢失了一半的包,导致转译的结果不正常。

UDP丢包详细排查:

一、抓包

录音软件的笔记本安装wireshark,过滤ip和端口抓包;后端服务使用tcpdump udp port xxxx抓包。两者抓包数量对比,发现基本一致。

(注意:tcpdump抓到的包可能包含drop的包,可以查看服务器的防火墙)

二、查看服务器网络情况

查看服务器网卡:ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 10.4.1.8  netmask 255.255.255.0  broadcast 10.4.1.255
    ether 52:54:00:6e:12:c7  txqueuelen 1000  (Ethernet)
    RX packets 1364912928  bytes 610521067067 (568.5 GiB)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 1031033768  bytes 1090716256211 (1015.8 GiB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

网卡情况看起来正常

三、查看udp丢包情况:netstat -s -u (或者 netstat -s | grep -E "packet receive errors|receive buffer errors")

IcmpMsg:
    InType0: 83
    InType3: 132
    InType5: 17
    InType8: 44450231
    InType11: 3
    OutType0: 44450231
    OutType3: 459
    OutType5: 11
    OutType8: 190
Udp:
    9038485 packets received
    683 packets to unknown port received.
    53437 packet receive errors
    9017060 packets sent
    53437 receive buffer errors
    0 send buffer errors
UdpLite:
IpExt:
    InNoRoutes: 14
    InMcastPkts: 966412
    OutMcastPkts: 129854
    InOctets: 4539868113950
    OutOctets: 6036479106501
    InMcastOctets: 34799390
    OutMcastOctets: 5202422
    InNoECTPkts: 5736021929
    InECT0Pkts: 286815
    
发现packet receive errors和receive buffer errors 数量很大而且一致,重新语音对话时发现两个数值一直增长而且相等。

UDP Receive Packet 过程:

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

receive buffer errors错误一般是以下情况:

1. receive buffer 设置过小,而网络流量相对较大
2. 应用程序读取速度过慢
3. 接收端CPU负载较高,导致从receive buffer中消费过慢

结论:

后端服务每次收包时由于访问redis导致程序读包速度过慢,从而出现receive buffer errors丢包问题所以短时间内我们换了个腾讯云服务器上的redis,云对云通讯,服务后续转译正常并速度快了很多。

参考文章:

Linux丢包那些事

Linux服务器丢包故障的解决

UDP Packet Lost - receive buffer errors

  • 16
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值