前言

压力测试是比较常见的验证接口性能的方式,一般有很多压测工具,其中jmeter是比较实用的开源工具,使用Java语言编写,支持跨平台。实际上压测就是控制变量法,只能在特殊条件下的理想结果,实际运行是有一定差异的,只能作为参考。

1. JDK配置

JDK使用Oracle JDK,openjdk都可以,配置好JAVA_HOME,JDK尽量选择LTS版本,即8,11,17,目前推荐JDK11,优选openjdk。以macos为例,Linux同理,笔者做过jmeter测试OpenJDK与Oracle JDK的性能差异不大,5%~10%左右,主要的JVM参数通用,可以无缝切换。但是ARM版架构的JDK由于JNI的特性,需要部分C/C++的底层so文件支持。不过OpenJDK是没有javafx的,但是有开源jar,直接pom依赖即可org.openjfx。

jemeter哪个版本稳定 jmeter一般常用版本_java

笔者还没有升级,还是JDK8

jemeter哪个版本稳定 jmeter一般常用版本_压测_02

2. jmeter配置

配置path路径,方便执行jmeter指令

jemeter哪个版本稳定 jmeter一般常用版本_压力测试_03

配置好后,执行source指令,让path生效,执行jmeter -v

jemeter哪个版本稳定 jmeter一般常用版本_压力测试_04

3. 压测文件准备

压测可以是rpc协议,也可以是http协议,以常见的http协议为例,底层是socket通信,socket方式有tcp和udp,目前udp被确认在http3.0使用。

3.1 启动jmeter

jemeter哪个版本稳定 jmeter一般常用版本_压测_05

 有2个重要的点

1. 推荐实际压测使用non gui

        不使用gui是因为,一般测试都在服务器上,本身就没有gui,而且一般是最小安装的,而且gui会占用一些资源。

2. 调节jvm参数,在jmeter的启动脚本中

        jmeter.sh脚本明确写了设置JVM的方式JVM_ARGS配置

      

jemeter哪个版本稳定 jmeter一般常用版本_jemeter哪个版本稳定_06

        那么生效的方式呢

        

jemeter哪个版本稳定 jmeter一般常用版本_开发语言_07

         $@ 是传给脚本的所有参数的列表

3.2 参数配置

jemeter哪个版本稳定 jmeter一般常用版本_java_08

实际上jmeter的能力非常全面,以线程池http为例

jemeter哪个版本稳定 jmeter一般常用版本_压力测试_09

一般需要设置用户数,jmeter用线程模拟用户,循环次数,还可以设置定长时间,也可以不设置,按照样本数测试。

jemeter哪个版本稳定 jmeter一般常用版本_压测_10

 选择协议,根据实际情况选择

jemeter哪个版本稳定 jmeter一般常用版本_jemeter哪个版本稳定_11

以http为例,这里的Keepalive点掉,不然端口来不及回收,会报cannot assign requested address

jemeter哪个版本稳定 jmeter一般常用版本_压测_12

如果这个不配置,仍然报错,可以增加服务器使用的端口数量,减少端口超时时间,多台服务器压测,实际上部分参数会引发NAT的故障:(101条消息) 【经验总结】tcp_tw_recycle参数引发的故障_wireless_tech的博客-CSDN博客_tcp_tw_recycle参数修改。 

1. 调低端口释放等待时间,按需调整
sysctl -w net.ipv4.tcp_fin_timeout=15
2. 释放TIME_WAIT端口给新连接使用
sysctl -w net.ipv4.tcp_tw_reuse = 1

3. 增加端口
vim /etc/sysctl.conf
net.ipv4.ip_local_port_range = 10000     65000      #表示10000到65000的端口可用

sysctl -p

 加上一些监听器

jemeter哪个版本稳定 jmeter一般常用版本_开发语言_13

测试验证OK后,导出jmx文件

4. 压测

实际上在启动时jmeter就告诉了用法

jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]

只是这些参数的意义:Apache JMeter - User's Manual: Getting Started


-n, --nongui run JMeter in nongui mode


-t, --testfile <argument> the jmeter test(.jmx) file to run


-e, --reportatendofloadtests generate report dashboard after load test -o, --reportoutputfolder <argument> output folder for report dashboard


使用一个demo测试

nohup jmeter -n -t demo.jmx -l result.jtl -e -o ./res &

生成了result.jtl的结果数据,res目录有生成好的图表

jemeter哪个版本稳定 jmeter一般常用版本_java_14

5. 集群压测

上面的方式简单测试一台服务器足够,但是当需要批量回放或者测试某个环境的时候,单台client就有性能瓶颈,需要多个jmeter的client同时请求,然后把各自的结果聚合汇总。


-r, --runremote Start remote servers (as defined in remote_hosts) -R, --remotestart <argument> Start these remote servers (overrides remote_hosts)


仍然去看参数,有-r的参数,其实就是协同jmeter的server-client集群,架构设计如下,真正干活的是jmeter-server

jemeter哪个版本稳定 jmeter一般常用版本_压力测试_15

Apache JMeter - User's Manual: Remote (Distributed) Testing

 5.1 ssl配置

Apache JMeter - User's Manual: Remote (Distributed) Testing

jemeter哪个版本稳定 jmeter一般常用版本_压力测试_16

 jmeter 4.0开始就需要ssl默认rmi启动时,可以关闭,也可以配置jks并拷贝到bin目录,笔者配置了jks文件证书,并拷贝到各个实例的bin目录

5.2 启动jmeter-server

编辑jmeter的bin目录下的jmeter.properties文件,开启端口,默认就是开启的,我这里使用一台机器,通过不同的端口模拟,所以修改了端口,注意墙通不通,telnet检查

jemeter哪个版本稳定 jmeter一般常用版本_压力测试_17

jemeter哪个版本稳定 jmeter一般常用版本_jemeter哪个版本稳定_18

我这里做了一个本地集群,实际上没什么用,只是模拟demo,如果是多台服务器无需修改端口

启动nohup ./jmeter-server &,启动服务端

jemeter哪个版本稳定 jmeter一般常用版本_压测_19

 5.3 启动client,查看结果

客户端修改远程端口,bin/jmeter.properties文件,笔者使用localhost不行,因为证书原因

jemeter哪个版本稳定 jmeter一般常用版本_开发语言_20

 执行测试命令

./jmeter -n -t demo.jmx -r -l result.jtl -e -o res

命令跟以前一样,只不过增加了-r

jemeter哪个版本稳定 jmeter一般常用版本_java_21

 也可以使用-R,不配置remote_hosts

jemeter哪个版本稳定 jmeter一般常用版本_jemeter哪个版本稳定_22

查看聚合结果,result.jtl和res文件夹,跟以前一样

jemeter哪个版本稳定 jmeter一般常用版本_开发语言_23

总结

jmeter是压测工具的一种,实际上功能十分强大,而且Apache开源项目,简单使用了jmeter压测http,集群压测。只是笔者使用经验的总结,笔者通过这种方式验证了OpenJDK替代Oracle JDK的数据验证,包括性能差异。