现象
在一次压测过程中,设置了500并发并且持续5分钟,在3分钟的时候,发现所有链接都关闭了,并且获取不到任何链接,出现以下的报错提示
第一眼看到这个问题,以为是连接池设置了太小,于是设置了max-total为500,理论来说应该足够满足使用, 于是再次压测。
差不多两三分钟之后,问题又复现了, 无法获取到任何连接,而在机器使用netstat 查看到redis服务器的链接时,发现一个链接也没有,也就是说现在机器没有任何链接,然后代码缺报了一个获取不到链接的错误。
通过网上搜寻,发现我使用的jedis为2.9.1,而这个版本会存在一个连接泄露的问题 ,也就是链接在使用完后,没有正常的返回,导致新的请求获取不到链接。
解决办法
升级jedis版本到2.10.2即可解决问题
后续
我又把jedis版本改了回去,并且对问题进行复现,通过使用jmap 导出泄露产生时候的dump文件分析后,来从vm层面分析问题。
从上面的报错,我们能看到,是等到idle object超时。而这个idle object指的是空闲对象,我们可以在JedisPool里面找到
能够看到idleObjects里面的count为0,通过查找网上资料,发现这是2.9.1版本的一个bug,在高并发场景下,会出现连接无法关掉的情况,慢慢的连接池就满了,无法建立新的连接