22

JMeter压测时跑一会聚合报告就不动了?

 3 years ago
source link: https://leishen6.github.io/2020/09/24/JMeter_pressuretest_problem/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

最近,使用 JMeter 对项目进行压力测试;起初, JMeter 设置的并发线程数只是10个,然后在进行压力测试时,发现跑了一会后 JMeter 聚合报告 中的中数字全部不动了(像卡死了一样);

上面简单描述了本文要说的问题;下面将主要从两方面来进行聊。

①、具体问题描述

②、具体的排查思路

问题详述:

项目部署情况: 提供服务接口的项目 + Tomcat + Oracle

提供服务接口的项目:接口中包含很多的数据库查询、更新、新增操作;

部署项目的应用服务器: Tomcat

连接的关系数据库: Oracle

数据源配置 : 在Tomcat中的 context.xml 中配置数据源,连接池使用的是 Druid;

根据上面的部署情况, 然后使用 JMeter 进行压测,就出现了文中一开头说的问题,如下图:

U3auYnb.png!mobile

问题排查:

下面会简单的描述下此问题的排查过程,让大家在面对这种问题时,可以有一些思路。

鉴于本人水平有限,如有问题敬请提出。

1、查看 JMeter 结果树:

首先看下 JMeter 结果树 中是否存在错误的日志,如果存在,然后看看是什么问题,具体进行解决;

QvErmy7.png!mobile

但是,本文遇到这个问题时,发现结果树中并没有输出错误日志,说明请求接口时未出现问题;

2、服务端排查:

因为 JMeter 结果树中未展示出错误的内容,说明此时程序是正常运行着;

然后查看服务端日志,发现没有出现任何 异常 日志;

看到这,就发现怪异之处了,服务端也没有报任何错误,那问题到底出在哪里呢?

别着急,还得去看 JMeter 的聚合报告去,通过聚合报告可以发现一些问题,就是聚合报告中 请求接口的平均响应时间太长了,高达 2 秒多,这个不正常呀,但是代码逻辑确保是没有任何问题的;

bIbuQbe.png!mobile

噢,对了,接口中存在很多数据库操作,是不是数据库出现了问题,导致数据库操作比较耗时呢;通过查看数据库服务发现是正常的;那是不是连接数不够用了呢? 嗯嗯,那来看下具体数据源的配置信息:

B7B7Fv3.png!mobile

通过查看 数据源 的配置信息发现,Druid 连接池没有配置 最大连接数 以及最小连接数等 ;要知道 druid默认的最大连接数是 8 ,然后咱再去使用命令查询下当前数据库的连接数: netstat -pan | grep 1521 | wc -l ,发现连接数是 8,说明当前压测时,连接数已经到达了最大值;由于连接不够用,导致程序中进行 JDBC 数据库操作时需要等待可用连接,所以说非常耗时,响应时间就慢了,进而导致大量到达 Tomcat的请求得不到及时的处理,最终导致 JMeter 像卡死一样。

解决方式:在数据源配置中添加上 最大连接数等 ;完整数据源配置如下:

最大连接数设置为了 maxActive=”300” ; 最小连接数设置为了 minIdle=”50” 。

<Resource name="jdbc/testdemo"
      type="javax.sql.DataSource"
      factory="com.alibaba.druid.pool.DruidDataSourceFactory"
      url="jdbc:oracle:thin:@192.168.3.125:1521:ora11g"
      driverClassName="oracle.jdbc.driver.OracleDriver"
      username="root"
      password="root"
      auth="Container"
	  initialSize="30"
      maxActive="300"
      minIdle="50"
      maxWait="30000"
      timeBetweenEvictionRunsMillis="30000"
      minEvictableIdleTimeMillis="600000"
	  maxEvictableIdleTimeMillis="900000"
	  poolPreparedStatements="true"
	  maxOpenPreparedStatements="20"
	  validationQuery="select 1 from dual"
	  testOnBorrow="false"
	  testOnReturn="false"
	  testWhileIdle="true"
	  filters="wall,stat,log4j2"
      />

总结:

在项目进行压测前,一定记得需要结合当前机器的配置,以及制定的压测计划对一些参数进行优化;下面简单的说几方面,如果有不同见解,大家可以评论补充;例如:

①、如果 JMeter 设置的并发数比较大的话,需要将 Tomcat 的 连接器参数 进行优化一下,否则可能会出现请求处理超时,没有更多的线程去处理连接请求;

②、还有需要对 Tomcat 进行 JVM 参数调试,根据当前机器的硬件配置进行合理的 JVM 参数设置;

③、最后,特别重要的是 连接池 的配置,例如 :数据库连接池、redis连接池等,进行合理的大小配置;

❤不要忘记留下你学习的足迹 [点赞 + 收藏 + 评论]嘿嘿ヾ

一切看文章不点赞都是“耍流氓”,嘿嘿ヾ(◍°∇°◍)ノ゙!开个玩笑,动一动你的小手,点赞就完事了,你每个人出一份力量(点赞 + 评论)就会让更多的学习者加入进来!非常感谢! ̄ω ̄=


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK