专栏首页软件测试架构师俱乐部性能测试案例:redis获取不到连接池,Timeout waiting for idle object

性能测试案例:redis获取不到连接池,Timeout waiting for idle object

↓↓↓ 如有疑问或者建议,请在文末留言 ↓↓↓

这是几个月前压测某项目登录接口时遇到的性能问题,虽然大家不一定会遇到,但是分析定位问题的思路还是可以参考一下。

一、问题现象

压测过程中,tps突然剧烈下降,且所有请求失败(下图绿线)

服务端错误日志,获取不到redis连接池(Could not get a resource from the pool),另外,从下图可以看到,当前jedis版本是2.9.1

获取不到连接,可能是这四种情况:   Timeout waiting for idle object   Pool exhausted   Unable to activate object   Unable to validate object

下图,表示等待空闲连接超时

二、分析定位

jedis的连接池就是用commons-pool2来管理的,使用jvisualvm打开对应的应用进程(jvisualvm的使用,请关注本公众号后续推文),根据上图的提示,找到org.apache.commons.pool2

可以看到相关的配置

活动连接1000,连接满了

dump堆内存进行分析(此时压测已经停止)

根据文章开头的日志信息,搜索org.apache.commons.pool2.impl,然后双击下面的DefaultPooledObject类

进入实例

实例状态是ALLOCATED

ALLOCATED表示在使用中,压测结束后,虽然连接释放了,但是资源没归还

下面可以看到,dataSource为空

如果dataSource为空,就走else,说明只关闭了连接,资源没归还到队列中,后面的线程就获取不到空闲连接

可以看到,实例有很多

为什么会出现这种情况呢?

通过查看源码及官网,可以确定,这是2.9.1的bug,改为2.9.0就没报错了。

官网:https://github.com/xetorthio/jedis/pull/1918/commits/df1bffa3c77f4ede4c912f2c3e78b5c8857725e7

Move dataSource reset before connection returned to pool.

If datasource reset after the connection returned to pool, it might reset the datasource after it was allocated to another thread

三、总结

出现很多实例状态是ALLOCATED,dataSource为null的原因:

在多线程时,如果dataSource在连接释放后重置(根据代码逻辑可知:连接释放前,资源已经归还,但是未重置),可能在重置前,这个dataSource已经分配给另外一个线程了,此时重置,就把已经获取了这个dataSource的线程的dataSource重置了,这样就导致很多状态是ALLOCATED、dataSource值为null的实例,进而这些线程都只关闭了连接,而没有归还资源,最终导致获取不到连接,即文章开头的异常日志信息,这也印证了都是压测一段时间后才开始报错的现象。

另外,有些性能问题,还是需要一定的代码能力,而且,测试会代码是个趋势。

声明:封面图片来源于网络,如有侵权,请联系删除。

END

本文分享自微信公众号 - 软件测试架构师俱乐部(gh_03227f9a322f),作者:全栈测试笔记

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Jmeter4.0新版本特性研究

    春节刚刚结束,细心的小伙伴发现jmeter4.0也悄悄推出,结合大家平时的使用情况,给新版本增加的特性分析下,jmeter4.0下载地址:http://jmet...

    cctester
  • 十篇笔记走向Python测试开发之路四(字典)

    上一讲的String 方法比较多,大家需要多多练习,才能做到熟能生巧,这一讲,我们主要来介绍字典(dict)

    cctester
  • 打开springboot的大门【一】

    小编为mac电脑,最后打开终端并输入 java -version,如果出现以下信息,则说明JDK安装成功

    cctester
  • Netty新连接接入(一)-新连接检测1 新连接检测

    JavaEdge
  • 分析 HTTP,TCP 的长连接和短连接以及 sock

    HTTP 的长连接和短连接本质上是 TCP 长连接和短连接。HTTP 属于应用层协议,在传输层使用 TCP 协议,在网络层使用 IP 协议。IP 协议主要解决网...

    杰哥的IT之旅
  • HTTP 长连接和短连接

    1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用I...

    joshua317
  • 报告发布|新连接经济:为我国经济结构性改革注入新动力

    近年来,随着国家不断加强和普及连接基础设施建设,百度、腾讯、华为和中国移动等龙头企业纷纷提出连接战略,以及亿万消费者把衣食住行都建立在新连接之上,连接终于从不可...

    灯塔大数据
  • 长连接和短连接分析

    1. TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接 时...

    猿人谷
  • python2/3 中删除字典中value为空的键值对方法

    只是在for循环中,相当于对链表的操作,它会自动调用next方法! 字典的迭代器会遍历它的键,在这个过程中,不能改变这个字典!不能删除、添加数据 要先记录要删...

    用户1214487
  • 网络传输 相关概念

    java404

扫码关注云+社区

领取腾讯云代金券