这段时间工作中本人对项目进行了一次压测,用到了不少常见的压测技术,和一些典型的场景,这里简单分享下。看完你可以解答如下一些问题:

  • 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 修改了两个文件,需要我们手动拷贝到远程服务器上

  1. C:\Users\xxxx.jprofiler10\config.xml:这个文件 JProfile建议拷贝到远程服务器,但是实测不需要拷贝也能连上去startup_jprofiler.sh:这个文件必须要拷贝到远程服务器。与前文选择本地 tomcat 启动文件在一个路径,是JProfiler 基于
  2. 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 入门相关推荐

  1. java 压力测试_使用 JMeter 完成常用的压力测试

    讲到测试,人们脑海中首先浮现的就是针对软件正确性的测试,即常说的功能测试.但是软件仅仅只是功能正确是不够的.在实际开发中,还有其它的非功能因素也起着决定性的因素,例如软件的响应速度.影响软件响应速度的 ...

  2. 接口压力测试:Postman【Postman通常用于做接口测试,同时也可以用于作为压力测试】、Jmeter【专门做压力测试】、Loadrunner、Apache AB、Webbench

    做开发的同学一定会遇到接口对接,今天介绍两个对接测试两个我个人认为比较好的测试工具 postman和jmeter 1.postman通常用于做接口测试,同时也可以用于作为压力测试 2.jmeter做压 ...

  3. jmeter压力测试_用Jmeter实现对接口的压力测试

    一.多个真实用户对接口的压力测试 1. 获取多个真实用户的token的两种方法: 1)第一种:让开发帮忙生成多个token(多个用户账户生成的token),导出为csv格式的文件(以下步骤均以该方法为 ...

  4. 压力测试工具Apache JMeter:4:压力测试报告说明与使用技巧

    Apache JMeter是一个纯Java开发的用于负载测试或者性能测试的开源软件.这篇文章介绍一下使用JMeter生成的报告的概要说明,以及使用的技巧和注意事项. 环境准备 关于Apache JMe ...

  5. 压力测试工具Apache JMeter:3:压力测试报告的生成方法

    Apache JMeter是一个纯Java开发的用于负载测试或者性能测试的开源软件.这篇文章介绍一下使用JMeter进行压力测试的两种压力测试报告生成的方法. 环境准备 关于Apache JMeter ...

  6. keepalived+lvs结合nginx压力测试实践

    需求 最近做一个kafka的中间件,需求比较简单,就一个需求:支持的吞吐量为5WQps. 尝试 接口内容比较简单:根据topic,key,value发送到kafka一条数据.把代码撸好-单元测试-部署 ...

  7. 压力测试+接口测试(工具jmeter)

      jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单.因 为jmeter是java开发的,所以运行的时候必须 ...

  8. 压力测试工具Apache JMeter:8:基于Alpine的JMeter镜像

    Apache JMeter是一个纯Java开发的用于负载测试或者性能测试的开源软件.这篇文章介绍一下如何使用Alpine基础镜像将JMeter的压测能力进行容器化,并结合具体的示例来演示此镜像从构建到 ...

  9. 压力测试工具Apache JMeter:11:搭建容器化分布式测试环境

    Apache JMeter是一个纯Java开发的用于负载测试或者性能测试的开源软件.这篇文章介绍一下建立基于JMeter的一主多从的容器化压测环境. 基于Alpine的JMeter镜像 关于基于Alp ...

  10. Java压力测试工具--Apache JMeter的安装与使用

    一.JMeter 这是一个用于java的压力测试工具,可以用于测试静态和动态资源,例如静态文件.Java 小服务程序.CGI 脚本.Java 对象.数据库.FTP 服务器等 具体的使用见下面的博客链接 ...

最新文章

  1. pfSense设置多WAN后,解决网银无法登陆问题
  2. Django常用模板标签
  3. 【译】A Beginner-Friendly Introduction to Containers, VMs and Docker
  4. Windows NT OS 的技术架构图
  5. dp 扔鸡蛋_使用动态编程(DP)的鸡蛋掉落问题
  6. win10安装时,提示“我们无法创建新的分区,也找不到现有分区”
  7. uml边界类例子_面向对象UML笔记
  8. k8s组件通信或者创建pod生命周期
  9. 结巴分词5--关键词抽取
  10. 【RPA之家BluePrism手把手教程】BluePrism下载与安装
  11. IllegalArgumentException: Scrapped or attached views may not be recycled. isScrap:false isAttached:t
  12. html表单验证邮箱表达式,Javascript正则表达式实现表单验证
  13. redis单点故障问题
  14. 【区块链与密码学】第9-1讲:白话群签名
  15. 【JZOJ A组】登山
  16. Idea2020创建一个Servlet
  17. 医药工业洁净厂房配电系统设计与节能应用
  18. 限制html窗口最小宽度,给页面一个最小宽度,小于这个宽度时,出现横向滚动条...
  19. 关于数值策划在使用Excel表时的一点想法
  20. matlab/simulink 汽车空调机模型

热门文章

  1. 【免费毕设】php+mysql社区交流系统(毕业论文+系统+说明书)
  2. 把html转换成PDF的手机软件,如何将MHTML转换为PDF(Convert MHTML to PDF)?
  3. laravel redis_php session 存储到redis里
  4. android连接service,android连接webservice
  5. sql文件加载出错_四十二、SparkSQL通用数据源加载(load)和保存(save)
  6. lda 协方差矩阵_数据降维算法总结(LDAamp;PCA)
  7. HALCON 20.11:深度学习笔记(9)---异常检测
  8. Win10彻底关闭恢复功能、省流量终极设置
  9. 指定JDK版本运行Tomcat
  10. Android/Linux boot time分析优化