当前位置: 首页 > news >正文

【JMeter详解】

JMeter详解

Apache JMeter 是一个开源的、100%纯Java应用程序,设计用于负载测试和性能测量。它最初是为测试Web应用程序而设计的,但后来扩展到其他测试功能。JMeter可以用来对静态和动态资源(如静态文件、Servlets、Perl脚本、Java对象、数据库和查询、FTP服务器等)进行性能测试。

主要特点:

  • 多样的采样器:支持HTTP, HTTPS, FTP, JDBC, LDAP, WebService, JMS, SMTP, POP3, IMAP等多种协议。
  • 灵活的监听器:提供多种结果查看方式,例如图形化显示、表格形式、树形结构等。
  • 丰富的配置元件:如CSV Data Set Config, User Parameters, HTTP Cookie Manager等,可以帮助设置测试计划。
  • 逻辑控制器:允许你定义执行流程,比如循环、条件判断、事务控制器等。
  • 分布式测试:支持多个JMeter服务器协同工作,以生成更大的负载。
  • 可扩展性:通过插件机制,用户可以编写自己的插件来扩展JMeter的功能。
  • 参数化和数据驱动测试:可以通过外部文件或内置函数实现变量替换,从而支持数据驱动测试。

JMeter与其他工具的对比

与LoadRunner对比

  • 成本:JMeter是免费且开源的,而LoadRunner是商业软件,需要购买许可证。
  • 易用性:LoadRunner拥有更直观的图形用户界面,对于新手来说可能更容易上手;JMeter虽然也有GUI,但对于复杂任务,它的学习曲线可能会更陡一些。
  • 协议支持:LoadRunner支持更多的协议和应用类型,特别是对于企业级的应用程序和非HTTP/HTTPS协议的支持更为广泛。
  • 社区和支持:LoadRunner由Micro Focus官方提供技术支持,而JMeter依赖于活跃的开源社区。
  • 性能:在某些情况下,LoadRunner可能比JMeter表现得更好,尤其是在处理大规模并发用户时。

与Gatling对比

  • 编程语言:Gatling是基于Scala编写的,并且其测试脚本也是使用Scala DSL(领域特定语言),这使得它更适合熟悉Scala或愿意学习Scala的开发者;JMeter则是完全图形化的,不需要编程知识。
  • 报告和分析:Gatling提供了非常漂亮的实时HTML报告,易于理解和分享;JMeter的结果呈现则更加多样化,但需要额外的配置才能达到类似的效果。
  • 性能和效率:Gatling以其高效的性能著称,特别是在高并发场景下;JMeter也可以做同样的事情,但在相同条件下,Gatling通常能处理更多的虚拟用户。

与Locust对比

  • 编程语言:Locust是Python编写的,使用Python脚本来定义用户行为,适合程序员使用;JMeter则不依赖任何编程语言,所有操作都可以通过GUI完成。
  • 灵活性:由于Locust是代码驱动的,因此它可以非常灵活地模拟用户行为,容易实现复杂的业务逻辑;JMeter虽然也有一定的灵活性,但在实现同样复杂的逻辑时可能需要更多的配置。
  • 社区和文档:两者都有活跃的社区,但是JMeter作为一个成熟的项目,拥有更广泛的文档和支持资源。

安装使用:

1. 安装与配置

下载JMeter
  • 访问Apache JMeter官方网站下载最新版本的JMeter。

  • 在这里插入图片描述

  • 解压下载的文件到你选择的目录。

配置环境变量(可选)
  • 如果你想在命令行中直接运行JMeter,可以将JMETER_HOME/bin添加到系统的PATH环境变量中。

  • 在这里插入图片描述

  • 在这里插入图片描述

  • 在这里插入图片描述

2. 创建测试计划

启动JMeter
  • 在解压后的JMeter目录下的bin文件夹中,双击jmeter.bat(Windows)或运行./jmeter(Linux/Mac)启动JMeter GUI。

在这里插入图片描述

新建测试计划
  • 打开JMeter后,点击“File”->“New”来创建一个新的测试计划。
  • 你可以给测试计划命名,并根据需要设置一些全局参数,如是否独立运行每个线程组、函数测试模式等。
  • 在这里插入图片描述

3. 配置线程组

  • 在测试计划中右键点击,选择“Add”->“Threads (Users)”->“Thread Group”来添加一个线程组。

  • 设置线程数(即模拟的用户数量)、Ramp-Up Period(增加用户的速率)和循环次数等参数。例如,如果你想模拟100个用户,每秒启动10个新用户,持续时间15分钟,则可以这样配置:

    • 线程数: 100

    • Ramp-Up Period: 10秒

    • 循环次数: 无限 或者基于你的测试需求设定具体的循环次数

      在这里插入图片描述

4. 添加采样器(Sampler)

  • 在线程组下添加HTTP请求采样器或其他类型的采样器,这取决于你要测试的服务类型。

  • 对于Web应用,通常是添加“HTTP Request”采样器。你需要填写目标URL、请求方法(GET/POST等)、参数等信息。

    在这里插入图片描述

5. 配置监听器

  • 监听器用于收集和展示测试结果。常见的监听器包括“View Results Tree”、“Summary Report”、“Aggregate Report”等。

  • 你可以通过右键点击测试计划或线程组,然后选择“Add”->“Listener”来添加监听器。

    在这里插入图片描述

6. 添加配置元件(可选)

  • 根据需要添加其他配置元件,比如HTTP Header Manager来管理HTTP头部信息,CSV Data Set Config来读取外部数据文件作为测试输入等。

7. 添加逻辑控制器(可选)

  • 逻辑控制器允许你控制采样器的执行顺序,实现更复杂的测试场景。例如,你可以使用Loop Controller来重复执行某些操作,或者使用If Controller根据条件执行特定的操作。

8. 运行测试

  • 保存你的测试计划为.jmx文件。

  • 为了获得最佳性能,建议使用非GUI模式运行测试,尤其是在高负载情况下。你可以使用如下命令行指令:

    jmeter -n -t <test_plan>.jmx -l <results_file>.jtl
    
  • -n表示以非GUI模式运行;-t后面跟的是测试计划文件路径;-l指定结果日志文件的位置。

    在这里插入图片描述

9. 分析测试结果

  • 测试完成后分析JMeter的测试结果是性能测试过程中至关重要的一步,以下是详细的步骤和建议。
1. 使用监听器查看初步结果
Summary Report 和 Aggregate Report
  • Summary Report 提供了每个采样器(请求)的基本统计数据,包括样本数、平均响应时间、最小/最大响应时间、吞吐量(每秒事务数)、错误率等。
  • Aggregate Report 类似于Summary Report,但它还提供了90%线、中位数等更详细的统计信息,有助于评估大多数用户的体验。
View Results Tree
  • View Results Tree 允许你查看单个HTTP请求的详细信息,包括请求头、响应数据、响应码等。这对于调试特定问题非常有用。
Response Time Graph
  • Response Time Graph 显示了响应时间随时间变化的趋势,可以帮助识别响应时间突然增加的时间点,这可能是由于服务器资源耗尽或其他原因引起的。
Transactions per Second (TPS)
  • Transactions per Second (TPS) 图表展示了每秒钟完成的事务数量,对于了解系统的吞吐能力非常重要。
Hits Per Second
  • Hits Per Second 图表展示了每秒钟的请求数量,反映了系统处理请求数量的能力。
Response Codes per Second
  • Response Codes per Second 图表显示了每秒钟返回的不同HTTP状态码的数量,帮助识别失败的请求。
Active Threads Over Time
  • Active Threads Over Time 图表展示了活动线程数随时间的变化,反映了并发用户数的变化。
Bytes Throughput Over Time
  • Bytes Throughput Over Time 图表显示了数据传输速率随时间的变化。
2. 生成HTML报告

JMeter可以生成一个全面的HTML报告,包含多个图表和表格,提供对测试结果的深入分析。要生成HTML报告,请使用以下命令:

jmeter -g <results_file>.jtl -o <output_folder>

HTML报告通常包含以下几个部分:

  • Overview:概述了整个测试期间的关键指标,如总样本数、错误率、平均响应时间等。
  • Response Times Over Time:显示了响应时间随时间的变化趋势。
  • Latencies Over Time:展示了延迟时间随时间的变化趋势。
  • Throughput Over Time:显示了吞吐量随时间的变化。
  • Hits Per Second:展示了每秒点击次数,反映了系统处理请求数量的能力。
  • Response Codes per Second:显示了每秒钟返回的不同HTTP状态码的数量,帮助识别失败的请求。
  • Active Threads Over Time:展示了活动线程数随时间的变化,反映了并发用户数的变化。
  • Bytes Throughput Over Time:显示了数据传输速率随时间的变化。
  • Connect Time vs. Latency:比较了连接时间和延迟时间,有助于分析网络性能。
  • Response Time Percentiles:提供了不同百分位数的响应时间分布,如50%, 75%, 90%, 95%, 99%等,这对于理解大部分用户的实际体验非常有帮助。
3. 分析关键指标
  • 响应时间

    • 平均响应时间 是一个重要的指标,但要注意不要只看平均值。90%或95%的响应时间更能反映大多数用户的实际体验。如果这些高百分位数的响应时间显著高于平均值,可能表明存在长尾效应,即少数请求导致了较慢的响应时间。
  • 吞吐量

    • 吞吐量衡量系统在单位时间内能处理的请求数量。较高的吞吐量意味着系统能够处理更多的流量。
  • 错误率

    • 任何非2xx或3xx的HTTP状态码都被视为错误。高错误率可能表示应用程序存在问题,需要进一步调查。
  • 并发用户数

    • 观察并发用户数与响应时间和吞吐量之间的关系,可以帮助确定系统的最大承载能力。
  • 资源利用率

    • 虽然JMeter本身不直接监控服务器资源,但你可以结合其他工具(如Prometheus, Grafana, 或者服务器自带的监控工具)来监控CPU、内存、磁盘I/O、网络带宽等资源的使用情况。这有助于判断性能瓶颈是否由资源限制引起。
4. 识别性能瓶颈
  • 服务器端

    • 检查服务器的日志文件,寻找异常或错误信息。使用监控工具查看服务器资源的使用情况,确定是否有资源耗尽的情况。
  • 客户端

    • 分析JMeter的测试结果,特别是响应时间和错误率,查找是否存在某些请求特别慢或频繁失败。
  • 网络

    • 考虑网络延迟和丢包的可能性,特别是在跨区域或跨国界的测试环境中。使用ping、traceroute等工具检查网络状况。
  • 代码优化

    • 根据分析结果,可能需要对应用程序代码进行优化,比如改进数据库查询、减少不必要的HTTP请求、优化前端渲染等。

10. 持续改进

  • 根据测试结果调整应用程序代码或服务器配置,优化性能瓶颈。
  • 重新运行测试,对比前后差异,确保改进措施有效。

意事项

  • 不要在GUI模式下进行大规模负载测试,因为GUI会消耗大量资源,影响测试的准确性和效率。
  • 合理规划线程数和Ramp-Up Period,避免一次性启动过多线程导致服务器过载。
  • 考虑分布式测试,如果你的测试需要模拟大量的并发用户,可以考虑使用多台机器组成的JMeter集群来进行分布式测试。

原文地址===》JMeter详解

相关文章:

【JMeter详解】

JMeter详解 Apache JMeter 是一个开源的、100%纯Java应用程序&#xff0c;设计用于负载测试和性能测量。它最初是为测试Web应用程序而设计的&#xff0c;但后来扩展到其他测试功能。JMeter可以用来对静态和动态资源&#xff08;如静态文件、Servlets、Perl脚本、Java对象、数据…...

Maven Wrapper 报错“未找到有效的 Maven 安装”

1. 检查 Maven Wrapper 配置&#xff1a; 确保你的项目中包含 .mvn/wrapper/maven-wrapper.properties 文件。 检查该文件中的 distributionUrl 属性&#xff0c;确保它指向一个有效的 Maven 发行版 URL。 2.确认 Maven Wrapper 脚本存在&#xff1a; 在项目根目录下&#x…...

如何通过 360 驱动大师检查自己电脑上的显卡信息

在深入探讨如何查看显卡信息之前&#xff0c;首先需要了解显卡的基本概念。显卡&#xff08;Graphics Processing Unit, GPU&#xff09;&#xff0c;是计算机中负责处理图形输出到显示器的重要硬件。根据其集成度和性能&#xff0c;显卡通常被分为两类&#xff1a; 集成显卡&…...

C++并发:线程管控

1 线程基本管控 每个C程序都含有至少一个线程&#xff0c;即运行main()的线程&#xff0c;它由C运行时系统启动。随后程序可以发起更多线程&#xff0c;它们以别的函数作为入口。这些新线程连同起始线程并发运行。当main()返回时&#xff0c;程序就会退出&#xff1b;同样&…...

C++ 设计模式:策略模式(Strategy Pattern)

链接&#xff1a;C 设计模式 链接&#xff1a;C 设计模式 - 模板方法 链接&#xff1a;C 设计模式 - 观察者模式 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以…...

SpringBoot(Ⅱ-2)——,SpringBoot版本控制,自动装配原理补充(源码),自动导包原理补充(源码),run方法

SpringBoot的版本控制是怎么做的 starter版本控制 SpringBoot的核心父依赖&#xff0c;下面导入的所有starter依赖都不需要指定版本&#xff0c;版本默认和spring-boot-starter-parent的parent版本一致&#xff1b; xxxstarter内部jar包依赖的版本管理&#xff0c;starter自…...

爬虫的工作原理

摘要&#xff1a; 本文详细阐述了爬虫的工作原理&#xff0c;从其基本概念出发&#xff0c;深入探讨了爬虫的主要组成部分&#xff0c;包括URL管理器、网页下载器、网页解析器和数据存储模块等。同时&#xff0c;分析了爬虫的抓取策略&#xff0c;如深度优先、广度优先等&#…...

你了解DNS吗?

你了解DNS吗&#xff1f; 一. 介绍二. DNS的工作原理三. DNS查询流程示意图四. DNS 记录类型五. DNS的安全问题与 DNSSEC 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一. 介绍 …...

利用JavaScript实现顺序九宫格抽奖

顺序九宫格思路&#xff1a; 1.先获取抽奖按钮,方便给按钮绑定点击事件2.初始化下标k0,用于表示当前选中的索引下标&#xff0c;后续滚动起来会一直刷新3.获取大div盒子4.获取盒子里所有div元素&#xff0c;充当一个数组&#xff0c;后续可以通过下标来访问每个小div&#xff0…...

音视频入门知识(四):封装篇

⭐四、封装篇 H264封装成mp4、flv等格式&#xff0c;那为什么需要封装&#xff1f; ​ h264也能播放&#xff0c;但是按照帧率进行播放&#xff0c;可能不准 ★FLV **FLV&#xff08;Flash Video&#xff09;**是一种用于传输和播放视频的容器文件格式。FLV 格式广泛应用于流媒…...

在基于IMX6ULL的Linux嵌入式编程中,与内存相关的堆(Heap)和栈(Stack)有什么区别?Linux 系统中堆和栈的内存布局是怎么样的?

堆(Heap)和栈(Stack)的概念和区别 在基于 IMX6ULL 的 Linux 嵌入式编程中&#xff0c;堆&#xff08;Heap&#xff09;和栈&#xff08;Stack&#xff09;是两种不同的内存分配方式&#xff0c;各自具有不同的特点和用途。以下是它们的主要区别&#xff1a; 1. 存储位置 堆&am…...

Sealos Devbox 基础教程:使用 Cursor 从零开发一个 One API 替代品

随着技术的成熟和 AI 的崛起&#xff0c;很多原本需要团队协作才能完成的工作现在都可以通过自动化和智能化的方式完成。于是乎&#xff0c;单个开发者的能力得到了极大的提升 - 借助各种工具&#xff0c;一个人就可以完成开发、测试、运维等整条链路上的工作&#xff0c;渡劫飞…...

pthread.h互斥锁与原子操作

一&#xff1a;互斥锁 pthread.h 是 POSIX 线程库的头文件&#xff0c;它提供了多线程编程所需的各种功能。其中&#xff0c;互斥锁&#xff08;mutex&#xff09;的实现涉及多个底层机制&#xff1a; 1. 互斥锁的基本结构 在 POSIX 线程库中&#xff0c;互斥锁通常包含以下…...

网络基础入门到深入(3):网络协议-HTTP/S

目录 一、HTTP和HTTPS协议简介 1.HTTP协议 .HTTP 协议 作用&#xff1a; 特点&#xff1a; 2.HTTPS协议 作用&#xff1a; 实现方式&#xff1a; 特点&#xff1a; 二.HTTP的请求与响应结构 1.HTTP请求结构 1.请求行:描述操作和资源 2.请求头: 3.请求体 : 2.HTTP…...

Git的.gitignore文件详解与常见用法

诸神缄默不语-个人CSDN博文目录 在日常使用 Git 进行版本控制时&#xff0c;我们经常会遇到一些不需要被提交到远程仓库的文件&#xff08;例如日志文件、临时配置文件、环境变量文件等&#xff09;。为了忽略这些文件的提交&#xff0c;Git 提供了一个非常有用的功能&#xf…...

UniApp 组件的深度运用

一、引言 在当今的移动应用开发领域&#xff0c;跨平台开发已成为主流趋势&#xff0c;而 UniApp 作为其中的佼佼者&#xff0c;备受开发者青睐。UniApp 的强大之处很大程度上源于其丰富且功能多样的组件体系&#xff0c;这些组件宛如精巧的积木&#xff0c;能够帮助开发者快速…...

k8s部署nginx+sshd实现文件上传下载

要通过 nginx 和 sshd 实现文件的上传和下载&#xff0c;通常的做法是结合 SSH 协议和 HTTP 协议&#xff0c;使用 nginx 提供 Web 服务器功能&#xff0c;同时使用 sshd&#xff08;即 SSH 服务&#xff09;来处理通过 SSH 协议进行的文件传输。 SSH 实现文件的上传和下载&…...

Spring-Mybatis 2.0

前言&#xff1a; 第一点&#xff1a;过于依赖代码生成器或AI&#xff0c;导致基于mybaits的CRUD通通忘了&#xff0c;所以为了找回遗忘的记忆&#xff0c;有了该系列内容。 第二点&#xff1a;通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能…...

Linux 的历史与发展:从诞生到未来

Linux 的历史与发展&#xff1a;从诞生到未来 1. 起源之前&#xff1a;操作系统的历史背景 在 Linux 问世之前&#xff0c;操作系统的发展经历了多个重要阶段&#xff0c;这些阶段为 Linux 的诞生奠定了基础&#xff1a; 1940-1950 年代&#xff1a;计算机初期 早期计算机如 [[…...

SQL Server实现将分组的其他字段数据拼接成一条数据

在 SQL Server 中&#xff0c;可以使用 STRING_AGG 函数&#xff08;SQL Server 2017 及更高版本支持&#xff09;将分组的其他字段数据拼接成一条数据。以下是示例代码&#xff1a; 假设有一个表 Orders&#xff0c;结构如下&#xff1a; OrderIDCustomerIDProduct1C001Appl…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...