文章目录
Jmeter小白记录一些学习笔记
- 为什么需要做性能测试?
- 确认服务器是否能够满足用户使用需求:评估当前服务器能够承载多少用户量
- 成本确认:通过峰值评估出部署服务器数量、配置,即最小化成本
- 评估系统系性能,提供系统容量规划、应用调优的依据
1. 什么是性能测试
模拟多个用户的操作对服务器硬件性能的影响
TPS(Transaction per Second) 每秒事物处理能力,可包含多个请求
RT(Response Time) 响应时间
QPS(Queries-per-second) 每秒查询率,即每秒请求数,单个请求
PV(Page Views) 页面访问量
UV(Unique Visitor) 独立访客数
性能指标
并发用户数
QPS每秒请求数
每秒响应时间(最大、最小、平均值)
错误率
机器性能:CPU idle30%、memory无剧烈抖动或者飙升
压测过程中接口功能是否正常
- 基准场景
单业务单用户场景;找到单业务最大TPS和最有响应时间 - 容量场景
递增场景,最大TPS,最快相应时间场景,得到最终系统可正常运行的最大TPS和最有响应时间。即系统的最优运行状态
压测目标预估
- 读取nginx配置数据
cat /data/logs/nginx/access.log | awk -F: '{print $8}' | awk '{print $2}' | sort | uniq -c | sort -k 1 -nr||head
获取到请求量最高的接口
2. 常见性能压力测试用具
工具 | 说明 |
---|---|
Apache ab | Apache HTTP服务器性能基准工具。命令行终端工具。支持HTTP协议 |
Apache JMeter | Java语言开发,开源免费。支持多种协议 |
LoadRunner | C语言开发,收费软件。支持多种协议 |
Locust | Python语言开发,开源免费。支持很多协议,有web操作界面 |
nGrinder | Java语言开发的性能测试平台,免费。Naver公司基于Grinder开发。Grinder是一个能够运行jython(在JVM上运行Python)、groovy编写测试脚本的应用程序。 |
- Jmeter安装
1. JDK安装
确保本地环境的JDK安装和配置 (Jmeter4.x最好使用JDK8以上的版本)
2. Jmeter安装
在官网根据环境下载压缩包解压安装即可
1. Windows:下载zip压缩包
2. Mac、Linux:下载tgz压缩包
Mac环境可以通过
brew install jmeter
命令安装
3. 快速启动Jmeter
进入安装好的Jmeter文件夹的bin
,双击启动文件即可启动
1. Windows:jmeter.bat
文件启动
2. Mac、Linux:jmeter.sh
文件启动
bash Downloads/apache-jmeter-5.6.2/bin/jmeter.sh
4. Jmeter目录核心文件说明
- bin:核心执行文件、配置文件
- 启动文件:
jmeter.bat
jmeter
- 分布式压测使用的启动文件:
jmeter-server.bat
jmeter-server
- 核心配置文件
jmeter.properties
- extras:插件拓展包
- lib:核心依赖包
- ext文件:核心包
- junit:单元测试包
- Jmeter使用
1. 中文语言设置
- 临时修改语言
- Jmeter GUI图形界面的菜单栏找到
Options
点击 - 找到
Choose Language
- 选中需要修改的语言即可改变当前界面的语言表示
再次启动Jmeter时该语言设置无效
- 永久性的语言修改
- 找到安装文件夹下面的
bin/jmeter.properties
文件以文本形式打开 - 找到
#language=en
修改为language=zh_CN
,保存 - 再次启动Jmeter,即为永久行的中文
2. 正则表达式提取器
https://www.cnblogs.com/qmfsun/p/5906462.html
https://blog.csdn.net/u010949766/article/details/79154374
https://blog.csdn.net/wanglha/article/details/50781503
- 变量说明
引用名称
: 变量名即引用参数名,调用方式${变量名}
正则表达式
: 顾名思义就是获取变量值的正则表达式,()
里面表达式获取到的内容则是变量值,即你提取的数据模版
:通过$n$
写入使用哪个正则获取到的值- n=-1 全部
- n=0 随机
- n=1 第一个
- n=2 第二个
(只有一个正则的情况下,n=1;多个正则表达式的情况就需要根据你需要而定)
匹配数字
:-1表示全部、0表示随机、1表示第一个、2表示第二个缺省值
:没有匹配正则表达式的情况下,定义的默认值
- 需要查看提取出来的值
请求>添加>后置处理器:Debug PostProcessor
,运行即可查看
3. Debug PostProcessor
https://blog.csdn.net/hualusiyu/article/details/53503990
4. ThreadGroup
- JMeter压测结果分析
针对结果查看树分析
- 正则表达式提取分析
- CSS选择器
- Xpath提取
- JSON提取
- JMeter聚合报告
- 平均值:所有请求的平均响应时间
- 中位数:50%的用户响应时间不超过这个值
- 99%line:99%的用户响应时间不超过这个值
- error line 异常百分比:错误请求数/总请求数
- throughput 吞吐量:默认情况下每秒处理完成的请求数
- received KB/sec 接收数据
- JMeter分布式压测
单台服务器不能满足同时处理一台服务器性能测试的测试。即单机引发的性能瓶颈,比如cpu、内容以及IO等,所以需要多台服务器来进行测试。
具体内容可参考官方文件:https://jmeter.apache.org/usermanual/jmeter_distributed_testing_step_by_step.html#terminology
配置
- 工作节点部署(slave)
- 负载机配置
负载机和jmeter控制端通信的端口设置为tcp协议的1099。不配置端口也可关闭防火墙即可- bin目录下配置文件修改
- jmeter.properties文件
关闭SSL认证:server.rmi.ssl.disable=true- system.properties文件
java.rmi.server.hostname=当前服务器ip
- 启动当前服务器(bin目录文件下)
windows环境:jmeter-server.bat
mac或linux环境:jmeter-server
- 控制端部署(master)
- 本机端口配置
端口号=4445。不配置端口也可关闭防火墙即可- bin目录配置文件修改
- jmeter.properties文件
- 添加所有负载机的ip,并以逗号隔开:remote_hosts=192.168.101.61,192.18.31.22
- 关闭SSL认证:server.rmi.ssl.disable=true
- 本机执行压测脚本
- 图形化界面
- 启动本机jmeter
- 启动所有负载机器,并运行所有负载机器
- 命令行操作
./jmeter.sh -n -t test.jmx -l test.jtl -R 192.168.101.61,192.18.31.22
-n
非GUI模式下运行-t test.jmx
指定压测脚本-l test.jtl
记录压测日志-R
负载机器ip,多个以逗号隔开(jmeter.properties文件remote_hosts配置项的内容)
参考文献
搜索了一下相关内容的文献,觉得这个文献较为详细,并且还附了问题的处理方案,很赞。
https://blog.csdn.net/m0_67695717/article/details/125975558
- 性能监控体系
1. 监控系统
JMeter+InfluxDB+Grafana
- InfluxDB储存测试数据。Go语言开发的开源分布式时序数据库
- Grafana将结果图形化呈现。一个可视化面板工具
- 部署InfluxDB
- 新建容器网络
docker network create grafana-network
- 创建并运InfluxDB容器
docker run -d --name=influxdb --network grafana-network -p 8086:8086 -v ${pwd}/influxdb/:/var/lib/influxdb/ influxdb:1.7.10
- 创建influx数据库
-
方式一:使用http请求方式
- 创建数据库
>curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE jmeter_db"
- 查看数据库
>curl -i -XPOST http://localhost:8086/query --data-urlencode "q=SHOW DATABASE ;"
-
方式二:终端命令
- influxdb容器进入influx操作界面
>docker exec -it influxdb influx
- 执行sql语句
> 新建数据库create database jmeter_db
> 查看数据库show database
> 使用jmeter_db数据库use jmeter_db
-exit
退出即可
-
- 部署Prometheus
Prometheus是一款实用Go开发的开源系统监控和报警工具。通过使用各种export工具来收集服务器性能数据。通常使用Prometheus监控压测时服务器性能指标。
- docker创建并运行容器
docker run -d --name prometheus --network grafana-network -p 9090:9090 -v ${PWD}/prometheus.yaml:/etc/prometheus/prometheus.yaml prom/prometheus:v2.16.0 --comfig.file=/etc/prometheus/prometheus.yaml
${PWD}/prometheus.yaml
是本地的文件,可通过https://github.com/prometheus/prometheus/blob/master/documentation/examples/prometheus.yaml
下载
# my global config
global:
scrape_interval: 15s # 主动采集数据的频率
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus" # 给需要采集数据的每台服务器配置个名字
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs: # 静态配置
- targets: ["localhost:9090"] # 需要采集数据的服务器ip和端口
scrape_configs
配置查看
2. 针对监控主机性能,就需要在对应需要采集数据的服务器安装export工具
- 下载地址:https://github.com/prometheus/node_exporter/releases
- 解压缩该文件并放置制定地址即可
- 使用方式
./node_exporter --help
参考 - 使用node_exporter时服务器默认监听
9100
端口。可是使用./node_exporter --web.listen-address="当前服务器ip:预期设置的端口"
指定端口启用
比如改成
9102
,使用nohup ./node_exporter --web.listen-address="当前服务器ip:9102" &
cat nohup
查看node_exporter启动输出日志
- 访问node_exporter:
http://当前服务器ip:9102
- 更改prometheus.yaml配置文件,添加待监控服务器配置数据。将以下内容添加到
scrape_configs
即可
- job_name: "node1" # 给需要采集数据的每台服务器配置个名字
static_configs: # 静态配置
- targets: ["上述安装node_exporter服务器的ip:9102"]
- 重启prometheus容器:
docker restart prometheus
- 访问
http://安装prometheus容器的服务器ip:9090/targets
即可查看到配置的待监控服务器配置数据
State
=UP表示正常
- 部署Grafana
- 创建并运Grafana容器
docker run -d --name=grafana --network grafana-network -p 3000:3000 grafana/grafana:6.6.2
http://部署Grafana容器的服务器ip:3000
访问即可- 默认登录账号
admin/admin
dashboard工具
https://grafana.com/grafana/dashboards/
配置InfluxDB数据源
- 配置Data Sources
选择
InfluxDB
URL=http://InfluxDB容器的ip:8086
。亦或者InfluxDB容器本身就和Grafana容器在一个容器网络里,使用http://InfluxDB容器的容器名:8086
亦可
- 获取容器ip
-docker exec -it influxdb sh
-cat /etc/hosts
Database=jmeter_db
Min time interval(数据刷新时间,秒为单位)=5(jmeter写入InfluxDB默认为5秒,所以这里建议5秒或者小于5秒刷新一次数据)
- 配置dashboard
使用https://grafana.com/grafana/dashboards/5496
,点击load
配置Prometheus数据源
收集服务器的数据。同配置influxDB一样操作。
3. 配置Data Sources
选择
Prometheus
URL=http://Prometheus容器的ip:9090
。亦或者Prometheus容器本身就和Grafana容器在一个容器网络里,使用http://Prometheus容器的容器名:9090
亦可
Scrape Interval
=15s
- 配置dashboard
https://grafana.com/grafana/dashboards/8919
导入工具
- JMeter
- 压测脚本配置后端监听器
- influxdbUrl=
http://部署InfluxDB容器的服务器ip:8086/write?db=jmeter_db
- jmeter_db:是在InfluxDB容器创建的数据库
- measurement=jmeter
- jmeter:是Grafana配置dashboard时,导入influxDB,设置
Measurement name
的值
- jmeter:是Grafana配置dashboard时,导入influxDB,设置
- 面板是否展示详细的错误信息
- summaryOnly=false:展示错误信息
- summaryOnly=true:不展示错误信息
- 运行压测脚本
- 访问刷新
http://部署Grafana容器的服务器ip:3000
查看性能测试结果数据
- 问题处理
missing class com.thoughtworks.xstream.converters.ConversionException
- 主要原因
因为缺少jar包导致,具体缺少什么包可以通过jmeter plugin manager
- 解决方案
下载plugins-manager.jar,将其放置在jmeter安装文件的lib/ext
重启Jmeter即可
- 场外知识
本地启动测试服务
python -m http.server 8099
使用ptyhon启动一个8099端口的服务,即可使用http://本地ip:8099
访问
查看本地环境中Java进程使用情况
使用jconsole
命令打开 Java监视和管理控制台
窗口