问题描述:
大规模数据吞吐情况下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