一、 接口及数据库压测
1. http(s)接口测试
a)打开Jmeter,右键测试计划——添加——Threads(users)——线程组
在线程组属性中可以设置线程数、Ramp-Up Period(in seconds)(即开始测试后在多少秒内达到设置的线程数(并发数))以及循环次数。默认都是1,即在一秒内起一个线程发起一次请求。
b)右键线程组——添加——Sampler——HTTP请求
在web服务器区域设置测试接口的服务器名或ip、端口号、连接或响应超时时间(ms),在HTTP请求区域设置接口的协议、方法、编码以及路径,在同请求一起发送参数区域点击添加按钮,添加接口所需的参数,需要几个添加几个。填写示例如下:
完成a)、b)两步后,一个最简单的HTTP请求类型的接口就配置完成了,接下来需要配置对测试过程及结果的监控和记录。
c)右键线程组——添加——监听器——查看结果树、右键线程组——添加——监听器——聚合报告
查看结果树用来查看单次请求的请求及响应情况,包括请求耗时、请求参数、响应结果等,具体示例如下:
测试结束可以在聚合报告中查看本次测试的整体性能指标,主要看平均响应时间、90%line、错误率、Throughput以及网络传输速率。
平均响应时间:默认情况下是单个Request的平均响应时间(ms)
Median:中位数,也就是50%请求的响应时间
90%line:90%的请求的响应时间
错误率:本次测试中失败的请求数在所有请求中所占的比例
Throughput:简称tps,默认情况下表示每秒处理的请求数,也就是指服务器处理能力,tps越高说明服务器处理能力越好
网络传输速率:每秒从服务器端接收到的数据量,当系统性能瓶颈不在于服务端处理速度,而在于网络传输速率时,提高网络传输速率在一定程度上能提高Throughput
d)当需要使用大量数据源压测时,可以右键接口名——添加——配置元件——CSV Data Set Config工具从本地加载事先准备好的.txt或.csv文件,如有多个参数在文件里可以用,或tab分隔。然后在接口的参数列表中使用${参数名}调用文件里的参数。示例如下:
Filename:和脚本(保存的压测文件)同路径只需填写文件名称,如果不是需填写全路径
File encoding:编码和文件保持一致即可,默认是ANSI,如有中文建议utf-8
Variable names:参数名称,参数之间可用,或tab分隔
Delimiter:分隔符
Allow Quoated data: 双引号相关,例:如果参数中需包含,或者”等,该项可以选择True
Recycle on EOF: 设置为True后,允许循环取值
Stop Thread EOF: 当Recycle on EOF为false并且Stop Thread EOF 为true,则读完csv文件中的记录后,停止运行,线程数及执行次数无效
Sharing Mode:共享模式:
All threads:所有线程,所有线程循环取值,线程1取第一行,线程二取下一行
Current thread group:当前线程组,各个线程组分别循环取值
Current thread:当前线程,该测试计划内的所有线程都取第一行
(ps:以上所说的接口不涉及登录,涉及登录的也简单,添加个HTTP Cookie 管理器和登录接口即可)
2. 数据库压测
a) 加载数据库驱动程序
在测试计划中添加Oracle数据库的驱动程序jar包,添加的jar包要与所压测的Oracle数据库版本一致,jar包放在Jmeter的lib目录下,我们用的是ojdbc6.jar这个jar包。示例如下:
b) 与测试接口一样,添加线程组
这里设置并发数和循环次数,和测试接口一样
c) 右键线程组——添加——配置元件——JDBC Connection Configuration
在次界面进行连接具体数据库的配置,示例如下:
Variable Name:JDBC Request中的Variable Name要和其保持一致,这样才能正确调用此配置的数据库
Max Number of Connection:最大连接数,一般和线程数比较接近,可设置为线程数的1/5,但一般数据库都有最大连接数限制,如果连接数过大,可能需要调优JVM或数据库的连接数配置
Database URL:不同数据库的URL不一样,Oracle的长这样:jdbc:oracle:thin:@10.14.201.203:1555:templatedb
JDBC Driver class:填固定的oracle.jdbc.driver.OracleDriver
d) 右键线程组——添加——Sampler——JDBC Request
这里的Variable Name和JDBC Connection Configuration中的要一致,此外由于是查询,Query Type这里选择Select,如果是插入和删除则是Update
二、 Jmeter配置优化及常见问题分析
Jmeter的一些默认配置较为保守,高并发压测中很可能会由于配置不满足测试场景,从而出现一些非被测系统的性能问题而是测试工具的问题,此时可以通过修改Jmeter的默认配置来尽可能规避这些问题
a) 高并发测试过程中,Jmeter出现内存溢出错误
出现这个问题,一般是由于Jmeter的JVM堆内存设置的过小,找到JMeter bin目录下的jmeter.bat文件,用记事本等文本工具打开,编辑
找到如下内容,
rem See the unix startup file for the rationale of the following parameters,
rem including some tuning recommendations
set HEAP=-Xms512m -Xmx512m
set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m
set SURVIVOR=-XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=50%
set TENURING=-XX:MaxTenuringThreshold=2
修改带背景色,文字带颜色内容如下
set HEAP=-Xms1024m –Xmx1024m
set NEW=-XX:NewSize=640m -XX:MaxNewSize=640m
说明:
-Xms512m:初始化堆内存大小 -Xmx512m:最大堆内存大小,这里的内存大小建议为512的整数倍,可以根据机器实际内存进行合理的设置,建议最大值-Xmx不要超过剩余物理内存的50%
通常会将 -Xms 与 -Xmx两个参数的配置相同的值,其目的是为了能够在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小而浪费资源
set NEW=-XX:NewSize=640m -XX:MaxNewSize=640m
1)-XX:newSize:新生代初始内存的大小,应该小于 -Xms的值
2) -XX:MaxnewSize:表示新生代可被分配的内存的最大上限;当然这个值应该小于-Xmx的值,因为新生代占内存来自整个堆内存。为了优化GC(内存垃圾回收),最好设置-XX:MaxnewSize值约等于-Xmx的1/3
注意:jvm在执行GC时,会停止工作。MaxnewSize的增大,可以降低GC频率
b) 指定测试结果数据存储文件
如上,JMeter中很多插件都提供了结果文件存储设置,为了避免请求测试结果数据都存储到JVM内存(因常驻数据无法回收,量大的话会很快压垮jmeter),需要为插件指定一个文件,把数据存储到该文件,测试前务必要进行这类设置检查。
另外,通常结果文件要保存为CSV格式(比起xml格式,可以少写入好多数据)
c) 针对某些监听器,设置仅记录错误日志
根据第二点的分析,针对某些监听器(比如查看结果树),我们只需关注错误日志信息的情况下,需要勾选“仅日志错误”,这样只会保存错误日志到内存,数据不会多。
d) 通过保存的结果文件“重绘”测试监听结果图表
针对一些不需要在测试过程中“实时”查看的测试“监听器”图表,可以考虑“线下”生成图表。具体做法如下所例。
eg:
如上图,这里添加了监听器“聚合报告”插件,因为我们需要查看相关数据,比如吞吐量,请求耗时等,但是我们不需要实时查看结果,所以把对监听结果“聚合报告”给禁用了(更重要的别因是聚合报告非常消耗CPU。
然后,我们添加了监听器“Simple Data Writer”,并设置结果数据存放文件(例子中为“测试结果.csv”),如果有必要的话还可以点击Configure设置需要保存的条目,文件格式等(通常默认设置就可以了)
注:Simple Data Writer:该监听器可用于记录测试结果到某个文件,但不提供ui展示。
最后,等测试完成后,我们在插件控制面板中,点击浏览按钮,打开上述保存的文件,结果如下,可以看到生成的分析数据了。
注意:
1)Log/Display Only: 仅错误日志Successes
这里如果勾选了仅错误日志,那么记录数据、展示数据的时候只会记录/展示错误日志,如果勾选了Successes,则只会记录/展示成功执行的记录,两个都不勾选,则默认记录全部信息。这点针对其它插件也是如此
2)打开保存的数据文件,默认会分析数据文件中的所有内容,所以,每次执行前都应该重新命名结果文件(可以在输入框中直接输入新的文件名,或者找到存储目录下,备份结果文件后,把结果文件删了),防止每次测试的数据都写入到一个文件里,叠加统计了。这点针对其它插件也是如此
3)每次打开保存的结果数据文件之前,要点击工具栏的 清除、清除全部按钮,清除展示的数据,否则展示的数据会在上次的基础上叠加显示。这点针对其它插件也是如此
e) Jmeter java.net.SocketTimeoutException: connect timed out,Read timed out分析
先交代下测试计划的设置:
JMeter测试计划线程组设置:Ramp-UP Period为5秒。勾选【delay thread creation until needed 】允许需要时创建线程。循环次数设为10。
线程组包含两个请求,分别是①上传数据,②下载数据。设置两个请求之间sleep 3000ms。其他为缺省设置。
每个请求connect time out:3000ms
每个请求response time out:3000ms
分别以递增线程数执行测试,由两个agent分别执行。在线程数为500时,产生错误:
错误1:Response message: Non HTTP response message: connect timed out
错误分析:通过Load time值看,由于该线程耗费时间(3002)大于设置的connect time out(3000ms),因此抛出该异常。问题可能是由于服务端有较多请求正在处理(且处理时间较长),导致JMeter不能连接上服务器而产生的。
JMeter原始错误信息:
概要:
Thread Name: 线程组 1-367
Sample Start: 2013-07-05 11:04:17 CST
Load time: 3002
Latency: 0
Size in bytes: 1677
Headers size in bytes: 0
Body size in bytes: 1677
Sample Count: 1
Error Count: 1
Response code: Non HTTP response code: java.net.SocketTimeoutException
Response message: Non HTTP response message: connect timed out
详细信息:
java.net.SocketTimeoutException: connect timed out
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:529)
at sun.net.NetworkClient.doConnect(NetworkClient.java:158)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:395)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:530)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:234)
at sun.net.www.http.HttpClient.New(HttpClient.java:307)
at sun.net.www.http.HttpClient.New(HttpClient.java:324)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:970)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:911)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:836)
at org.apache.jmeter.protocol.http.sampler.HTTPJavaImpl.sample(HTTPJavaImpl.java:487)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:62)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1088)
at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1077)
at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:428)
at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:256)
at java.lang.Thread.run(Thread.java:662)
错误2:Response message: Non HTTP response message: Read timed out
错误分析:通过返回错误信息看,发生该错误时,JMeter已经连接上服务器,但是产生read time out。从load time(2998)看,所用时间并没有超过设定超时时间(3000),因此错误不大可能是JMeter本身产生的。一种可能是,服务器那边未处理该线程的请求,或者为保证服务能力,断掉了连接。
JMeter原始错误信息:
概要:
Thread Name: 线程组 1-10
Sample Start: 2013-07-05 11:12:45 CST
Load time: 2988
Latency: 0
Size in bytes: 2431
Headers size in bytes: 0
Body size in bytes: 2431
Sample Count: 1
Error Count: 1
Response code: Non HTTP response code: java.net.SocketTimeoutException
Response message: Non HTTP response message: Read timed out
详细信息:
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:697)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:640)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195)
at sun.net.www.protocol.http.HttpURLConnection.getHeaderField(HttpURLConnection.java:2300)
at java.net.URLConnection.getHeaderFieldInt(URLConnection.java:579)
at java.net.URLConnection.getContentLength(URLConnection.java:474)
at org.apache.jmeter.protocol.http.sampler.HTTPJavaImpl.readResponse(HTTPJavaImpl.java:230)
原文:https://www.cnblogs.com/jacksonyi/p/12101093.html