戴尔服务器性能测试tps,性能测试tps上不去,又是redis的坑,说多了都是泪啊

前言:这是几个月前压测某项目登陆接口时遇到的性能问题,虽然你们不必定会遇到,可是分析定位问题的思路仍是能够参考一下。git

一、压测过程当中,tps忽然剧烈降低,且全部请求失败(下图绿线)github

133656cd218a61ea0db6f4e8946f68b0.png

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

6fa8e48b1c929d0aa0b50b9f65ed9f4b.png

获取不到链接,多是这四种状况:

Timeout waiting for idle object

Pool exhausted

Unable to activate object

Unable to validate objectredis

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

96dab81aad7d78d5a6a11cac40f290ff.png

二、jedis的链接池就是用commons-pool2来管理的,使用jvisualvm打开对应的应用进程,根据上图的提示,找到org.apache.commons.pool2多线程

aea035b42a34b5d7394e24c50fa97e2a.png

能够看到相关的配置svg

3f07d3c15adaca964afdb4fec1751d7d.png

活动链接1000,链接满了性能

8e18355d7b63847199039330fb843077.png

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

695368b1f029ad280bc1d1cb36242aa8.png

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

4633cf2a4402d8e69cb2fdfecf57f6da.png

进入实例

5bcd5a9330c39b5d5dbf8c25e892a2ec.png

实例状态是ALLOCATED

097511c0402cc826f1d27976a3983154.png

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

cb204c07a9ef4438f5a56b2fe26b2d96.png

下面能够看到,dataSource为空

7999687234eb18ea0904e23556632459.png

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

b6a4f3a0d2e61a296f3f57e589573808.png

能够看到,实例有不少

472bcb3024ed4c484482c74bf4aa41fa.png

为何会出现这种状况呢?

经过查看源码及官网,能够肯定,这是2.9.1的bug,改成2.9.0就没报错了。

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

46fa9c48bdd40e20b37864a8bf295e00.png

974ca31edb50167b21672cb0f3a2a5b5.png

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的实例,进而这些线程都只关闭了链接,而没有归还资源,最终致使获取不到链接,即文章开头的异常日志信息,这也印证了都是压测一段时间后才开始报错的现象。

另外,有些性能问题,仍是须要必定的代码能力,并且,测试会代码是个趋势。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值