Redis 使用不当导致应用卡死

首先说下问题现象:内网 sandbox 环境 API 持续 1 周出现应用卡死,所有 api 无响应现象

刚开始当测试抱怨环境响应慢的时候 ,我们重启一下应用,应用恢复正常,于是没做处理。但是后来问题出现频率越来越频繁,越来越多的同事开始抱怨,于是感觉代码可能有问题,开始排查。

首先发现开发的本地 ide 没有发现问题,应用卡死时候数据库,redis 都正常,并且无特殊错误日志。开始怀疑是 sandbox 环境机器问题(测试环境本身就很脆!_!)

于是 ssh 上了服务器 执行以下命令

top

这时发现 机器还算正常,但是内心还是😖,于是打算看下 jvm 堆栈信息

先看下问题应用比较耗资源的线程

执行 top -H -p 12798

找到前 3 个相对比较耗资源的线程

jstack 查看堆内存

jstack 12798 |grep 12799 的 16 进制 31ff

没看出什么问题,上下 10 行也看看 于是执行

看到一些线程都是处于 lock 状态。但没有出现业务相关的代码,忽略了。这时候没有什么头绪。思考一番。决定放弃这次卡死状态的机器

为了保护事故现场 先 dump 了问题进程所有堆内存,然后 debug 模式重启测试环境应用,打算问题再显时直接远程 debug 问题机器