一次压测时发现jedis连接池泄露的bug的经历

本文记录了一次压测中遇到的jedis连接池泄露问题,详细描述了从现象到排查过程,包括查看日志、分析线程堆栈、调整配置、检查代码依赖和优化连接池。最终,通过升级jedis版本解决了问题,总结了问题排查的经验和方法。
摘要由CSDN通过智能技术生成

压测环境

  1. springboot版本为1.5.19,使用的spring data redis,其中jedis版本为2.9.1
  2. 压测工具使用jmeter,200个并发线程持续5分钟

现象

  1. 测试反映jemeter报大量的http超时

  2. 查看日志发现请求的响应时间随着时间的推移逐渐增大,应用重启之后报异常

    redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool

问题排查

  1. 首先根据异常栈,定位到报错的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) 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值