前言:

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

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

①、具体问题描述

②、具体的排查思路

问题详述:

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

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

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

连接的关系数据库: Oracle

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

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

问题排查:

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

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

1、查看 JMeter 结果树:

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

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

2、服务端排查:

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

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

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

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<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连接池等,进行合理的大小配置;

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

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