关于C++调用redis指令产生的死循环问题

在将C++算法SDK与Redis接口移植到Jetson NX过程中,遇到大规模数据吞吐后Redis接口无响应,引发线程卡住的死循环问题。通过gdb调试定位到hiredis的recv接口,发现是SDK连续发送两次JSON而Redis仅返回一次,解决方案是为所有Redis接口增加全局mutex锁。同时,调整Redis配置,取消RDB快照保护,以避免服务器卡住。
摘要由CSDN通过智能技术生成

问题描述:
大规模数据吞吐情况下redis接口不返回不响应不崩溃,导致线程卡住。
问题背景:
将x86上运行的算法sdk和redis移植到arm的Jetson NX上,趁机重写了数据源解码解复用的部分,由nvjpeg改为multimedia,redis操作也一并迁移过来,流程成功,但运行几个小时就会出现系统停滞的现象。
粗略项目结构图

C++的算法sdk使用了开源的hiredis库,redis和sdk都在同一块jetson NX服务器上,server正常向redis中传输数据,经过大规模吞吐几小时后,sdk调度线程停止,pipeline等待喂数据。
解决历程:
首先,多线程项目使用vscode进行gdb调试,根据我们对项目的熟悉程度很容易定位到等待位置,根据堆栈信息可以知道,是我们的SETEX指令没有收到redis的回应。通过不断加打印的夹逼法定位到了具体的代码位置,是hiredis中的recv接口,该接口是一个socket操作的基本接口,发出的数据会根据socket fd返回一个ack结果,这里没返回的话,就该用到我们万能的tcpdump抓包了。
关于tcpdump抓包,众所周知tcpdump通过网卡抓包,一开始我也迷糊了一下,本机到本机又不会经过网卡,根本抓不到啊,甚至想把redis放到另一个服务器上再抓包。但实际上tcpdump也是可以抓本地数据包的,t

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值