IOTXING

记录技术学习之路

0%

Jedis Timeout waiting for idle object

现象

在一次压测过程中,设置了500并发并且持续5分钟,在3分钟的时候,发现所有链接都关闭了,并且获取不到任何链接,出现以下的报错提示

image-20200511172738852

第一眼看到这个问题,以为是连接池设置了太小,于是设置了max-total为500,理论来说应该足够满足使用, 于是再次压测。

差不多两三分钟之后,问题又复现了, 无法获取到任何连接,而在机器使用netstat 查看到redis服务器的链接时,发现一个链接也没有,也就是说现在机器没有任何链接,然后代码缺报了一个获取不到链接的错误。

通过网上搜寻,发现我使用的jedis为2.9.1,而这个版本会存在一个连接泄露的问题 ,也就是链接在使用完后,没有正常的返回,导致新的请求获取不到链接。

解决办法

升级jedis版本到2.10.2即可解决问题

后续

我又把jedis版本改了回去,并且对问题进行复现,通过使用jmap 导出泄露产生时候的dump文件分析后,来从vm层面分析问题。

从上面的报错,我们能看到,是等到idle object超时。而这个idle object指的是空闲对象,我们可以在JedisPool里面找到

image-20200512101601905

能够看到idleObjects里面的count为0,通过查找网上资料,发现这是2.9.1版本的一个bug,在高并发场景下,会出现连接无法关掉的情况,慢慢的连接池就满了,无法建立新的连接