压测环境
- springboot版本为1.5.19,使用的spring data redis,其中jedis版本为2.9.1
- 压测工具使用jmeter,200个并发线程持续5分钟
现象
-
测试反映jemeter报大量的http超时
-
查看日志发现请求的响应时间随着时间的推移逐渐增大,应用重启之后报异常
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
问题排查
-
首先根据异常栈,定位到报错的jedis连接池的源码,梳理了一下获取连接的流程,代码如下:
// 获取连接 public T getResource() { try { return internalPool.borrowObject(); } catch (NoSuchElementException nse) { throw new JedisException("Could not get a resource from the pool", nse); } catch (Exception e) { // 是从这里抛出的异常 throw new JedisConnectionException("Could not get a resource from the pool", e); } } // 从连接池中取一个连接 public T borrowObject() throws Exception { return borrowObject(getMaxWaitMillis()); } // borrowMaxWaitMillis 是一个超时时间,spring默认是-1,依旧是一直等待没有超时 // 可以通过 spring.redis.pool.max-wait 配置 public T borrowObject(final long borrowMaxWaitMillis) throws Exception { ···省略部分代码 if (blockWhenExhausted) { if (p == null)