实现理论上无tps上限的分布式压测(基于Jmeter+InfluxDB+Grafana+Spring Boot)
JMeter自身带有Master-Slave压测框架,对于并发量不是很高的压力情况下(比如tps低于5000),该方案是可行的,并且使用起来非常方便,只要在配置文件或者命令行工具的参数做一些补充,即可以实现分布式压测,具体请参见JMeter官网操作步骤或者UncleYong的文章
但JMeter的Master-Slave有诸多的缺陷:
1.Master机器的瓶颈,JMeter通过RMI的方式来实现Master-Slave的通信,所有的信息最终都会汇总到主机上,一旦slave机器数量增多,并且slave上的并发数上去,Master的压力就会很大
2.无法模拟不同区域内的压测,这个在如今的互联网下的压测有非常大的缺陷,现在日活高的App,基本都是跨地区跨机房部署,所以用户终端到机房这段链路也很重要,但现在的JMeter框架分布式框架实现不了这样的压测
3.带宽的问题,由于我们是局域网环境,往往出口就是一个,这种情况下tps很高并且输入输出不小的情况下,出口的带宽也可能会成为比较大的瓶颈
4.JMeter官方推荐使用非GUI的方式来实现压测,但这样就看不到被压测对象状态,有可能系统以及压垮了还在继续压,没法做到实时监控
所以基于这些问题,我们希望能够实现真正意义上分布式压测工具或者平台,具备的主要功能要求如下:
1.真正的基于互联网的分布式压测,满足市面上绝大部分App的压测要求(日活大几百万)
2.可以实时监控,查询压测状态(压测数据包括tps,error%,响应时间,以及压测机本身)
3.可以快速终止压测,通过#2,一旦发现压测异常如压测达到阈值,那么就可以手动(一键式)或者自动终止压测,避免压垮压测对象
另外还有一些细化的需求,所以整体需求功能如下

技术突破:
JMeter从3.2版本起,新增了InfluxDB的监听器,该监听器支持使用InfluxDB HTTP API并通过异步HTTP调用将度量标准直接推送到数据库,而无需任何额外的数据库配置,再通过influxDB和Grafana的集成,就能实时监控压测状态,核心模块调用逻辑如下

基于上面核心模块,再来实现整个业务平台,这里有两种实现方式,一个是通过Jenkins pipeline来实现压测任务调度及执行,还有一个是通过自建平台(如spring boot框架)来实现。
基于Jenkins pipeline来实现分布式压测如下:
通过pipeline上的Groovy脚本来撰写脚本并且集成类似于ftp plugin,jemeter plugin等插件来串联压测脚本的上传(目标压测机),执行,生成报告等,并通过在JMeter脚本中集成InfluxDB,influxDB集成Grafana,实现实时监控压测状态,并且一旦压测异常,也可以通过pipeline脚本来实现一键式终止压测。这种方式实现起来比较方便,能达到压测效果。但对于功能的扩展,以及压测平台包括插件出bug后的定位等等都不太理想。毕竟脚本语言的组织以及工具的支持不像Java或者Python等有那么多的框架/工具可以支持,需要写很多功能,并且一旦功能多起来,结构就会显得异常臃肿,所以我这边抛弃了这种实现方式,但注意,这种方式是可以实现分布式压测的,并且也能比较快速的能够把分布式压测搭建起来。
基于Spring boot框架来实现压测平台的整合,这种方式是是比较值得推荐的,整体实现方式难度适中,且功能容易扩展。这里我重点说一下我的实现方式
整体框架如下:

整体思路就是:
1. 安装配置好influxDB,并创建相关等数据库,可以参考uncleyong的文章
2. 安装配置好Grafana,并下载JMeter 模板,我比较喜欢这个:https://grafana.com/grafana/dashboards/5496,但上面有不少模板可以选择,可以使用jmeter去search
3. 在JMeter脚本中打通InfluxDB,通过添加InfluxDB等监听器来实现脚本
4. 通过Spring Boot来串联整个压测平台,把压测机信息、压测脚本管理、压测执行、压测终止等接口暴露给前端
5. 通过Redis来缓存热点数据,比如压测机信息,还有压测执行结果等,mysql来做整体数据等存储
6. Spring Boot和压测机之间等打通,推荐使用JSch - Java Secure Channel来实现
7. 分布式执行中会涉及到异步和同步等问题,比如分配到10台机器去执行,这个需要异步下达指令,但需要等所有机器执行完后才汇总压测结果,可以通过@Async + CountDownLatch来实现
实现理论上无tps上限的分布式压测(基于Jmeter+InfluxDB+Grafana+Spring Boot)的更多相关文章
- JMeter分布式压测实战(2020年清明假期学习笔记)
一.常用压力测试工具对比 简介:目前用的常用测试工具对比 1.loadrunner 性能稳定,压测结果及颗粒度大,可以自定义脚本进行压测,但是太过于重大,功能比较繁多. 2.Apache ab(单接口 ...
- 压力测试(八)-多节点JMeter分布式压测实战
1.Jmeter4.0分布式压测准备工作 简介:讲解Linux服务器上jmeter进行分布式压测的相关准备工作 1.压测注意事项 the firewalls on the systems are tu ...
- 案例 | 荔枝微课基于 kubernetes 搭建分布式压测系统
王诚强,荔枝微课基础架构负责人.热衷于基础技术研发推广,致力于提供稳定高效的基础架构,推进了荔枝微课集群化从0到1的发展,云原生架构持续演进的实践者. 本文根据2021年4月10日深圳站举办的[腾讯云 ...
- jmeter5.1分布式压测
在使用jmeter压测过程中,可能会度遇到内存溢出的错误,这是为什么呢?因为jmeter是java写的应用,java应用jvm堆内存heap受负载机硬件限制,虽然我们可以调整堆内存大小,但是单机无法支 ...
- jmeter进行分布式压测过程与 注意事项
jmeter命令行运行但是是单节点下的, jmeter底层用java开发,耗内存.cpu,如果项目要求大并发去压测服务端的话,jmeter单节点难以完成大并发的请求,这时就需要对jmeter进行分布式 ...
- Jmeter(四十七) - 从入门到精通高级篇 - 分布式压测部署之负载机的设置(详解教程)
1.简介 千呼万唤始出来,这一篇感觉写了好久,总想写的清楚明白简洁,但是还是洋洋洒洒写了好多,希望大家喜欢吧!本来打算将这一篇文章是放在性能测试中讲解和分享的,但是有的童鞋或者小伙伴们私下问的太多了, ...
- jmeter分布式压测
stop.sh需要跑Jmeter的服务器上安装Jmeteryum install lrzsz 安装rz.sz命令rz jemter的压缩包 拷贝到/usr/local/tools下面unzip apa ...
- jmeter 分布式压测(Linux)
之前一篇博文写的是如何在Linux上使用jmeter压测,这篇介绍下Linux上jmeter的分布式压测. 和windows上的分布式类似,需要配置agent节点和控制机 一.Agent节点配置 1. ...
- jmeter 分布式压测(windows)
单台压测机通常会遇到客户端瓶颈,受制于客户机的性能.可能由于网络带宽,CPU,内存的限制不能给到服务器足够的压力,这个时候你就需要用到分布式方案来解决客户机的瓶颈,压测的结果也会更加接近于真实情况. ...
随机推荐
- Centos 中文乱码解决方法
问题描述 crontab -e 添加定时任务时,直接将下面内容粘贴过去,结果竟然乱码了. # 每个星期日凌晨3:00执行完全备份脚本 0 3 * * 0 /bin/bash -x /root/bash ...
- nor flash之擦除和写入
最近研究了下nor flash的掉电问题,对nor的掉电有了更多的认识.总结分享如下 擦除从0变1,写入从1变0 nor flash的物理特性是,写入之前需要先进行擦除.擦除后数据为全0xFF,此时写 ...
- Microsoft Visual Studio提示正忙如何解决
打开项目的时候会一直提示正在加载,然后卡死,点击VS界面即出现下如图- 如图: 解决方法: 1.打开项目 找到一个叫vs的文件夹, 2.找到一个后缀是.suo的文件 把它删掉 3.关闭VS进程 重新打 ...
- web网页设计五种布局
1.大框套小框布局 2.通栏布局 3.导航栏在主视觉下方的布局 4.左中右布局 5.环绕式布局
- [bzoj3925] [洛谷P3343] [ZJOI2015] 地震后的幻想乡
Description 傲娇少女幽香是一个很萌很萌的妹子,而且她非常非常地有爱心,很喜欢为幻想乡的人们做一些自己力所能及的事情来帮助他们. 这不,幻想乡突然发生了地震,所有的道路都崩塌了.现在的首要任 ...
- org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 3报错解决
报错的原因翻译出来: 预期的一个结果(或null)返回selectOne(),但发现:3 意思就是你想得到一个结果值,但是返回了三个结果值. 一般可能测试的时候我们存了几条一样的数据,在登录时,会把同 ...
- 基于python的感知机
一. 1.感知机可以描述为一个线性方程,用python的伪代码可表示为: sum(weight_i * x_i) + bias -> activation #activation表示激活函数,x ...
- AutoIT测试实例
AutoIT是一款非常强大的免费功能自动化测试工具,使用它可以轻松实现web和winform的自动化测试.其脚本语言AU3语法类似于VB语言和vbs脚本语言,对于经常使用QTP的童鞋来说,非常容易上 ...
- 看透Spring MVC:源代码分析与实践 (Web开发技术丛书)
第一篇 网站基础知识 第1章 网站架构及其演变过程2 1.1 软件的三大类型2 1.2 基础的结构并不简单3 1.3 架构演变的起点5 1.4 海量数据的解决方案5 1.4.1 缓存和页面静态化5 1 ...
- 创建模仿存储库 Making a Mock Repository 精通ASP-NET-MVC-5-弗瑞曼 Listing 7-5