jmeter使用
安装并运行
测试环境用的测试脚本
以下测试是test.jmx文件使用JSR223脚本测试json解析效率:
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.4.1">
<hashTree>
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
<stringProp name="TestPlan.comments"></stringProp>
<boolProp name="TestPlan.functional_mode">false</boolProp>
<boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp>
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="TestPlan.user_define_classpath"></stringProp>
</TestPlan>
<hashTree>
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true">
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
<boolProp name="LoopController.continue_forever">false</boolProp>
<intProp name="LoopController.loops">-1</intProp>
</elementProp>
<stringProp name="ThreadGroup.num_threads">8</stringProp>
<stringProp name="ThreadGroup.ramp_time">0</stringProp>
<boolProp name="ThreadGroup.scheduler">false</boolProp>
<stringProp name="ThreadGroup.duration"></stringProp>
<stringProp name="ThreadGroup.delay"></stringProp>
<boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
</ThreadGroup>
<hashTree>
<JSR223Sampler guiclass="TestBeanGUI" testclass="JSR223Sampler" testname="JSR223 Sampler" enabled="true">
<stringProp name="cacheKey">true</stringProp>
<stringProp name="filename"></stringProp>
<stringProp name="parameters"></stringProp>
<stringProp name="script">import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
String JSON="{\"errorCode\":0,\"errorMessage\":null,\"dataObject\":\"你好\"}";
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(JSON);
int errorCode = node.get("errorCode").asInt();
if(errorCode>0) {
vars.put("registerSuccess","false");
}else {
vars.put("registerSuccess","true");
}</stringProp>
<stringProp name="scriptLanguage">groovy</stringProp>
</JSR223Sampler>
<hashTree/>
</hashTree>
</hashTree>
</hashTree>
</jmeterTestPlan>dcli安装jmeter master模式
安装
dcli命令行工具bashsudo rm -f /usr/bin/dcli && sudo curl https://fut001.oss-cn-hangzhou.aliyuncs.com/dcli/dcli-linux-x86_64 --output /usr/bin/dcli && sudo chmod +x /usr/bin/dcli安装
jmeter masterbashsudo dcli jdk install && sudo dcli jmeter install # 在提示中选择master模式运行
jmeter测试,注意:test.jmx内容是上面提到的测试脚本。bashjmeter -n -t test.jmx
dcli安装jmeter master slave模式
安装
dcli命令行工具bashsudo rm -f /usr/bin/dcli && sudo curl https://fut001.oss-cn-hangzhou.aliyuncs.com/dcli/dcli-linux-x86_64 --output /usr/bin/dcli && sudo chmod +x /usr/bin/dcli在
master虚拟机中安装jmeter masterbashsudo dcli jdk install && sudo dcli jmeter install # 选择master模式 # remote_hosts填写所有jmeter slave ip地址在
slave虚拟机中安装jmeter slavebashsudo dcli jdk install && sudo dcli jmeter install # 选择slave模式 # rmi监听ip地址填写slave本机ip地址,因为master需要使用rmi端口和slave通讯在
master中启动分布式测试,注意:192.168.235.144是jmeter slave的ip地址bashjmeter -n -t test.jmx -R 192.168.235.144停止测试
bash./stoptest.sh
单机测试
注意:使用
dcli安装jmeter master模式。
使用/home/xxx/xxx.jmx文件启动jmeter测试
jmeter -n -t /home/xxx/xxx.jmx判断是否硬件瓶颈导致jmeter分布式测试无法提高性能
在研究jmeter分布式测试性能过程中,会遇到这样的情况:使用笔记本电脑启动多台虚拟机用于部署jmeter集群,但是在测试过程中继续添加更多的虚拟机后QPS却无法提升,这是因为笔记本电脑单机性能达到瓶颈。
怎么测试笔记本电脑单机性能达到瓶颈呢?可以通过创建多个虚拟机分别运行单机版的jmeter,通过此方法找出笔记本电脑最多运行多少个jmeter虚拟机就达到性能瓶颈。
非基于kubernetes的jmeter分布式测试
注意:使用
dcli分别在master虚拟机上安装jmeter master模式,在slave虚拟机上安装jmeter slave模式。
使用/home/xxx/xxx.jmx文件启动分布式jmeter测试
# 启动所有远程主机分布式测试
jmeter -n -t /home/xxx/xxx.jmx -r
# 启动指定远程主机分布式测试
jmeter -n -t /home/xxx/xxx.jmx -R 192.168.1.1,192.168.1.2停止分布式测试,注意:不能关闭master进程,否则master无法接收停止信号转发给slave以达到停止测试
# 停止分布式测试
./shutdown.sh
# 停止分布式测试
./stoptest.sh基于kubernetes的jmeter分布式测试
注意:推荐使用这个方式运行
jmeter分布式测试,因为方便部署和管理。
jmeter slave以DaemonSet方式在kubernetes集群中运行。
示例的详细用法请参考 链接
运行示例步骤:
搭建
openresty目标,用于协助jmeter性能测试,参考链接因为此
jmeter支持自定义RedisBenchmarkSampler插件用于性能测试redis,所以需要先编译此插件 链接bash# 编译插件命令 mvn package编译
docker镜像bash./build-images.sh推送
docker镜像bash./push-images.sh搭建
kubernetes集群,参考链接ubuntu配置kubectl客户端以直接在ubuntu上运行jmeter分布式测试,参考链接启动测试
bash./start_test.sh jmeter.jmx测试期间通过
http://192.168.1.10:30001(其中192.168.1.10是k8s集群的任何一个节点ip地址)登录openresty目标grafana查看压力测试相关数据测试期间通过
http://192.168.1.10:30000/(其中192.168.1.10是k8s master节点的ip地址)登录jmeter的grafana查看jmeter监听器上报的测试数据停止测试
./stop_test.sh基于kubernetes和非基于kubernetes的jmeter分布式测试结果对比
实验配置如下:
jmeter master/k8s master虚拟机centOS8-stream,4核(无限制CPU)+8G内存- 3台
jmeter slave/k8s worker虚拟机centOS8-stream,2核(最高4400MHz CPU频率)+4G内存
实验结果:
- 基于
kubernetes QPS最高50k/s左右 - 非基于
kubernetes QPS最高59k/s左右
实验结论:非基于kubernetes性能高于基于kubernetes环境,可能是由于jmeter运行容器环境性能有所降低或者kubernetes flannel网络性能不如虚拟机之间直接通讯的网络性能高导致(todo:未排查得到证据证明这个猜想)。但是总体基于kubernetes环境的性能损耗还是在可接受范围内的。
GCP平台测试基于kubernetes的jmeter分布式压测结果
实验配置如下:
- 1台
k8s master虚拟机centOS8-stream,虚拟类型e2+4核+8G内存 - 5台
k8s worker虚拟机centOS8-stream,虚拟类型e2+4核+8G内存 - 1台
openresty辅助测试目标虚拟机centOS8-stream,虚拟类型e2+16核+16G内存
实验结果:QPS稳定在164k/s
实验结论:GCP平台上压测每台k8s worker能够产生约32k/s的QPS,jmeter集群产生的总QPS和k8s worker数量成正比的。
jmeter调优
调整堆内存
编译/usr/local/jmeter/bin/jmeter添加HEAP="-Xms2g -Xmx2g"到# resolve links之后。
分布式测试调优jmeter结果样本sender模式
JMeter mode setting : Helps in optimizing the load generation
测试计划中的监听器将结果发送回客户端JMeter,后者将结果写入指定文件。默认情况下,样本在生成时同步发送回。这可能会影响服务器测试的最大吞吐量;在线程可以继续之前,必须返回采样结果。可以设置一些JMeter属性来改变这种行为。
设置
statistical模式此模式主要用于汇总采样,不采样所有字段。此外,采样率取决于批处理模式所描述的属性。样品将根据线组名称和样品标签进行分组。它只累积以下字段,其他字段在样本之间的变化将被忽略: 将累积的字段为:1。时间流逝,2。延迟,3。字节数,4。样本计数和5。错误计数。 这种模式在一定程度上减少了样本数据对网络的影响,并且在分布式环境中也将使用更少的客户端资源。因此,建议在考虑客户端系统性能、网络性能等因素后设置有效阈值。
注意:经过测试设置此模式进行分布式测试单
slave节点性能和单机jmeter性能相当编辑
/usr/local/jmeter/bin/jmeter.properties设置mode=Statistical设置
num_sample_threshold阈值,以减少压力测试样本回传次数导致测试间隙停顿。编辑
/usr/local/jmeter/bin/jmeter.properties设置num_sample_threshold=81920
使用docker运行jmeter+influxdb+grafana
JMeter的基本使用(jmeter+influxDB+Grafana)
提醒:
grafana dashboards JSON文件是通过手动导入https://grafana.com/grafana/dashboards/5496第三方模板后再导出为JSON得到的。
示例的详细配置请参考 链接
jmeter+influxdb+grafana是为了图形化显示jmeter压测结果。
运行步骤:
编译镜像
bashdocker compose build运行示例
bashdocker compose up -d访问
grafana http://localhost:3000/查看jmeter压测状态启动测试制造
influxdb+grafana数据bash./start_test.sh
todo jmeter单机性能调优
todo:搜索一篇外国资料描述jmeter单机或者分布式测试的性能调优博客。调优后使得jmeter分布式测试在相同的硬件配置下发挥出更高的性能。
todo:centos8 系统优化 centos内核优化(在gcp中测试jmeter时,测试以下配置是否有调优效果)https://blog.51cto.com/u_16099314/10091045
1、内存
2、线程数
3、调整Stastic
4、queue size=8192
调整jmeter日志级别
在开发插件过程中,需要调整jmeter日志级别为DEBUG以打印插件调试信息,参考链接
通过jmeter菜单修改日志级别,Options>Log Level>DEBUG