背景:
类似于实时语音转译文本的产品,录音软件将客户端的语音流推送至后台服务,由后端服务转译后推送至客户端界面,后端服务使用到了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
文章知识点与官方知识档案匹配,可进一步学习相关知识 络技能树首页概览22094 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!