移动测试开发 JMeter 压测环境的搭建-Windows

opentest-oper@360.cn · 2023年01月05日 · 1841 次阅读

引言

JMeter 压测执行支持以下环境:
● windows GUI 压测执行
● windows 分布式压测执行
● windows CLI 压测执行
● Linux CLI 压测执行
● 基于 Dokcer 的分布式压测执行
系列文章一概要介绍了整个压测流程,系列文章二讲解了监控环境搭建。本章节先介绍前三种 windows 中 JMeter 压测环境搭建及执行的方法。

一、windows GUI

以在 Windows 10(64bit)上安装 JMeter version5.4.3 为例。

1.步骤:

①.配置 java 环境
②.下载安装 JMeter

下载地址: http://jmeter.apache.org/download_jmeter.cgi  

● Binaries:二进制版,推荐
● Source:源代码版 (需要自己编译,不推荐)
③.根据需要进行其他插件的配置
④.启动 JMeter(GUI 模式)
到解压缩目录下的 bin 子目录中,找到 jmeter.bat,双击启动即可。

2.备注

● JMeter 官方提示:不要使用 GUI 模式进行负载测试!只有在测试调试或者测试用例设定或者生成的时候才用 GUI 模式。
● GUI 模式带来性能损耗,不适合 500 以上并发的压测执行
● 在 windows JMeter 中直接执行时,需要配置上以下组件,以便观察结果

■ 查看结果树
■ 调试取样器
■ 汇总报告
■ 聚合报告

jp@gc - Active Threads Over Time
jp@gc - Transactions per Second
jp@gc - Response Times Over Time

3.执行

编写好压测脚本后,点击绿色箭头,执行压测。在结果树中查看执行结果。

二、windows 分布式压测执行 - GUI 方式

1.原理

Jmeter 分布式测试时,客户端机器(window 系统或者 Linux 服务器)作为一个控制器 Master,控制多台 slave 机器的操作。

2.配置

①.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 时会报错。

3.执行

在 jmeter GUI 中可以通过如下方式调度远程 slave 机器执行压测任务
菜单项 - 运行 - 远程启动,指定运行机器
菜单项 - 运行 - 远程启动所有,会按照 remote host 中配置的负载机执行压测。

4.查看执行结果

5.清理

运行结束后需要手动去停止每个 slave 节点的进程

三、windows CLI 压测执行

1.简介

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

2.GUI 模式 vs 非 GUI 模式:

什么时候使用 GUI 模式,什么时候使用非 GUI 模式?
上述命令行提示已经非常清晰,不要使用 GUI 模式进行负载测试!只有在测试调试或者测试用例设定或者生成的时候才用 GUI 模式。

3.CLI 相关参数

使用命令与参数如下所示:

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

4.编写 CLI 脚本

D:\handan3 > jmeter -n -t cljzyycone.jmx -l jtl/x.jtl -e -o report/ -JthreadNum=10 -JrampTime=20 -JstepTime=20 -Jduration=10

还有其他的参数就不示例了,需要什么参数,直接用命令行参数-J+ 用户定义变量 ${}+ 动态化命令参数__P() 即可。
查看控制台和生成的报告 - 本机执行

5.远程调度执行脚本

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 中执行了,我们将在下篇文章介绍。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 0 条回复 时间 点赞
opentest-oper@360.cn 关闭了讨论 04月04日 16:25
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册