什么是性能压测?
-
也是最近刚刚接触到,就是被测试的系统,在一定的访问压力下,看程序运行是否稳定/服务器运行是否稳定,通常情况,是模拟多个请求同时 请求服务器,也就是在某个时间内,比如说1秒内,调用接口达到200次,结果就是接口调用成功率、最大请求花费时间、最小请求花费时间还有一些性能参数,做性能压测目前来讲大多数来说都是借助 工具软件来完成的,真正去写一套脚本来完成性能压测的步骤已经很少很少了,所以我们接下来讲的就是比较常用的工具-Jme
前期准备!!!
- 首先,你要去官方那里下载Jmeter的压缩包,官方地址是http://jmeter.apache.org/,另外,你的系统要配置好java环境,我写这篇博客的时候,用的版本是3.0,下载完了之后,进入里面的bin目录下, 找到jmeter.bat这个批处理文件,然后双击,进入jMeter的工作界面,这里面有很多功能,这我们先别去理会这一些,按照我们下面的步骤一点一点来做就可以一个基本的压力测试了.
Jmeter性能参数配置
- 线程数:一个用户占一个线程,200个线程就是模拟200个用户;
-
Ramp-Up Period(in seconds):设置线程需要多长时间全部启动。如果线程数为200 ,准备时长为10 ,那么需要1秒钟启动20个线程。也就是每秒钟启动20个线程;
-
循环次数:每个线程发送请求的次数。如果线程数为200,循环次数为10,那么每个线程发送10次请求。总Samples为200*10=2000。如果勾选了“永远”,那么所有线程会一直发送请求,直到选择停止运行脚本。
-
注意,如果要真正模拟多个用户并发的话,比如说你要模拟100个用户并发,那么你的线程数一定得是100,不能是25个线程,每个线程 内包含4个请求,举个栗子,假如有4个接口,要模拟2000个用户并发,每个接口500个用户,那么你的解决方案是:建立4个线程组,每个线程组的线程数是500,同时并发运行4个线程组(这一点你不用做,jmeter的机制 就是线程组都是并发运行的,不用担心这个)
Summary Report参数解释
- Samples:发送了多少个请求;
- Average:平均请求时间;
- Min:最小请求时间;
- Max:最大请求时间;
- Error:请求失败率;
- Troughput:Throughput,即每秒钟服务器处理的Samples,单位是tps(transaction per second),也有说成是rps(request per second);
- KB/sec:服务器每秒接收的数据量;
- 90% Line:90%请求响应时间不会超过XX秒;
- Median:中位数,50%响应时间小于XX秒;
调度器的使用?
答:
-
Jmeter的线程组设置里有一个调配器设置,用于设置该线程组下脚本执行的开始时间、结束时间、持续时间及启动延迟时间.
-
启动时间:测试计划什么时候启动,启动延迟会覆盖它。当启动时间已过,手动运行脚本时也当前时间也会覆盖它(但启动时间页面显示不会变);
-
结束时间:测试计划什么时候结束,持续时间会覆盖它;
-
持续时间(秒):测试计划持续多长时间,会覆盖结束时间;
-
启动延迟(秒):测试计划延迟多长时间启动,会覆盖启动时间.
影响性能压测的参数有哪些?
答:
-
(1).系统服务器所在机器的环境,包含硬件配置内存大小和系统,首先内存大小是这样,比如我们的内存条大小是4G,那么服务器分给用户可支配的大小可能只有3G,剩余的1G用于 系统自身调用,其次,取决于我们当前服务器所在的系统,实际上对应的就是不同的系统默认设置的线程栈所占用的内存大小不同,我们通常所说的线程对应的我们的物理资源就是 线程栈所占用的内存,不同的系统这个值是不同的,可以在装完系统后进行更改,假如我们用户所支配的内存大小是3G,windows一个线程栈是1M,那么当前服务器最多也就支持 3*1024个线程并发,超过这个数目,就需要等待前面的线程完毕之后才能执行,也就是所说的等待状态.
-
(2).web 服务器的配置,我们目前的接口基本上 都是部署在tomcat上,tomcat自身会有一个关于进程的配置,包括最大进程连接数、请求超时时间等.
如何添加关于服务器的CPU、内存等的测试查询?
答:
-
1.下载Jmeter Plugins manager插件,下载地址 http://jmeter-plugins.org/downloads/all/ ;
-
2.解压文件,并将jmeter-plugins-tst-2.0.jar放在jmeter-3.0libext路径下;
-
3.重启Jmeter,并点击上方菜单选项->Plugins Manager;
-
4.点击Avalible Plugins并找到Perfmon插件、点击右下角的Apply Changes and Restart Jmeter;
-
5.重启后点击测试计划->添加->监听器->jp@gc - PerfMon Metrics Collector;
-
6.下载Jmeter ServerAgent插件,下载地址 http://jmeter-plugins.org/downloads/file/ServerAgent-2.2.1.zip;
-
7.解压文件,并将文件放到服务器所在的机器上,目前这款插件支持windows、linux环境;
-
8.启动ServerAgent,windows用bat启动,linux用sh启动,默认占用端口4444;
-
9.在Jmeter的打开界面的jp@gc - PerfMon Metrics Collector插件中配置Host/IP为服务器的IP,然后添加测试的内容,有CPU、内存、网络等;
-
10.在UI方式执行测试计划,就会有结果,但目前还未找到命令行生成的测试查询包含这个插件
如何通过命令行的方式执行测试计划并生成html测试查询?
答:
- 执行命令:jmeter -n -t “test JMX file” -l “test log file” -e -o “Path to output folder”
- 参数解释:
test JMX file-测试计划所在的文件 支持格式为.jmx文件格式;
test log file-默认生成的测试查询文件 支持格式为.jtl或者csv文件格式,默认是.jtl;
Path to output folder-html测试查询存放的路径,是个文件夹; - Jmeter配置:在jmeter.properties或者user.properties确认如下配置项;
- jmeter.save.saveservice.bytes = true
- jmeter.save.saveservice.label = true
- jmeter.save.saveservice.latency = true
- jmeter.save.saveservice.response_code = true
- jmeter.save.saveservice.response_message = true
- jmeter.save.saveservice.successful = true
- jmeter.save.saveservice.thread_counts = true
- jmeter.save.saveservice.thread_name = true
- jmeter.save.saveservice.time = true
- jmeter.save.saveservice.timestamp_format = ms
- jmeter.save.saveservice.timestamp_format = yyyy/MM/dd HHss
Http请求中的Cookie设置
答:Cookie的设置中,也就是HTTP信息头管理器中,如果要设置多个key和多个value, 只需要建立一行,名称是Cookie,值是key1=value1;key2=value2;key3=value3的格式
GUI和Shell压测方式的差异
1.GUI页面更适合单次调试或者少并发的情况下,否则大并发下易造成聚合报告、查看结果树等加载缓慢,图形卡死;
2.Shell页面实时统计(每30s刷新一次)请求总数、平均响应时间、最小请求时间、最大请求时间以及并发量;
3.Shell页面压测过程中,会实时在指定日志文件中记录每个线程每个请求的执行过程,展示项可在jmeter.properties文件中的jmeter.save.saveservice选项下个性化设置;
4.Shell页面压测结束后,会产出更加详细数据以及可视化的html格式的测试报告,更加便于查看和统计(如若压测过程中手动停止压测,如ctrl+c,则不会产生报告);
BeanShell和自定义函数实现MD5算法的差异
BeanShell作为前置处理器中的一种,会在线程发送请求前完成所需操作,如本次压测过程中,由于业务需求,需要进行签名操作,它是脚本语言,动态加载执行,所以效率不高,不太适合放在循环内部,易造成多线程同时调用BeanShell,阻塞在发送在http请求前,实际上客户端并没有在单位时间内发送预期请求数到达服务器端,从而看到服务器的吞吐量和预期并发量相差很多。
Websocket相关压测
答:Jmeter本身不支持websocket协议的,所以需要安装第三方的插件还有6个依赖包。链接: http://pan.baidu.com/s/1kV8QmN1 密码: hx2v 安装方式很简单,解压完成以后直接放到jmeter的libext目录下,然后重启Jmeter就OK了,以下为各项参数含义
WebServer:
(1)Server Name or IP:WebSocket发送的目标服务器的地址或者名称;
(2)Port Number:WebSocker服务器监听的端口号。(一般是HTTP 80端口,可以通过WireShark数据包得到);
Timeout:
(1)Connection – 发送一个连接请求后,Jmeter等待连接完成的最长时间,单位是毫秒;
(2)Response - 对响应消息的最大等待时间;
WebSocket Request:
(1)Implementation – 只支持RFC6455(v13) ,WebSocket协议标准的最新版;
(2)Protocol – 有ws与wss之分, ws前缀是WebSocket连接的辨别标识,wss前缀是WebSocket安全连接的辨别标识。根据自己的实际情况填写;
(3)Streaming Connection – 选择这个TCP session要不要保持,如果勾上标识连接会一直存在,如果没有勾上,那么得到第一次响应后该链接就会被关闭;
(4)Request data:填入将要发送的请求,要跟开发沟通好,这个是什么格式的消息;
WebSocket Response:
(1)Response Pattern – 采样器将等待含有该标识的消息并继续通信(或者直到timeout,该连接关闭);
(2)Close Connection Pattern – 如果服务器返回的消息含有这样的字符,就结束会话;
(3)Message Backlog – 定义服务器返回消息保留的最大长度;
Jmeter上完成Websocket的压测主要流程会涉及到以下三个请求
第一步是http get请求,如http://192.168.6.233:8445/socket.io/?token=test&clientId=GYjJPnSWXYtxb&EIO=3&transport=polling&t=test,得到的response会含有一个字典包含一个字段叫做['sid'],把对应的value值拿到 (可以采用后置处理器中的正则表达式提取器),这一步实现就是向服务器第一次握手,服务器返回唯一的一个会话id;
第二步是http get请求,如http://192.168.6.233:8445/socket.io/?token=test&clientId=GYjJPnSWXYtxb&EIO=3&transport=polling&t=test&sid=value,就是在第一步请求后拼接上sid=value,value等于第一步拿到的值,这一步实现的是向服务器传输一条数据,然后服务器返回响应数据,第二次握手;
第三步是websocket请求,如ws://192.168.6.233:8445/socket.io/?token=test&clientId=GYjJPnSWXYtxb&EIO=3&transport=websocket&t=test&sid=value,就是在第二步请求上将transport=polling改为transport=websocket,这一步实现的是和服务器正式确认连接;