友盟
jmeter 5.2.1 Badboy 2.2.5 JDK 1.8.0_60
1. 性能测试理论
1-1.性能测试,是指在一定的软件、硬件及网络条件下,通过自动化的测试工具
模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试,
从而发现系统的性能瓶颈。也就是说,通过各种测试策略,模拟真实的用户
使用场景,验证系统能“做得怎么样”。
1-2.性能测试常用术语
并发用户,一般分为2种情况。
绝对并发,即所有的用户在同一时刻做同一件事情或者操作,
这种操作一般指做同一类型的业务。
相对并发,与绝对并发的区别是,尽管多个用户对系统发出了请求
或者进行了操作,但是这些请求或者操作可以是相同的,也可以是
不同的。对整个系统而言,仍然是有很多用户同时对系统进行操作,
因此也属于并发的范畴。
点击率(Hits)
单位时间用户向WEB服务器提交的HTTP请求数。这个指标是WEB应用
特有的一个指标:WEB应用是“请求-响应”模式,用户发出一次申请,
服务器就要处理一次,所以点击是WEB应用能够处理的交易的最小单位。
需要注意的是,这里的点击并非指鼠标的一次单击操作,
因为在一次单击操作中,客户端可能向服务器发出多个HTTP请求。
事务响应时间
指的是从客户端发起请求开始,到客户端接收到从服务器端返回的响应结束,
这个过程所耗费的时间,响应时间的单位一般为“秒”或者“毫秒”。
一个公式可以表示:响应时间=网络响应时间+应用程序响应时间。
标准可参考业界的3/5/10原则:
(1)在3秒钟之内,页面给予用户响应并有所显示,可认为是“很不错的”;
(2)在3~5秒钟内,页面给予用户响应并有所显示,可认为是“好的”;
(3)在5~10秒钟内,页面给予用户响应并有所显示,可认为是“勉强接受的”;
(4)超过10秒就让人有点不耐烦了,用户很可能不会继续等待下去。
吞吐量(TPS)
吞吐量是我们常见的一个软件性能指标,对于软件系统来说,
“吞”进去的是请求,“吐”出来的是结果,
而吞吐量反映的就是软件系统的“饭量”,也就是系统的处理能力,
具体说,就是指软件系统在每单位时间内能处理多少个事务/请求等
集合点
进行负载测试时,需要模拟系统上有较重的用户负载。要实现此操作,
可以同步多个Vuser在同一时刻执行同一任务。通过创建集合点,
可以配置多个Vuser同时执行操作。当某个Vuser到达该集合点时,
将进行等待,直到参与该集合的全部Vuser都到达。
指定数量的Vuser均到达后,释放所有这些Vuser。
1-3. 性能测试策略:
1.负载测试:
在一定的软件、硬件及网络条件下,通过运行一种或多种业务在不同
虚拟用户数量情况下,测试系统的性能指标是否在用户的要求范围内,
用于确定系统所能承受的最大有效用户数以及不同用户数下的系统响应时间
及服务器的资源利用率。负载测试强调的是在一定的环境下系统能够达到
的峰值指标,大多数的性能测试都是负载测试。
2.压力测试:
在一定的软件、硬件及网络条件下,通过模拟大量的虚拟用户向服务器产生负载,
使服务器的资源处于极限状态下并长时间连续运行,以测试服务器在高负载
情况下是否能够稳定工作。
与负载测试获得峰值性能数据不同,压力测试强调在极端情况下系统的稳定性。
压力测试方法测试目标系统在一定饱和状态下,例如CPU、内存等在饱和状态下,
系统还能否稳定地提供服务。
3.绝对并发测试:
通过模拟多个用户并发访问一个应用或一个应用的某个功能,同一个存储过程,
或接口以及其他并发操作,测试程序是否支持多用户访问,
是否存在死锁,线程同步的问题。
4.疲劳测试:
有些公司也叫可靠性测试,是软件系统长时间(8小时,7*24小时)运行系统,
检查系统是否能稳定运行,有没有内存泄漏等。
内存溢出--需要占用的内存超过系统的可用内存 (OOM:OutOfMemory)
内存泄漏--内存被长期占用,无法被回收。
1-4. 一般来说,性能测试关注的指标有这些:
1、事务成功率
2、事务平均响应时间和90%的事务响应时间
3、吞吐量(TPS)
4、CPU,内存,IO使用率
1-5. 性能测试流程是什么?
熟悉性能测试需求,确定性能测试点和测试指标;
开发性能测试脚本并调优;
准备性能测试环境,性能测试数据,设计性能测试场景;
监控性能测试环境;
运行性能测试;
分析性能测试结果,提交性能测试bug单,跟踪问题单直到问题被解决;
输出性能测试报告。
----------------------------------------------------------------
2. 脚本录制(以ECShop登录为例)
1.若使用badboy:安装后,使用Badboy打开登录页面,进行录制,简单方便。
2.jmeter脚本录制见最后的补充部分(不方便)
3.登录并发演示(以ECShop前台登录为例):
1.使用Badboy登录并录制脚本(test/123456)
2.导出jmeter脚本:File → Export to jmeter
3.使用jmeter打开脚本,删掉循环结构
4.添加监听器→聚合报告(只关注登录请求,可将聚合报告放在登录请求下面)
5.添加响应断言,断言参数填写指定内容,如:欢迎您回来
6.运行脚本,查看聚合报告
7.右键线程组→ 添加定时器 → 同步定时器,把同步定时器拖到登录请求之前
8.同步定时器模拟用户组的数量填写10,超时时间以毫秒为单位填写15000(15秒)
8-1 模拟用户组数量可以理解为集合点,每满10人同步发起请求,
如果最后一组不到10人,15秒后也发起请求
8-2 可以添加监听器里面的用表格察看结果,
可以看到一组同时发起请求的时间大致是相等的
9.线程组里面,线程数填写120,表示120个用户,Ramp_up时间填写10,
表示10秒钟加载到120个用户,Ramp_up时间一般是用户量的1/10,不可过长
10.线程组里面,勾选调度器,持续时间(秒)填写60,
指的是整个过程持续时间是60秒,60秒后开始退出用户
4.批量注册用户(ECShop注册500个):
1.使用Badboy录制注册脚本,并导出为jmeter脚本
2.使用jmeter打开脚本,删掉循环结构,注册请求的用户名可以
参数化 ${username},密码都统一
3.邮箱可以部分参数化:打开Tools → 函数助手对话框(Ctrl + shift + F1),
选择__time,点击生成按钮,复制函数${__time(,)}到邮箱参数化
3-1.邮箱部分参数化方法2:添加配置元件-计数器,
填写开始值、递增、最大值、引用名称,将变量名称引用到邮箱@前面
3-2.邮箱部分参数化方法3:邮箱@前面直接引用用户名的参数 ${username}
4.线程组循环次数填写500
5.添加聚合报告,查看结果
5.并发测试时查看服务器的CPU、内存、I/O:
1.使用jmeter打开登录请求,用户名参数化,
2.参考《Jmeter监控linux服务器的CPU&内存&IO.docx》,配置jmeter,具体如下:
2-1.解压JMeterPlugins-Standard-1.4.0.zip,
将其中\lib\ext\JMeterPlugins-Standard.jar包
复制到jmeter安装目录下的\lib\ext下;
2-2.重启jmeter,选择监听器,我们可以看到监听器中多了一些东西
3.监听资源利用率:添加监听器→ jp@gc-PerfMon Metrics Collector ,
3-1 点击3次Add Row,主机填写服务器ip,端口默认4444,
监控指标分别选择CPU、Memory、Disks I/O
3-2 如果是监听Windows的CPU之类的,ip就可以localhost
3.3 文件名填写D:\性能练习\perfmon.jtl(不一定是jtl),保存脚本
4.监听响应时间:添加监听器→ jp@gc - Response Times Over Time ,
文件名填写D:\性能练习\responsetime.jtl
5.监听吞吐量:添加监听器→ jp@gc - Transactions per Second ,
文件名填写D:\性能练习\TPS.jtl
6.将课件的代理软件ServerAgent-2.2.1.zip上传到Linux服务器,
可以rz上传到/home/tools/目录下,并解压(不要有中文);
6-1 Linux进入ServerAgent-2.2.1目录,给startAgent.sh执行权限,
直接运行./startAgent.sh,不要关闭
1 若4444端口被占用,使用lsof -i:4444查出哪些进程占用,杀死进程
2 若不用4444端口,也可以使用别的空闲端口启动,
命令为 ./startAgent.sh --udp-port 4466 --tcp-port 4466
3 若监听Windows的cpu之类的,就可以直接运行startAgent.bat
7.线程组用户量不要设置太多(机器扛不住),运行脚本。
如果模拟1200用户,需要用分布式做并发测试。
--------------------------------------------------------------------
分布式性能测试环境搭建
1.参考《Jmeter分布式性能测试环境的搭建步骤.docx》
由于Jmeter本身的瓶颈,当需要模拟数以千计的并发用户时,
使用单台机器模拟所有的并发用户就有些力不从心,
甚至还会引起JAVA内存溢出的错误。要解决这个问题,可以使用分布式测试,
运行多台机器运行所谓的Agent来分担JMeter自身的压力,
并借此来获取更大的并发用户数。
2.先配置主、从机
(controller机器,自身也可作为压力机,agent为代理机,主从机配置相同)
2-1 jmeter脚本和测试数据在主机和从机两边都要存放。
且主机中jmeter脚本、测试数据的存放路径
和从机中jmeter脚本、测试数据的存放路径一致。
主、从机的测试数据地址都要用绝对路径。
2-2 搜索apache-jmeter-5.2.1\bin\jmeter.properties文件中
的 remote_hosts=127.0.0.1,复制后去掉#,把127.0.0.1
改成代理机的IP(其实127代表本机默认ip),后面加上其他代理从机ip,
中间用英文逗号隔开,保存文件。主从机ip要在同一网段,
比如主机为192.168.0.13,从机为192.168.0.40 。
2-3 双击打开压力机apache-jmeter-5.2.1\bin\jmeter-server.bat,
如果启动时报找不到系统文件的错误,
搜索apache-jmeter-5.2.1\bin\jmeter.properties文件中
的server.rmi.ssl.disable=false,复制后去掉#,
把false改成true,保存文件,重启jmeter-server.bat。
1 若启动jmeter-server.bat时报could not find ApacheJmeter_core.jar,
可以添加环境变量JMETER_HOME,路径为jmeter的bin目录的上一级目录,
再次重启jmeter-server.bat即可。也可以忽略这条信息。
2 若启动jmeter-server.bat后,无法启动jmeter.bat,
并报There is insufficient memory或
error='页面文件太小,无法完成操作。',
说明物理机可用内存不够,清理内存后继续即可。
3.启动controller机器的jmeter,选择菜单运行中“远程启动”中的192.168.0.40来运行
指定代理机器;如果所有机器都要执行,可以点击运行菜单下的“远程启动所有”菜单。
4.有时候用作代理的机器太少,仍不能满足需要,则需要将作为Controller的电脑也当
作代理机器,则同样需要修改apache-jmeter-5.2.1\bin\JMeter.properties文件,
将Controller的IP地址写入,具体可参考上述步骤2-1。
同时,需要打先打开Controller电脑中JMeter下bin目录下的jmeter-server.bat,
然后再打开JMeter(注意内存),此时,进入Run -> Remote Start菜单,
可以看到Controller也作为远程机器进行运行
5.如果需要跑1000用户,4台机器,每台机器线程数填写250即可。
除了基准测试,并发测试一般要跑15分钟以上,疲劳测试要跑8小时以上
------------------------------------------------------------------------
《ecshop性能测试需求.txt》 ,用户量以1/10计
需求一:登陆接口
1200,1600, 2000个用户并发登陆,绝对并发量为对应值的10%
需求二:主页访问
1200,1600, 2000个用户登陆系统后,并发访问主页,绝对并发量为对应值的10%
需求三:搜索商品
1200,1600, 2000个用户登陆系统后,并发搜索,绝对并发量为对应值的10%
需求四:提交订单
1200,1600, 2000个用户登陆系统后,并发下单,绝对并发量为对应值的10%
性能测试通过指标:
1、平均事物响应时间和90%的事物响应时间不超过3秒
2、事务的成功率:100%
3、系统的CPU使用率在75%以下,内存使用率在75%以下,IO占用率在70%以下。
PS:具体测试策略,参考《ecshop电商系统-压力测试报告_V1.0.docx》
-----------------------------------------------------------------------
补充:使用jmeter录制脚本(以ECShop登录为例):
1.首先在jmeter里面添加线程组并命名为“线程组-登录”,再添加一个http请求默认值,
填写登录接口的服务器信息。
2.右键测试计划→ 添加→ 非测试元件→ http代理服务器,检查默认端口8888是否可用,
在DOS窗口输入netstat -ano | findstr 8888 ,若无返回信息表明可用,
否则换成别的端口如8889等。
4.目标控制器下拉选择刚才填写的注册线程组“线程组-登录”,最后点击启动。
5.打开浏览器,设置代理,不同的浏览器设置代理方式略有不同,以chrome为例:
5-1.设置代理:设置-高级-系统-打开您计算机的代理设置:连接-局域网设置,
勾选代理服务器,填写地址、端口,地址填写127.0.0.1表示本机(即jmeter所
在的机器),端口填写jmeter里面的如8888。
6.浏览器打开登录页面,填写完登录信息,回到jmeter,选中出现的全部请求
(按住shift键快速选中头尾)删除,再点击登录按钮
7.登录成功后,停止录制,删除登录(一般是第一个请求)以外的请求,
新建一个线程组,将录制的登录脚本复制到新的线程组下,注意看录制的脚本是否
需要添加服务器信息,最后删除原来的线程组、http代理服务器即可。
8.最后记得将浏览器的代理服务器取消勾选,否则无法联网。