JMeter 压测教程之一基础使用
大纲
前言
性能指标
RT (Response Time)
:用户从客户端发起一个请求开始,到客户端接收到从服务器端返回的响应结束,整个过程所耗费的时间。HPS (Hits Per Second)
:每秒点击的次数,单位是次 / 秒。TPS (Transaction per Second)
:系统每秒处理交易 (事务) 的笔数,单位是笔 / 秒。QPS (Query per Second)
:系统每秒处理查询的次数,单位是次 / 秒。
对于互联网业务,如果某些业务有且仅有一个请求连接,那么 TPS=QPS=HPS。一般情况下用 TPS 来衡量整个业务流程,用 QPS 来衡量接口查询次数,用 HPS 来表示对服务器的单击请求。
最大响应时间 (Max Response Time)
:指用户发出请求或者指令到系统做出反应 (响应) 的最大时间。最少响应时间 (Mininum Response Time)
:指用户发出请求或者指令到系统做出反应 (响应) 的最少时间。90% 响应时间 (90% Response Time)
:指将所有用户的响应时间进行排序,第 90% 的响应时间。
无论 TPS、QPS、HPS,此指标是衡量系统处理能力非常重要的指标,越大越好,根据经验,一般情况下:
- 金融行业:1000TPS~50000TPS,不包括互联网化的活动
- 保险行业:100TPS~100000TPS,不包括互联网化的活动
- 制造行业:10TPS~5000TPS
- 互联网电子商务:10000TPS~1000000TPS
- 互联网中型网站:1000TPS~50000TPS
- 互联网小型网站:500TPS~10000TPS
从外部看,性能测试主要关注如下三个指标:
吞吐量
:每秒钟系统能够处理的请求数、任务数。响应时间
:服务处理一个请求或一个任务的耗时。错误率
:一批请求中结果出错的请求所占比例。
JMeter 安装
在 JMeter 官网 下载安装包,然后解压文件。进入解压后的 bin
目录,Windows 系统运行 jmeter.bat
,而 Linux 系统运行 jmeter.sh
即可启动 JMeter。
提示
- 本文使用的 JMeter 版本是
5.5
- JMeter 3.2 以上版本需要安装 JDK 1.8 以上版本才能使用。
JMeter 默认支持国际化,因此可以很方便地支持中文显示,切换语言的步骤如下:
JMeter 压测案例
添加线程组
选中 测试计划
并右击,在弹出的菜单中选择 添加
-> 线程 (用户)
-> 线程组
线程组参数详解:
线程数
:虚拟用户数。一个虚拟用户占用一个进程或线程,在这里设置多少个虚拟用户,也就表示设置多少个线程。Ramp-Up 时间 (秒)
:准备时长,即设置的线程数需要在多长时间内全部启动完成。如果线程数为 10, 准备时长为 2, 那么需要 2 秒钟启动 10 个线程,也就是每秒启动 5 个线程。循环次数
:每个线程发送请求的次数。如果线程数为 10,循环次数为 100,那么每个线程发送 100 次请求,即总请求数为 10*100=1000。如果勾选了永远
选项,那么所有线程会一直发送请求,直到选择停止运行脚本为止。延迟创建线程直到需要
:直到需要时延迟线程的创建。持续时间 (秒)
:测试持续时间,会覆盖结束时间。启动延迟 (秒)
:测试延迟启动时间,会覆盖启动时间。启动时间
:测试启动时间,启动延迟会覆盖它。当启动时间已过,手动只需测试时当前时间也会覆盖它。结束时间
:测试结束时间,持续时间会覆盖它。
添加 HTTP 请求
选中已创建的线程组并右击,在弹出的菜单中选择 添加
-> 取样器
-> HTTP 请求
添加监听器
选中已创建的线程组并右击,在弹出的菜单中选择 添加
-> 监听器
-> 汇总报告
、聚合报告
启动压测脚本
GUI 启动压测
特别注意
JMeter 官方要求在一般情况下,要使用命令行启动压测,而不是使用 GUI 的方式。
命令行启动压测
保存压测脚本
将所有操作保存为压测脚本,文件的后缀是 jmx
。
命令行执行压测
进入 JMeter 的 bin
目录,执行压测脚本。
1 | jmeter -n -t /tmp/jmeter/product-up.jmx -l /tmp/jmeter/result.jtl |
参数 | 说明 |
---|---|
-n | 命令行模式 |
-t | JMX 脚本的路径 |
-l | JTL 结果文件的存放路径 |
分析命令行压测结果
使用命令行执行压测后,输出的日志信息如下:
1 | Creating summariser <summary> |
+
:表示过去 30 秒的执行情况=
:表示脚本从开始到现在的运行情况- 在 JMeter 的
/bin/jmeter.properties
配置文件中,可以修改summariser.interval
参数来指定控制台取样的时间间隔,默认值是30
JMeter 查看压测结果
在 JMeter 的界面内打开压测脚本(后缀是 jmx
的文件),找到希望查看的监听器(例如 聚合报告
、汇总报告
),然后点击 浏览
按钮,选中上面生成 JTL 文件后,即可查看对应的压测结果。
命令行生成 HTML 压测报表
JMeter 支持根据 JTL 结果文件生成 HTML 压测报表,具体的使用步骤如下:
- 进入 JMeter 的
bin
目录,修改reportgenerator.properties
配置文件,将jmeter.reportgenerator.overall_granularity
的参数值更改为1000
(设置报表中数据展示间隔 1 秒,默认值为 60 秒) - 创建一个存放数据报表的文件夹 (例如
report
) - 执行下述命令,根据 JTL 结果文件生成 HTML 报表
1 | jmeter -g /tmp/jmeter/result.jtl -o /tmp/jmeter/report |
参数 | 说明 |
---|---|
-g | 指定 JTL 文件的路径 |
-o | 指定 HTML 报表生成到哪个文件夹下 |
- 浏览器打开生成的
index.html
文件,就可以很直观地查看压测结果
压测结果分析
- 若有错误率则需同开发人员确认,确定是否允许错误的发生或者错误率允许在多大的范围内。
- 若吞吐量 (每秒请求的数) 大于并发数,则可以慢慢的往上面增加并发数;若在压测的机器性能很好的情况下,出现吞吐量小于并发数,说明并发数不能再增加了,可以慢慢的往下减,找到最佳的并发数。
- 压测结束,登陆相应的 Linux/Windows 服务器查看 CPU 与内存占用等性能指标,然后进行数据分析。
- 最大的 TPS:不断的增加并发数,加到 TPS 达到一定值开始出现下降,那么那个值就是最大的 TPS。
- 最大的并发数:最大的并发数和最大的 TPS 是不同的,一般不断增加并发数,达到一个值后,服务器出现请求超时,则可认为该值为最大的并发数。
- 压测过程出现性能瓶颈,若在压力机的任务管理器查看到 CPU、网络和内存占用都正常,即均未达到 90% 以上,则可以说明 Linux/Windows 服务器有问题,而压力机没有问题。
提示
影响性能的考虑点包括:数据库、应用程序、中间件 (Tomcat、Nginx)、网络和操作系统等方面,优先考虑运行的应用程序属于 CPU 密集型还是 IO 密集型。
常见错误解决
错误一
错误信息
1 | JMeter Address Already in use |
错误分析
这是 Windows 系统本身提供的端口访问机制导致的。Windows 提供给 TCP/IP 连接的端口为 1024 ~ 5000,并且要每隔四分钟来循环回收它们,因此就导致在短时间内跑大量的请求时将端口占满了。
解决方法
- 在 CMD 窗口中,使用
regedit
命令打开注册表编辑器 - 在
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
下- 右击
Parameters
,添加一个新的 DWORD,名字为MaxUserPort
,然后双击MaxUserPort
,输入数值数据为65534
,基数选择十进制 - 右击
Parameters
,添加一个新的 DWORD,名字为TCPTimedWaitDelay
,然后双击TCPTimedWaitDelay
,输入数值数据为30
,基数选择十进制 - 退出注册表编辑器,重启 Wnidows 操作系统,让新增的配置内容生效
- 若是分布式执行压测的话,控制机器和负载机器都需要这样操作
- 右击