都是高频好用的定位排查命令,冷知识:可以远程debug tomcat
1,top
2,top -Hp 12798 查看比较耗资源的线程
3,jstack 12798 |grep 12799的16进制 31ff -A 10 -B 10
查看堆空间,上下10行
4,ssh 服务器 安装 arthas ,(Arthas 是Alibaba开源的Java诊断工具)
执行thread命令。thread -428 线程堆内存
发现所有线程都在等 @53e5504e这个对象释放锁。jstack 全局搜53e5504e ,没找到这个对象所在线程
5,再次执行 arthas 的thread -b (thread -b, 找出当前阻塞其他线程的线程),无结果
目前只支持找出synchroized关键字阻塞住的线程,暂时不支持java.util.concurrent.lock.
6,修改redis pool 配置,将获取连接超时时间设置为2s,然后等问题再次复现时观察应用最后正常时干过什么。
重启服务等待。又过一天,再次复现。
ssh 服务器,检查tomcat accesslog ,发现大量api 请求出现500,
7,代码分析:stringRedisTemplate.getConnectionFactory().getConnection()获取pool中的redisConnection后,并没有后续操作
redis 连接池中的链接被租赁后并没有释放或者退还到链接池中,状态本应该是idle,但目前是allocated
总结:spring stringRedisTemplate 对redis常规操作做了一些封装,但还不支持像 Scan SetNx等命令,这时需要拿到jedis Connection进行一些特殊的Commands