首先介绍一下大概情况:在客户局域网内安装了一个应用系统,是web项目,近期需要需要提供压力并发测试报告,要求是:非服务器电脑上测试,单个用户持续访问5分钟,100用户并发访问5分钟;结果要求在样本足够多(万为单位)的情况下,异常率小于1%,且平均值大于100(还不懂平均值是啥)。
项目使用JDK+Tomcat+SSH来开发的,于是使用Apache Jmeter进行测试,遇到以下几个问题:
1、服务器日志报错:Caused by: java.sql.SQLException: We are already in the process of making 11 connections and the number of simultaneous builds has been throttled to 10
百度:https://www.matools.com/blog/190118426
simultaneous-build-throttle: 这是我们可一次建立的最大连接数。那就是新增的连接请求,但还没有可供使用的连接。由于连接可以使用多线程,在有限的时间之间建立联系从而带来可用连接,但是我们需要通过一些方式确认一些线程并不是立即响应 连接请求的,默认是10。
解决方案:
在proxool.xml中增加:
<simultaneous-build-throttle>20</simultaneous-build-throttle>
默认
<simultaneous-build-throttle>10</simultaneous-build-throttle>
本项目是在applicationContext-Hibernation.xml中配置的数据库连接,具体参数是:(调到20后又报错,最后调到了50)
<!-- 可一次建立的最大连接数(默认10个) --> <property name="simultaneousBuildThrottle" > <value>50</value> </property>
2、报错:日志报错信息:2022-04-26 14:09:52,035 ERROR JDBCExceptionReporter:234 - Io 异常: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=186647040)(ERR=12518)(ERROR_STACK=(ERROR=(CODE=12518)(EMFI=4))(ERROR=(CODE=12560)(EMFI=4)))),
并且在连数据库连不上:
百度:网上有的说是连接数据库的SID不对,但是本项目是正常访问一会让后报错,于是pass调
还有的说是数据库连接数的问题:https://blog.csdn.net/qq_41871076/article/details/115206306
解决方案:断开其中一个数据库连接,修改Oracle数据库的连接数:
cmd进入数据库:
sqlplus sys/密码@IP/实例名 as sysdba
查看processes值:
Show parameter processes;
Select count(*) from v$process;
修改语句如下:
分别输入:
alter system set processes=1000 scope=spfile;
alter system set sessions=1105 scope=spfile;
3、xml中数据库最大连接数:Thread Max 55,但已超过55,于是修改配置文件:从55改为1000,按需修改。
<bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource"> <property name="driver"> <value>oracle.jdbc.driver.OracleDriver</value> </property> <property name="driverUrl"> <value>jdbc:oracle:username/pasword@ip:1521:orcl</value> --orcl即上面说的SID </property> <property name="user"> <value>username</value> </property> <property name="password"> <value>password</value> </property> <property name="alias"> <value>temp</value> </property> <!-- 最少保持的空闲连接数 (默认5个)--> <property name="prototypeCount"> <value>5</value> </property> <!-- 最大连接数 (默认15个)--> <property name="maximumConnectionCount"> <value>1000</value> </property> <!-- 最小连接数 (默认5个) --> <property name="minimumConnectionCount"> <value>5</value> </property> <!-- 可一次建立的最大连接数(默认10个) --> <property name="simultaneousBuildThrottle" > <value>50</value> </property> </bean>
4、最后一个问题也是困扰最久,耗时最长的一个问题:Jmeter做测试,脚本里报告报错,访问数量在1~200条不等后,就报错:
Response message: Non HTTP response message: connect timed out
于是就开始了循环往复的重启tomcat和数据库,甚至重启服务器,仍然是几条后就报错,于是就又查了两个方法,修改服务器注册表修改TCP和Jmeter运行脚本的连接数和响应时间:链接如下:
1) Windows 设置注册表TCP最大连接数和等待超时配合JMeter并发压测:https://blog.csdn.net/boonya/article/details/105700988
2)Jmeter性能测试请求超时:目前遇见有三种情况:http://t.zoukankan.com/tarzen213-p-12056400.html
按照要求修改后,仍然报错
至此,压力测试也是一种具有破坏性的攻击测试,于是,做压力测试时可以先关闭,但是记得及时开启哦。