压力测试实践一:JMeter + JProfiler 入门
这段时间工作中本人对项目进行了一次压测,用到了不少常见的压测技术,和一些典型的场景,这里简单分享下。看完你可以解答如下一些问题:
- JMeter 如何发送有签名验签或者是加密的复杂请求?
- JMeter 如何控制线程步进式增长?
- JMeter 如何监控服务器负载?
- 如何监控被压测 JVM 状态?线程状态?
JMeter
- 官网地址:jmeter.apache.org/index.html
- 本地 JMeter版本:5.1.1,下载地址
JMeter 添加 Java Request Sampler
绝大多数后端接口形式的请求报文都不是明文,大多都需要进行签名验签,我们项目也不例外。这就是遇到的第一个问题。好在
JMeter 也提供了自定义扩展功能,Java Request,用来 Java 代码自定义发送压测请求的功能。
首先要做的是创建一个单独的项目,目的是 签名验签并发送 HTTP 请求,想要与 JMeter 相结合还必须实现 org.apache.jmeter.protocol.java.sampler.JavaSamplerClient 接口或者继承 org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient,创建好以后假如在 JMeter 界面上配置了当前创建类,JMeter 就会反过来调用你写的方法(钩子、SPI、插件)。
这两个类是在 JMeter 项目有引入,但是自己项目想要访问,可以用 Maven 引入。如果自己创建的项目不是 Maven,可以在 JMeter_HOME/lib/ext 文件夹下找到。所以在这里 Maven 的依赖范围我们选择到了 provided。
<dependency><groupId>org.apache.jmeter</groupId><artifactId>ApacheJMeter_java</artifactId><version>5.3</version><scope>provided</scope>
</dependency>
代码示例如下:
public class TestJavaRequestSamplerClient implements JavaSamplerClient {// 做一些资源的初始化工作public void setupTest(JavaSamplerContext context) {}// 需要的默认参数,会展示在界面上public Arguments getDefaultParameters() {Arguments args = new Arguments();args.addArgument("url", "");args.addArgument("type", "");return args;}// 需要执行的业务方法public SampleResult runTest(JavaSamplerContext context) {// 用于记录执行结果的状态SampleResult sampleResult = new SampleResult();// 获取 JMeter 中输入的用户参数String url = context.getParameter("url", "默认值");String type = context.getParameter("type", "默认值");// 标记开始sampleResult.sampleStart();boolean flag = this.doRequest();sampleResult.setSuccessful(flag);// 标记暂停// sampleResult.samplePause();// 标记重启// sampleResult.sampleResume();// 标记结束sampleResult.sampleEnd();return sampleResult;}private boolean doRequest() {// 组装报文// 进行签名// 发送 HTTP 请求// 解析响应return false;}//public void teardownTest(JavaSamplerContext context) {}
}
接下来需要把这个项目打成 .jar 形式并拷贝到 {JMeter_HOME}\lib\ext 下。接着在 JMeter 界面上添加 Java Request 类型的采样器如下,下拉列表中看到 TestJavaRequestSamplerClient 类了
特别注意几点:
1、Maven 项目的编译等级不要选太高,建议 1.5
2、如果创建的项目还有除 ApacheJMeter_java 以外的依赖,也必须一同拷贝到 {JMeter_HOME}\lib\ext 下
3、jar 文件放置好以后,重启 JMeter 才能识别
JMeter 添加一些常用插件
安装插件省略
- Stepping Thread Group(步进线程组)
这里已经被标记为弃用,新的名字为 Concurrency Thread Group,不过用法也是大同小异。这个插件能很灵活配置线程的启动方式,目的是维护并发级别。
下图是一个本人使用实际压测配置
- Aggregate Report(监听器,聚合报告)
必须加上,统计 TPS 用
- Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值- #Samples:此次测试中共发出了多少请求- Average:平均响应时间——默认情况下是单个 Request 的平均响应时间- Median:中位数,也就是 50% 用户的响应时间- 90% Line:90% 用户的响应时间- 95% Line:95% 用户的响应时间- 99% Line:99% 用户的响应时间- Min:最小响应时间- Max:最大响应时间- Error%:本次测试中出现错误的请求的数量/请求的总数- Throughput:吞吐量——默认情况下表示每秒完成的请求数(Request per Second),可以认为是 TPS- KB/Sec:每秒从服务器端接收到的数据量
- Transactions per Second(每秒事务处理量)
- Response Times Over Time(响应时间变化趋势图)
- PerfMon Metrics Collector(性能指标收集器)
假如要收集被压测服务器资源使用信息,可以用这个插件。首先需要在被压测服务器上启动 ServerAgent 程序,然后在 JMeter 界面配置目标机器以及监控指标,官方文档
下面是一个监控结果
!注意!在 Non-Gui 模式下,使用该插件时必须单独配置 FileName 属性,否则用 -l 参数生成的结果文件导入无法显示监控指标曲线
资料:stackoverflow.com/questions/5…
使用 NON GUI mode 执行脚本
由于 JMeter 界面运行时会损耗一部分的性能,会对压测结果造成偏差。所以一般在压测中使用 non-gui 模式 来运行 JMeter 脚本
在 JMeter 界面上配置好测试计划后,导出为 .jmx 文件,接着使用命令运行它(假如是在另一台 linux 服务器,首先保证需要有 JMeter 程序)
# ./jmeter -n -t demo.jmx -l 结果文件.jtl
上文我们配置一个了 TestJavaRequestSamplerClient 的 Java Request 要求两个参数 url 和 type,在 JMeter non-gui 模式下使用 -J 来传递
# ./jmeter -n -t demo.jmx -Jurl='http://127.0.0.1:8080/test' -Jtype='1' -l 结果文件.jtl
!非常重要!得到 xxx.jtl 结果文件之后,可以使用 JMeter 界面上的 FileName 文件选择框中导入来查看。假如导入时,界面上还显示着上一个报告的内容,!千万要清空后,再导入,否则会发生数据错乱!
JPorfiler
配置好上文列出的 JMeter 插件和配置以后,我们已经可以拿到应用的 TPS 和所对应的服务器资源情况。但如果此时发现程序性能有问题,我们还少个观察、监控应用的功能,来分析性能瓶颈,这里我们选择了 JProfiler
- 官网地址:www.ej-technologies.com/products/jp…
- 本地 JPorfiler
版本:10_1_5,下载地址
方式一【简单、推荐】:使用 Attach 模式(jpenable)
在远端服务器下载好对应的 linux 版本 jprofiler(jprofiler_linux_10_1_5.tar.gz),并解压,接着
然后在本地 Jprofiler 连接即可
方拾二【较麻烦】使用配置向导(添加 jvm 启动参数模式)
选择对应 tomcat 版本(SpringBoot 应用后面会讲)
选择远程
选择立即启动,不等待界面连接
填写远程机器 ip 地址
填写远程服务器 jprofiler 地址
这一步很关键,选择的是本地的 同版本 的 tomcat 启动脚本(startup.sh)。jprofiler
指定通信端口,默认即可
到这里为止,JProfiler 修改了两个文件,需要我们手动拷贝到远程服务器上
- C:\Users\xxxx.jprofiler10\config.xml:这个文件 JProfile建议拷贝到远程服务器,但是实测不需要拷贝也能连上去startup_jprofiler.sh:这个文件必须要拷贝到远程服务器。与前文选择本地 tomcat 启动文件在一个路径,是JProfiler 基于
- startup.sh 修改一个启动脚本,对比可发现最后增加了几行。如下。这个脚本也需要拷贝到远程服务器。放在待压测应用的 tomcat
bin 目录下。
接着执行启动脚本,用 JProfiler 连上即可
# sh ./startup_jprofiler.sh
常见操作
JProfiler 功能非常强大,这里只是当时用到的一些简单操作,后续用到再做补充
从概览中很清楚的能看到各种监控指标,同时可以随时保存当前监控快照,供后续回顾分析
用到的最多的就是
这是一个真实的压测情况快照
很容易就看到线程大片的红色,都被 Blocked,再看下当时线程的 dump,发现都是卡在日志写入
阻塞的原因很多:1. 磁盘读写慢;2. 其他的 IO 读写影响到了文件读写。这里不展开分析。
参考资料
www.cnblogs.com/jackei/arch…
www.cnblogs.com/gossip/p/60…
最后: 可以关注公众号:伤心的辣条 ! 进去有许多资料共享!资料都是面试时面试官必问的知识点,也包括了很多测试行业常见知识,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。
如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!
好文推荐
转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!
面试经:一线城市搬砖!又面软件测试岗,5000就知足了…
面试官:工作三年,还来面初级测试?恐怕你的软件测试工程师的头衔要加双引号…
什么样的人适合从事软件测试工作?
那个准点下班的人,比我先升职了…
测试岗反复跳槽,跳着跳着就跳没了…
压力测试实践一:JMeter + JProfiler 入门相关推荐
- java 压力测试_使用 JMeter 完成常用的压力测试
讲到测试,人们脑海中首先浮现的就是针对软件正确性的测试,即常说的功能测试.但是软件仅仅只是功能正确是不够的.在实际开发中,还有其它的非功能因素也起着决定性的因素,例如软件的响应速度.影响软件响应速度的 ...
- 接口压力测试:Postman【Postman通常用于做接口测试,同时也可以用于作为压力测试】、Jmeter【专门做压力测试】、Loadrunner、Apache AB、Webbench
做开发的同学一定会遇到接口对接,今天介绍两个对接测试两个我个人认为比较好的测试工具 postman和jmeter 1.postman通常用于做接口测试,同时也可以用于作为压力测试 2.jmeter做压 ...
- jmeter压力测试_用Jmeter实现对接口的压力测试
一.多个真实用户对接口的压力测试 1. 获取多个真实用户的token的两种方法: 1)第一种:让开发帮忙生成多个token(多个用户账户生成的token),导出为csv格式的文件(以下步骤均以该方法为 ...
- 压力测试工具Apache JMeter:4:压力测试报告说明与使用技巧
Apache JMeter是一个纯Java开发的用于负载测试或者性能测试的开源软件.这篇文章介绍一下使用JMeter生成的报告的概要说明,以及使用的技巧和注意事项. 环境准备 关于Apache JMe ...
- 压力测试工具Apache JMeter:3:压力测试报告的生成方法
Apache JMeter是一个纯Java开发的用于负载测试或者性能测试的开源软件.这篇文章介绍一下使用JMeter进行压力测试的两种压力测试报告生成的方法. 环境准备 关于Apache JMeter ...
- keepalived+lvs结合nginx压力测试实践
需求 最近做一个kafka的中间件,需求比较简单,就一个需求:支持的吞吐量为5WQps. 尝试 接口内容比较简单:根据topic,key,value发送到kafka一条数据.把代码撸好-单元测试-部署 ...
- 压力测试+接口测试(工具jmeter)
jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单.因 为jmeter是java开发的,所以运行的时候必须 ...
- 压力测试工具Apache JMeter:8:基于Alpine的JMeter镜像
Apache JMeter是一个纯Java开发的用于负载测试或者性能测试的开源软件.这篇文章介绍一下如何使用Alpine基础镜像将JMeter的压测能力进行容器化,并结合具体的示例来演示此镜像从构建到 ...
- 压力测试工具Apache JMeter:11:搭建容器化分布式测试环境
Apache JMeter是一个纯Java开发的用于负载测试或者性能测试的开源软件.这篇文章介绍一下建立基于JMeter的一主多从的容器化压测环境. 基于Alpine的JMeter镜像 关于基于Alp ...
- Java压力测试工具--Apache JMeter的安装与使用
一.JMeter 这是一个用于java的压力测试工具,可以用于测试静态和动态资源,例如静态文件.Java 小服务程序.CGI 脚本.Java 对象.数据库.FTP 服务器等 具体的使用见下面的博客链接 ...
最新文章
- pfSense设置多WAN后,解决网银无法登陆问题
- Django常用模板标签
- 【译】A Beginner-Friendly Introduction to Containers, VMs and Docker
- Windows NT OS 的技术架构图
- dp 扔鸡蛋_使用动态编程(DP)的鸡蛋掉落问题
- win10安装时,提示“我们无法创建新的分区,也找不到现有分区”
- uml边界类例子_面向对象UML笔记
- k8s组件通信或者创建pod生命周期
- 结巴分词5--关键词抽取
- 【RPA之家BluePrism手把手教程】BluePrism下载与安装
- IllegalArgumentException: Scrapped or attached views may not be recycled. isScrap:false isAttached:t
- html表单验证邮箱表达式,Javascript正则表达式实现表单验证
- redis单点故障问题
- 【区块链与密码学】第9-1讲:白话群签名
- 【JZOJ A组】登山
- Idea2020创建一个Servlet
- 医药工业洁净厂房配电系统设计与节能应用
- 限制html窗口最小宽度,给页面一个最小宽度,小于这个宽度时,出现横向滚动条...
- 关于数值策划在使用Excel表时的一点想法
- matlab/simulink 汽车空调机模型
热门文章
- 【免费毕设】php+mysql社区交流系统(毕业论文+系统+说明书)
- 把html转换成PDF的手机软件,如何将MHTML转换为PDF(Convert MHTML to PDF)?
- laravel redis_php session 存储到redis里
- android连接service,android连接webservice
- sql文件加载出错_四十二、SparkSQL通用数据源加载(load)和保存(save)
- lda 协方差矩阵_数据降维算法总结(LDAamp;PCA)
- HALCON 20.11:深度学习笔记(9)---异常检测
- Win10彻底关闭恢复功能、省流量终极设置
- 指定JDK版本运行Tomcat
- Android/Linux boot time分析优化