JMeter 压测执行支持以下环境:
● windows GUI 压测执行
● windows 分布式压测执行
● windows CLI 压测执行
● Linux CLI 压测执行
● 基于 Dokcer 的分布式压测执行
系列文章一概要介绍了整个压测流程,系列文章二讲解了监控环境搭建。本章节先介绍前三种 windows 中 JMeter 压测环境搭建及执行的方法。
以在 Windows 10(64bit)上安装 JMeter version5.4.3 为例。
①.配置 java 环境
②.下载安装 JMeter
下载地址: http://jmeter.apache.org/download_jmeter.cgi
● Binaries:二进制版,推荐
● Source:源代码版 (需要自己编译,不推荐)
③.根据需要进行其他插件的配置
④.启动 JMeter(GUI 模式)
到解压缩目录下的 bin 子目录中,找到 jmeter.bat,双击启动即可。
● JMeter 官方提示:不要使用 GUI 模式进行负载测试!只有在测试调试或者测试用例设定或者生成的时候才用 GUI 模式。
● GUI 模式带来性能损耗,不适合 500 以上并发的压测执行
● 在 windows JMeter 中直接执行时,需要配置上以下组件,以便观察结果
■ 查看结果树
■ 调试取样器
■ 汇总报告
■ 聚合报告
jp@gc - Active Threads Over Time
jp@gc - Transactions per Second
jp@gc - Response Times Over Time
编写好压测脚本后,点击绿色箭头,执行压测。在结果树中查看执行结果。
Jmeter 分布式测试时,客户端机器(window 系统或者 Linux 服务器)作为一个控制器 Master,控制多台 slave 机器的操作。
①.master 配置
a.更改 jmeter.properties
更改 remote_hosts,添加 slave 的 IP 和 PORT
remote_hosts=IP1:PORT1,IP2:PORT2,...,IPn:PORTn
修改 server_port
server_port=1099
关闭 SSL
server.rmi.ssl.disable=true
可以把 master 既当成主控也可以配置加入 slave 队列中,配置方法同 slave
b.更改 Jmeter-server.sh
RMI_HOST_DEF=-Djava.rmi.server.hostname=IPxxx
c.更改 jmeter.bat
分布式测试时,master 机器有可能遇到多块网卡,然后 IP 会变为其它网段的 IP,故而连接不上其它机器,或返回不了其它机器的执行结果。
在 jmeter.bat,添加如下代码段
if not defined JMETER_COMPLETE_ARGS (
set rmi_host=-Djava.rmi.server.hostname=本机IP
set ARGS=%JAVA9_OPTS% %DUMP% %HEAP% %VERBOSE_GC% %GC_ALGO% %DDRAW% %SYSTEM_PROPS% %JMETER_LANGUAGE% %RUN_IN_DOCKER% %rmi_host%
②.slave 机配置
a. 在 JMeter 的安装目录中找到 bin/jmeter.properties 这个配置文件,更改如下:
server_port=1099
server.rmi.localport=1099
server.rmi.ssl.disable=true
b. 在 JMeter 的安装目录中找到 bin/system.properties 这个配置文件,在文档最后加入 下面
java.rmi.server.hostname=当前机器的 ip
c. windows 修改 jmeter.bat:
做并发测试时,报错 java.lang.OutOfMemoryError:gc overhead limit exceeded 报错。原因是 jmeter 默认分配内存的参数很小。
查找 set HEAP,将 set HEAP=-Xms128m -Xmx512m 修改为 set HEAP=-Xms512m -Xmx512m;
if not defined HEAP (
rem See the unix startup file for the rationale of the following parameters,
rem including some tuning recommendations
rem set HEAP=-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m
set HEAP=-Xms1g -Xmx2g -XX:MaxMetaspaceSize=1g
set NEW=-XX:NewSize=128m -XX:MaxNewSize=512m #新增
)
注意:JDK32 位的电脑 Xmx 不能超过 1500m,最大 1378m,否则在启动 Jmeter 时会报错。
在 jmeter GUI 中可以通过如下方式调度远程 slave 机器执行压测任务
菜单项 - 运行 - 远程启动,指定运行机器
菜单项 - 运行 - 远程启动所有,会按照 remote host 中配置的负载机执行压测。
运行结束后需要手动去停止每个 slave 节点的进程
jmeter 通过-n 来指定非 GUI 模式,缺省状态下会启动 JMeter 的 GUI 界面,而启动时也伴随着如下提示信息:
Don't use GUI mode for load testing !, only for Test creation and Test debugging.
For load testing, use CLI Mode (was NON GUI):
jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
& increase Java Heap to meet your test requirements:
Modify current env variable HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m" in the jmeter batch file
Check : https://jmeter.apache.org/usermanual/best-practices.html
什么时候使用 GUI 模式,什么时候使用非 GUI 模式?
上述命令行提示已经非常清晰,不要使用 GUI 模式进行负载测试!只有在测试调试或者测试用例设定或者生成的时候才用 GUI 模式。
使用命令与参数如下所示:
jmeter -n -t [jmx文件] -l [结果文件] -e -o [测试报告目录]
-n 表示使用非GUI的方式运行
-t 表示指定jmeter的测试脚本
-l 表示生成指定的报告文件
-e 表示生成html报告
-o html报告输出的路径
-j 定义额外的Jmeter属性
具体命令行参数及用法如下:
--?
print command line options and exit
-h, --help
print usage information and exit
-v, --version
print the version information and exit
-p, --propfile <argument>
the jmeter property file to use
-q, --addprop <argument>
additional JMeter property file(s)
-t, --testfile <argument>
the jmeter test(.jmx) file to run. "-t LAST" will load last
used file
-l, --logfile <argument>
the file to log samples to
-i, --jmeterlogconf <argument>
jmeter logging configuration file (log4j2.xml)
-j, --jmeterlogfile <argument>
jmeter run log file (jmeter.log)
-n, --nongui
run JMeter in nongui mode
-s, --server
run the JMeter server
-E, --proxyScheme <argument>
Set a proxy scheme to use for the proxy server
-H, --proxyHost <argument>
Set a proxy server for JMeter to use
-P, --proxyPort <argument>
Set proxy server port for JMeter to use
-N, --nonProxyHosts <argument>
Set nonproxy host list (e.g. *.apache.org|localhost)
-u, --username <argument>
Set username for proxy server that JMeter is to use
-a, --password <argument>
Set password for proxy server that JMeter is to use
-J, --jmeterproperty <argument>=<value>
Define additional JMeter properties
-G, --globalproperty <argument>=<value>
Define Global properties (sent to servers)
e.g. -Gport=123
or -Gglobal.properties
-D, --systemproperty <argument>=<value>
Define additional system properties
-S, --systemPropertyFile <argument>
additional system property file(s)
-f, --forceDeleteResultFile
force delete existing results files and web report folder if
present before starting the test
-L, --loglevel <argument>=<value>
[category=]level e.g. jorphan=INFO, jmeter.util=DEBUG or com
.example.foo=WARN
-r, --runremote
Start remote servers (as defined in remote_hosts)
-R, --remotestart <argument>
Start these remote servers (overrides remote_hosts)
-d, --homedir <argument>
the jmeter home directory to use
-X, --remoteexit
Exit the remote servers at end of test (non-GUI)
-g, --reportonly <argument>
generate report dashboard only, from a test results file
-e, --reportatendofloadtests
generate report dashboard after load test
-o, --reportoutputfolder <argument>
output folder for report dashboard
D:\handan3 > jmeter -n -t cljzyycone.jmx -l jtl/x.jtl -e -o report/ -JthreadNum=10 -JrampTime=20 -JstepTime=20 -Jduration=10
还有其他的参数就不示例了,需要什么参数,直接用命令行参数-J+ 用户定义变量 ${}+ 动态化命令参数__P() 即可。
查看控制台和生成的报告 - 本机执行
master 调度 slave 执行,需要加上 -r 或者 -R 选项
● 调度全部 slave 使用 -r
D:\handan3 > jmeter -n -t cljzyycone.jmx -r -l jtl/x.jtl -e -o report/ -GthreadNum=10 -GrampTime=20 -GstepTime=20 -Gduration=10
● 调度指定 slave 使用 -R slave IP 的形式
D:\handan3 > jmeter -n -t cljzyycone.jmx -R 10.19.1.219 -l jtl/x.jtl -e -o report/ -GthreadNum=10 -GrampTime=20 -GstepTime=20 -Gduration=5
查看控制台 - 远程调度执行
如果压测目标 TPS 要求不高,在 windows 中执行即可。
但是 windows 提供给 TCP/IP 链接的端口有限且回收需要时间,容易遇到端口不足报错。即使调整了 TcpTimedWaitDelay 和 MaxUserPort 也无法支持较大的并发。此时就要在 Linux 中执行了,我们将在下篇文章介绍。