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 命令行模式
-tJMX 脚本的路径
-lJTL 结果文件的存放路径
分析命令行压测结果

使用命令行执行压测后,输出的日志信息如下:

1
2
3
4
5
6
7
8
9
10
Creating summariser <summary>
Created the tree successfully using product-up.jmx
Starting standalone test @ 2023 Jan 10 13:38:23 CST (1673329103194)
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
Warning: Nashorn engine is planned to be removed from a future JDK release
summary + 16585 in 00:00:06 = 2582.9/s Avg: 70 Min: 7 Max: 314 Err: 0 (0.00%) Active: 200 Started: 200 Finished: 0
summary + 3415 in 00:00:01 = 3162.0/s Avg: 53 Min: 4 Max: 99 Err: 0 (0.00%) Active: 0 Started: 200 Finished: 200
summary = 20000 in 00:00:08 = 2666.0/s Avg: 67 Min: 4 Max: 314 Err: 0 (0.00%)
Tidying up ... @ 2023 Jan 10 13:38:31 CST (1673329111081)
... end of run
  • +:表示过去 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 操作系统,让新增的配置内容生效
    • 若是分布式执行压测的话,控制机器和负载机器都需要这样操作