jmeter压力测试动态修改并发参数(下)

发表于:2023-4-27 09:49

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:ke xing    来源:CSDN

  云上的 JMeter 实践
  阿里巴巴有着非常丰富的业务形态,每一种业务形态背后都由一系列分布式的技术体系提供服务,随着业务的快速发展,特别是在双 11 等大促营销等活动场景下,准确评估整个业务站点的服务能力成为一大技术难题。
  在这个过程中,我们打造了自己的全链路压测系统,以应对更复杂、更多样的压测需求,并将此技术输出到 性能测试 PTS 上,同时支持原生 JMeter 压测。
  打开 PTS 控制台 主页,左侧导航栏选择 创建压测 > JMeter 压测 ,新建 JMeter 压测场景。填写场景名,如 jmeter-test 。场景配置 页面点击 上传文件 按钮,上传本地测试通过的 test.jmx 脚本。
  施压配置 页面,并发数设置为 50,压测时长设置为 2 分钟。
  点击 保存去压测,弹出提示框点击 确认,PTS 即开始在云端引擎执行 JMeter 脚本发起压力。
  压测中页面如下:
  压测中实时展示场景(及每个请求页面)实时 RPS 和 RT 等信息。可看到场景并发数为 50,RPS 为 26,RT 为 812 毫秒,与本地压测的结果差不多。
  注意:因为机器配置和网络环境的差异(PTS 施压机默认为 4 核 8G,BGP 多线路公网),PTS 上压测结果可能与本地压测结果存在一定差异。
  针对 JMeter 施压配置,再补充几点说明:
  1、PTS 上的施压配置会覆盖原脚本中的配置。 原脚本无论是写死固定配置还是使用 JMeter 属性配置都没关系。
  2、循环次数表示每个线程循环执行脚本的次数,可能与用户的直觉理解不一样,如 总请求数 = 脚本执行一次的请求数 * 循环次数 * 并发数 。
  3、循环次数与预热时间同时配置时可能导致意外行为(如不能达到最大并发), 因此 PTS 上不允许同时配置预热时间和循环次数(即只有预热时间为 0 时才允许设置循环次数)。
  压测监控分析
  性能测试不仅仅是简单的发起压力,对压力负载(RPS,网络带宽等)和业务表现(RT,成功率等)的监控和分析也是压测活动的重要组成部分。
  JMeter 脚本中每个请求节点(Sampler)可设置一个具有业务含义的名字(如 home 和 download page ),我们可称之为业务 API 。JMeter 监控统计按业务 API 名字汇总,如两个名字相同的请求节点将汇总统计为一个业务 API 。配置脚本时需注意,不同业务 API 节点应配置为不同的名字。
  业务 API 压力负载和表现
  实际工作中,不同业务 API 的统计数据可能存在巨大差异(如浏览商品 RT 通常比提交订单快很多),因此 PTS 默认将各个业务 API 独立统计展示(如上述压测中页面展示的 home 和 download page)。
  压测中每个时间点的数据 PTS 都在后台记录了下来,最终将形成完整直观的压测报告。点击业务 API 实时监控趋势图按钮,即可查看对应的 RPS,成功率,响应时间,网络带宽等监控数据的变化趋势图。
  业务 API 采样日志
  很多时候我们还希望看到一个具体请求执行的详细信息。如有 1% 的请求失败,需要查看完整的请求、响应内容,以排查失败原因等。JMeter 图形界面下测试脚本时,可添加 View Results Tree 查看单个请求的详细信息,但执行压力测试时,对每个请求都记录详细信息,不仅没有必要,而且非常耗费资源,影响施压性能。
  阿里云 PTS 采取了一个折中的办法,施压引擎每 5 秒对每个业务 API(压测 Sampler)分别采样记录一条成功和失败(如果有)的请求详细信息。在压测中或压测报告页面,点击 查看采样日志 按钮即可查询记录的请求采样信息,并支持按业务 API(压测 Sampler),响应状态(是否成功),请求时间等进行搜索过滤。
  点击 查看详情 即可看到单个请求的详细信息。目前对详细信息提供了通用和 HTTP 两种展示模板,HTTP 展示模板可针对 HTTP 请求进行更友好的排版展示,展示内容包括请求 URL,请求方法,返回码,完整的请求头、请求体,响应头、响应体等。
  因为页面上只展示文本内容,请求体或响应体包含图片等无法识别为文本的内容时,可能显示为乱码。另外当请求体或响应体很大时,对应的内容可能被截断。
  JMeter 日志
  本地执行 JMeter 脚本时,默认将日志记录到 jmeter.log 文件。在 PTS 上执行 JMeter 脚本时,可通过 JMeter 日志 页面实时查看 JMeter 日志,并支持根据日志级别、时间或线程名进行查询过滤。
  JMeter 日志主要用于脚本执行报错时排查错误原因。一些插件可能通过 JMeter 日志输出一些重要信息,用户在 groovy 脚本等代码中也可以直接打印日志。
  日志打印过于频繁时,不仅可读性极差(大量重复日志淹没重要信息),而且影响 JMeter 性能,对 PTS 采集存储 JMeter 日志造成额外开销。因此 PTS 在采集 JMeter 日志时默认进行了限流,每秒钟打印日志条数超过 10 条时部分日志可能会丢失。良好设计的 JMeter 脚本应避免大量打印重复日志。
  同样,良好设计的 JMeter 脚本应避免通过标准输出(System.out)或标准错误(System.err)打印输出信息,
  需要输出查看的重要信息应使用 JMeter 日志输出(如 groovy 脚本中使用 log.info("") )。
  PTS 上不支持查看 JMeter 脚本执行产生的标准输出和标准错误内容。
  报告总结
  压测结束后,PTS 将汇总监控数据形成压测报告。用户根据压测报告分析评估系统性能是否符合要求,如 RPS,成功率和 RT(响应时间)是否符合期望。并可辅助用户排查分析业务系统性能瓶颈。
  PTS 压测报告页面可查询历史压测报告列表。
  点击 查看报告 打开查看报告详情。压测报告在 PTS 上默认保存 30 天,可点击 报告导出 按钮,导出保存 PDF 版压测报告到本地。
  压测报告概要信息包括压测执行时间,RPS,RT,成功率等概要数据。场景详情包含全场景维度和业务 API 维度的监控统计信息。
  注意:受 JMeter 引擎本身统计功能的限制,仅全场景维度包含并发数统计。
  此外,全场景维度和业务 API 维度均包含 RPS,成功率,网络带宽等统计。如 home 请求相关监控趋势图如下。
  相比手动命令行执行 JMeter 脚本,PTS 更加 简单易用 ,提供 简单直观的监控 ,并提供 海量施压能力 。
  免费 开通 PTS 服务,购买 5000 VU
  以上资源包,即可使用 JMeter 压测。PTS 计费单位是 VUM ,即并发(VU)* 分钟(最低消费 100 VUM)。上述场景消费为 50 并发 * 2 分钟 = 100 VUM 。如购买 5000 VU资源包,包含 10 万 VUM,售价 ¥278 ,上述计费可换算为 (100 / 10万) * ¥278 = ¥0.278 。
  使用 CSV 参数文件
  上述 JMeter 脚本仅简单请求固定 URL ,真实业务 API 通常带有请求参数。
  JMeter 中可使用 CSV Data Set Config 读取 CSV 数据文件,简单实现请求参数化。CSV 文件默认首行为变量名(列名),其余行为 CSV 数据。准备一个 user.csv 文件,包含 id , name 两列,内容如下:
  id,name
  1,ali
  2,pts
  3,jmeter
  注意:手工编辑 CSV 文件容易出错,推荐使用 Excel、Numbers 等软件导出,或编程使用 apache commons-csv 生成。编辑 JMeter 脚本,右键单击 Thread Group 添加一个 CSV Data Set Config 节点。
  配置如下:
  其中有两个地方需要注意(其他配置保持默认即可):
  1. Filename配置为文件名 user.csv 即可,不要包含文件路径。 不同施压机上 CSV 文件路径可能不一样,只使用文件名(并在当前路径下执行脚本)以便兼容不同的施压机环境。
  2. Sharing mode设置为 Current thread group,指定 CSV 文件只被当前线程组使用。
  假设 home 请求需要设置参数,配置请求参数直接使用 ${id} ,${name} 引用对应的变量即可。
  测试执行脚本,查看 View Results Tree ,可看到执行请求时即会带上请求参数。
  在阿里云 PTS 上执行脚本,只需编辑 JMeter 场景,上传修改后的 test.jmx 脚本文件和 user.csv 数据文件,点击 保存去压测 即可。
  查看请求采样,可看到请求 URL 已添加对应的参数。
  使用 JMeter 插件和附加 jar 包
  JMeter 社区提供了丰富的插件,用户还可以自由添加使用 Java 库 Jar 包。在 PTS 上执行脚本时,只需要将额外添加的插件和 jar 包一起上传到 PTS 上,PTS 执行 JMeter 脚本时即可自动加载这些 Jar 包。
  如果遇到问题,请先确认本地已测试通过,并确认额外使用的 Jar 包已全部上传到 PTS 。
  海量施压能力
  之前的脚本中,我们在请求后添加了 1 秒钟的等待时间以演示业务场景编排。如果压测场景前后请求没有关联,从服务器的角度看只是不停的收到各种请求,与客户端是否等待无关,因此 JMeter 脚本可去掉这些等待时间,以最大压力向服务器发起极限压测。
  JMeter 使用并发(线程)数控制压力大小,通常(并发较小时)线程数越多压力越大。但单台施压机的能力毕竟有限,单机线程数增加到某个阈值时请求压力即达到极限。显然,为了继续增加压力,必须使用多台施压机进行分布式压测。
  分布式压测需要注意以下几点:
  1. 每台施压机需要安装、启动 JMeter,拷贝分发脚本、CSV 数据、附加 jar 包等文件。
  2. 协调分配施压并发数。通常施压机配置相同,均分施压并发数即可。
  3. 统一控制启动、停止压测,统一收集聚合监控数据。
  4. 希望 CSV 数据唯一或打散数据时,多台施压机需要拆分 CSV 数据文件 。
  使用阿里云 PTS 执行 JMeter 脚本时,用户只需要设置期望的最大并发即可 ,PTS 自动透明处理了分布式压测的问题,用户不用关心是单机压测还是分布式压测。PTS 默认每台 JMeter 施压机最大分配 500 并发,场景并发数超过 500 时即自动分配多台施压机。如果希望多台施压机拆分 CSV 数据文件,只要在上传 CSV 文件后勾选 切分文件 即可。详情参考 切分 CSV 数据文件 。
  单机线程数极限与 JMeter 脚本的复杂程度和资源占用(如 CPU,内存,网络带宽占用等)情况有关。占用内存过高的 JMeter 脚本在并发过高时甚至可能会因内存溢出而导致 JMeter 引擎异常退出。对有特殊需求的高级用户,PTS 允许用户手动指定施压机数量,以更精确的控制总并发数和单机并发数。只需在 施压配置 页面勾选 指定 IP 数,设置相应的施压机数量即可。每台施压机有一个 IP 地址,指定 IP 数即指定施压机数量。
  注意:指定 IP 数后,压测执行时独占了指定数量的施压机,每台施压机将按 500 并发计费(无论实际并发多少)。此功能专为有特殊需求的高级用户提供,普通用户通常不需要使用。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号