目录
1. 场景设计
1.1 什么是场景
场景是用来尽量真实地模拟用户操作的工作单元,场景设计源自于用户真实操作。
JMeter的场景设计主要通过线程组设置来完成。
1.2 场景设计的原则是什么
场景设计原则是忠于用户实际操作,组合用户的各种操作到场景中来。
JMeter场景设计不仅是设置线程组,有的复杂场景还需要跟逻辑控制器配合。
2. 场景设置
2.1 JMeter线程组界面解析
重点解析:
(1)在取样器错误后要执行的动作:即其中的某个请求出错后的异常处理方式
1)继续:请求出错后继续运行
因为我们在大量用户并发时,服务器偶尔响应错误是正常现象(比如服务器由于性能问题不能正常响应或响应慢等,这些信息记录下来作为性能问题的依据)。勾选该项,出错后的请求继续进行(可能也会随着失败)。
2)Start Next Thread Loop:如若出错,则同一脚本中的余下请求将不再执行,直接重新开始执行。比如登录失败,发帖操作将不再执行,重新开始新一轮迭代,即重新开始登录。
3)停止线程:如果遇到请求失败,则停止当前线程,该线程不再执行。
总线程数一定的情况下,停止的线程数越多,运行状态的线程就会越来越少,可能导致最后的负载不够。
4)停止测试:如果某一线程的某一请求失败了,则停止所有线程,即停止整个测试。
但每个线程还是会执行完当前迭代后再停止。
5)立即停止测试:如果有线程的请求失败了,则马上停止整个测试场景。
(2)线程属性
1)线程数:一个线程对应一个模拟用户
2)Ramp-up Period(in second):线程启动开始运行的时间间隔,单位是秒。即所有线程在多少时间内开始运行。比如线程数是50,启动时间10秒,那么每秒启动5个线程。如果是0秒,则开始场景后立即启动50个线程。
3)循环次数:请求的重复次数。forever,则请求将一直继续直到停止或崩溃。如果输入数字,则请求将重复指定的次数。
4)Delay Thread creation until needed:
勾选:线程在ramp-up period的时间间隔里启动并运行。比如50个线程10秒,即每隔1秒启动5个线程并运行后面的sampler。
不勾选:测试计划开始后启动所有线程(new),但不马上运行sampler, 是按照ramp-up period时间来运行的。比如50个线程10秒的ramp-up period时间,那么计划开始后,线程全部就绪,但第一秒只会有5个线程开始运行。(???还是没太明白这个区别,待核实)
实际操作中,勾选或不勾选,不影响测试结果。
(3)调度器配置:设置核实开始运行
持续时间:测试计划持续多长时间,如果启动时间+持续时间大于结束时间,那么此设置覆盖结束时间。
启动延迟:点击执行按钮后,仅初始化场景,不运行线程。等待延迟到时候再开始运行线程。如果T(表示当前时间)+ 延迟时间大于启动时间,则覆盖启动时间。
2.2 Java线程的5个状态
(1)new:创建未启动。已经实例化,只是没有开始运行线程的run方法。
(2)runnable:就绪状态。线程对象创建后,其他线程调用了该对象的start()方法,该状态的线程位于可运行线程池中,已经准备好了,只等获取CPU的使用权,然后开始运行。
(3)running:运行状态。就绪状态的线程获取CPU使用权执行程序代码。
(4)blocked:阻塞状态。线程因为某种原因放弃CPU使用权,暂时停止运行(比如IO等待导致的线程处于blocked状态)。直到线程进入就绪状态,才有机会转到运行状态。
阻塞情况有三种:
等待阻塞:运行的线程执行wait()方法,线程进入等待池中。
同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用了,则该线程放入锁池中。
其他阻塞:运行的线程执行sleep()或join()方法,或发出了I/O请求时,该线程设置为阻塞状态。当sleep()状态超时,join()等待线程终止/超时,I/O处理完毕...线程重新转入就绪状态。
(5)dead:死亡状态。执行完毕或者异常退出,线程的生命周期结束。
3. 场景运行
3.1 GUI运行
(1)本地运行
即只运行本地一台JMeter机器,所有请求从一台机器发出。
(2)远程运行
用一台JMeter控制机(Master)来控制远程的多台负载机(Slave)来产生负载。
JMeter控制机与远程负载机的通讯是通过RMI方式来完成的。
在负载机上运行Agent程序(启动命令是%JMETER_HOME%\bin\jmeter-server.bat)。
JMeter控制机(Master)上点击相应运行图标来运行远程负载机。
(3)Agent程序是由ApacheJMeter.bat中的程序来实现的
启动负载机上的Agent, 即双击 jmeter-server.bat。
JMeter控制机开始运行测试计划就会自己探测端口,实施连接。
不过在连接之前,先得告诉JMeter控制机,让它知道要去尝试连接哪些机器。
这个动作需要通过配置文件来完成。
打开控制机里的jmeter.properties文件,搜“remote_hosts”关键字。如图:
注意:
远程运行的脚本如果有参数化文件,或者脚本有依赖包时,需要手工把这些参数文件和依赖包拷贝到远程负载机上。这一点不太灵活。
3.2 非GUI运行
GUI方式运行,会导致负载机的资源紧张,对性能测试结果造成一定影响。
这个不是说影响被测系统的性能,而是影响负载机本身,导致负载量的生成之类的问题。
(1)非GUI方式不显示界面,会以字符形式周期性显示执行结果。对负载机的资源消耗比较小。
(2)非GUI方式的运行命令:
JMeter测试计划是通过ApacheJMeter.jar来完成的。
命令1:java -jar %JMETER_HOME%\bin\ApacheJMeter.jar -n -t %JMETER_HOME%\script\Jforum4-1-01.jmx -r -l result.jtl
命令2:%JMETER_HOME%\bin\jmeter -n -t %JMETER_HOME%\script\Jforum4-1-01.jmx -l %JMETER_HOME%\result\results.jtl
(3)参数:
-h 帮助
-n 非GUI模式
-t 指定要运行的 Jmeter测试脚本.jmx,可以是相对路径或绝对路径
-l 记录结果的文件,每次运行之前要确保之前没有运行过,即xx.jtl不存在,否则会报错
-r 开启远程负载机(非GUI方式),此时,远程服务器(remote host)列表在jmeter.properties中指定
-R 开启远程负载机,-R可以指定负载机IP,会覆盖jmeter.properties中remote_hosts的设置
-e 在脚本运行结束后生成html报告
-o 用于存放html报告的目录(目录要为空,否则报错)
-v 查看版本
-p 指定读取JMeter属性文件,比如jmeter.properties文件中设置的
-s 以服务器方式运行,即远程agent方式
-H 设置代理,一般填写代理IP
-P 设置代理端口
-u 代理账号
-a 代理口令
-J 定义JMeter属性,等同于在jmeter.properties中的设置
-G 定义JMeter全局属性,等同于在Global.properties中进行设置,线程间可以共享
-D 定义系统属性,等同于在system.properties中进行设置
-S 加载系统属性文件,可通过此参数指定加载一个系统属性文件,此文件可以用户自己定义
-L 定义JMeter日志级别,如DEBUG, ERROR等(log4j相关:http://logging.apacge.org)
-d 指定JMeter Home目录
-X 停止远程运行
4. JMeter性能参数配置
%JMETER_HOME%\bin\jmeter.bat中有性能相关的参数,如下图(图源网络)
set HEAP:设置JVM堆大小,-Xms512m,设置初始堆大小512M,-Xmx设置最大堆大小。还可以用-Xmn来设置年轻代大小,官方建议年年轻(-Xmn)大小是最大堆(-Xmx)大小的3/8 (实际可以大一些,通常可以1/2)
set NEW:设置年轻代大小,-XX:NewSize=256m 设置年轻代初始内存大小,-XX:MaxSize=512m设置年轻代最大内存。-Xmn与-XX:MaxSize有重叠,为了方便,只设置-Xmn即可,一般设置-Xms和-Xmx一样大,避免年轻代初始内存占满后扩充空间时内存中数据迁移导致的性能影响。
set SURVIVOR:年轻代分为两个Survivor区(S0和S1)和一个Eden区。-XX:SurvivorRatio=8设置Survivor与Eden大小的比值,S0和S1占年轻代内存的2/(2+8)即1/5,eden占4/5。-XX:TargetSurvivorRatio=50%表示Survivor区的实际使用率为50%,调整Survivor的占用比率可以提高Survivor的利用率,最大为90%。
set TENURING:-XX:MaxTenuringThreshold=2,年轻代晋升年老代周期(经过多少次GC还存活),默认值是15。
set PERM:-XX:PermSize=64m设置持久代初始大小为64M,-XX:MaxPermSize=128m设置持久代最大为128M,-XX:+CMSClassUnloadingEnabled,设置年老代CMS收集器对持久代进行垃圾回收。
set DUMP:-XX:+HeapDumpOnOutOfMemoryError,设置当内存溢出时Dump内存信息,这样好处是JVM崩溃后方便查看堆信息进行问题分析,找到内存溢出的原因。
通常建议修改:
-Xms -Xmx -Xmn -XX:PermSize=64m -XX:MaxPermSize=128m
系统是32时,-Xmx不要超过1.5G.
系统是64时,-Xmn不要超过-Xmx的1/2.
如果这样配置后JMeter产生的负载还是不够大,机器配置又不够了,可以启动多个jmeter实例(在同一台机器上启动多个JMeter,每一个启动的JMeter都是一个独立的进程,端口会自动分配,不用担心端口冲突)。
5. 测试监控
5.1 JMeter监听器
JMeter长时间执行测试计划时,常用的监听器是:Summary Report, Aggregate Report
(1)Summary Report:汇总报告
(2)Aggregate Report:聚合报告
5.2 开源监听插件
JMeter作为开源性能工具,JMeter Plugins增加了众多的监听器,图形化丰富,功能强大。可根据需求使用。