Jmete+Grafana+Prometheus+Influxdb+Nginx+Docker架构搭建压测体系/监控体系/实时压测数据展示平台+遇到问题总结

背景

需要大批量压测时,单机发出的压力能力有限,需要多台jmeter来同时进行压测;发压机资源不够,被压测系统没到瓶颈之前,发压机难免先发生资源不足的情形;反复压测时候也需要在不同机器中启动压测脚本,更改脚本变动麻烦,收集压测数据难,启动和关闭压测进程难,分布式压测可以让压测时机的把控更准确,实现自由伸缩,一次配置,随处运行。

本文可实现从0到1搭建体系

可能面对的缺点:

1. 单台并发量不够,发压机资源不足
2. 手动方式在不同发压机上脚本更改麻烦
3. 测试结果难以整理
4. 扩增新节点发压时调试麻烦
5. 压测开始/结束时间点无法统一,手动操作有误差
6.长时间压测时,压测数据积压问题。超过1G的压测结果会出问题,严重影响磁盘IO(可更改采点时间间隔,但不是所有场景都适用如果想看到更细粒度数据就会很吃力)。
7. 压测数据保存。每次压测默认会覆盖上次的结果,虽然可以更改复写机制,但总会有超过阈值大小的时间,如果可能 保存到数据库更好。
8. 压测数据展示,不太美观。每次压测完需要根据jtl文件生成html报告
9. 发压机资源监控,无法知道发压机是否达到资源瓶颈,是否需要添加额外服务器,此举可有效节约服务器资源。
10. 每次执行都需要登录服务器进行操作,是否可集成到Jenkins中,每次运行直接在web端指定IP地址,进行压测?(需详细调研加以尝试)
一台Master,一台Slave,每次扩展只需要对Slave打一个镜像,拷贝几个相应虚拟机,压测时直接指定相应IP地址 

搭建阶段

1.集群压测+数据入库 

2.发压机指标监控 

3.CI/CD集成Jenkins (待定)

Jmeter 分布式集群搭建

一. 分布式压测注意点

  1、运行相同版本的JMeter(两台机器版本不一致,需要重新升级)

  2、使用相同的java版本

  3、都在一个网段

  4、server.rmi.ssl.disable开关一致

  5、关闭防火墙

  6、使用的JMeter插件一致

  7、如果压测的是java脚本,需要将java脚本和相关lib包都放在jmeter目录lib/ext下,在每一台机器上都得有脚本文件和依赖的jar包(如果是http脚本,在Master的机器上有脚本文件即可)

  8、将jmeter的场景文件jmx上传到Master jmeter的任意位置,参数文件需要放到每一台压力机上(如果脚本中涉及从外部读取的csv文件,那该文件就需要上传到各个slaver施压机上) 9、关闭运行时千万不要通过control+c终止运行,需要再开一个窗口,在主jmeter的bin目录下"./shutdown.sh" 就会向从压力机发布指令,结束运行;

  10、若是脚本中设置的并发线程数是100,采用3台slaver机器去施加压力,那么对于服务端来说,此时的并发线程数是300。

二. Jmeter分布式压测原理了解

1、分为控制器(controller)和代理(agent),也有人叫master机和slave机(总控机器的节点master,其他产生压力的机器叫“肉鸡” server) 2、master会把压测脚本发送到 server上面

3、执行的时候,server上只需要把jmeter-server打开就可以了,不用启动jmeter 4、结束后,server会把压测数据回传给master,然后master汇总输出报告

controller 作为控制器不加入实际测试,只负责发送和收集 agent 信息。

三.参数优化

1. 控制台 取样 间隔的设置(linux中的日志输出时间间隔)

summariser.interval=10,默认时间为30秒,最低可修改为6秒 (在jmeter的bin目录下 jmeter.properties)

2. JVM优化 (按照4c 8g配置)

因为整台服务器就是为性能测试使用,所以jvm堆栈可以调到最大比例,防止压测时发压机OOM异常。修改jmeter的bin目录下,vi jmeter,修改HEAP的size大小如下,也可以设置为6G,建议自测调整JVM大小

"${HEAP:="-Xms4g -Xmx4g -XX:MaxMetaspaceSize=512m"}"

3. 修改默认编码

sampleresult.default.encoding=UTF-8

4. linux中没有实时输出日志

解决不输出实时日志:修改配置文件jmeter.properties中的配置项

找到 #summariser.ignore_transaction_controller_sample_result=true 改为 summariser.ignore_transaction_controller_sample_result=false

5. 进入jmeter的bin目录下,修改reportgenerator.properties

修改 jmeter.reportgenerator.overall_granularity=1000 (报表中数据展示间隔1秒钟)

6. 打开主从机器交互配置,修改jmeter.properties文件

将server.rmi.ssl.disable=true(去掉注释)【主从之间默认是https的,在局域网内部使用,没有必要使用https方式】

 7. 指定运行 slave节点,二选一配置

本机通过第二种方式

更改bin/jmeter-server,指定RMI_HOST_DEF=-Djava.rmi.server.hostname=本机内网ip,或者通过运行命令指定本机IP来启动nohup ./jmeter-server -Djava.rmi.server.hostname=192.168.0.107 &

否则会报错如下:

Server failed to start: java.rmi.RemoteException: Cannot start. localhost.localdomain is a loopback address. An error occurred: Cannot start. localhost.localdomain is a loopback address.

8.压测执行 顺序

1. slave以server方式执行

执行命令如下(需要确认下新开的slave 是否会执行该命令 加载环境变量 将本机IP刷到Jmeter参数中)

该命令会将slave上的Jmeter以后台方式运行,并且将当前机器ip添加到jmeter-server配置中

localhostPrivateIp=$(/sbin/ifconfig -a eth0 |grep inet|grep -v 127.0.0.1|grep -v inet6 | awk '{print $2}' | tr -d "addr:") && nohup ./jmeter-server -Djava.rmi.server.hostname=$localhostPrivateIp &

2.Master压测

运行时需要指定—R 127.0.0.1 128.0.0.1 

jmeter -n -t getUserInfoById.jmx -l res.jtl -R 112.16.63.227(slave的内网ip地址英文逗号分隔)

如果想要压测执行,请在Master节点中

进入jmeter/bin/目录下
运行 ./shundown.sh 

实时数据展示平台搭建

使用Docker+Nginx+Prometheus+Grafana+Influxdb+Node-exporter方式

1.InfluxDb部署和配置 

拉取镜像
docker pull influxdb:1.7.10启动容器
(后面的命令是为了让容器和宿主机的时间一致,避免因时间不一致导致的数据不显示问题)docker run  -d --name=influxdb -p 8086:8086 -v ${PWD}:/var/lib/influxdb influxdb:1.7.10  /etc/localtime:/etc/localtime进入容器
docker exec -it influxdb bash 输入命令
influx进入influx内部
show databases;
查看influxdb现有数据库使用命令
create database jmeter; 
创建名为jmeter的数据库use jmeter; 
使用该数据库 show measurements;
查看下面具备哪些表select * from "表名字";
查看表中具有哪些数据

效果展示 

2.Grafana部署

Grafana就是一个报表展示平台,相比来说配置和安装更加容易,Grafana版本之间可能会有稍许差别,此处使用版本9.3.2;

拉取镜像
docker pull grafana/grafana:9.3.2运行镜像
(--link 是为了让grafana和influxd网络互通)
docker run -d --name=grafana --link=influxdb:influxdb -p 3000:3000 grafana/grafana:9.3.2

效果截图

3.Prometheus部署和配置

注意

首先在tmp目录下新建prometheus和prometheus.yml文件

prometheus+docker方式部署+加载Nginx端口转发配置+允许热加载node-exporter+挂在配置文件到宿主机+prometheus允许后缀名方式访问(和Nignx配置对应)

拉取镜像
docker pull pro/prometheus 运行镜像
docker run -d -p 9090:9090 -v /tmp/prometheus:/etc/prometheus --name=prometheus prom/prometheus --config.file=/etc/prometheus/prometheus.yml --web.route-prefix=/ --web.external-url=/prometheus/ --web.enable-lifecycle 

安装完prometheus并配置好Nginx和Node-exporter 后可访问IP/prometheus/ ,查看prometheus配置了几个node-exporter

4.Nginx 部署(Yum方式)

yum install -y nginx 

安装完nginx , 修改配置文件,在/etc/nginx/nginx.conf

运维给我开通的是外网80端口,所以我就直接用80端口代理Grafana的web页面

完整http块内的配置如下(可能有的配置冗余,但也懒得去排查修改了)

http {log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile            on;tcp_nopush          on;tcp_nodelay         on;keepalive_timeout   65;types_hash_max_size 4096;include             /etc/nginx/mime.types;default_type        application/octet-stream;# Load modular configuration files from the /etc/nginx/conf.d directory.# See http://nginx.org/en/docs/ngx_core_module.html#include# for more information.include /etc/nginx/conf.d/*.conf;server {listen       80;listen       [::]:80;server_name  _;root         /usr/share/nginx/html;location /prometheus/{proxy_pass http://127.0.0.1:9090/;proxy_set_header X-Real-IP $remote_addr;proxy_redirect default;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade";proxy_set_header Host $http_host;}location /influxdb/ {proxy_pass http://127.0.0.1:8086/;}location ^~ / {index index.html index.htm;proxy_pass http://127.0.0.1:3000/;proxy_set_header X-Real-IP $remote_addr;proxy_redirect default;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade";proxy_set_header Host $http_host;}# Load configuration files for the default server block.include /etc/nginx/default.d/*.conf;error_page 404 /404.html;location = /404.html {}error_page 500 502 503 504 /50x.html;location = /50x.html {}}

5. Jmeter压测数据写入Influxdb

在相应Thread Group中添加Backend Listener,最好给不同的Backend Listener 起不同的名字,防止同时多脚本压测时出现数据写入混乱的问题;

  • 1. 选择指定implementation

  • 2.填写influxdb所在地址和端口,以及数据库名,如下截图(因为脚本要跑在Linux内网环境,所以 URL 我写的是内网IP)

  • 3.measurement名字填写jmeter

  • 4.application 可以填写指定名称(不同脚本)

  • 5.填写的application名称会在Dashboard中的 application内显示,执行压测脚本时,会显示实时数据

  • 6.Transaction 显示的是Samper名称

效果展示

6. Node-exporter部署,监控发压机

在需要监控的机器上,使用docker方式部署node-exporter

新服务器部署node-exporter 步骤 
docker pull prom/node-exporterdocker run -d --net="host" --name node_exporter --restart=unless-stopped -p 9100:9100 -v "/proc:/host/proc:ro" -v "/sys:/host/sys:ro" -v "/:/rootfs:ro" prom/node-exporter然后在prometheus中配置该node-exporter所在地址和端口号 - job_name: 'Jmeter-slave-'# metrics_path defaults to '/metrics'# scheme defaults to 'http'.static_configs:- targets: ['IP:9100']

加上新配置的node-exporter之后,使用命令在prometheus所在机器 进行 prometheus热加载更新,然后访问Prometheus web页面,确认该node-exporter是否添加到监控体系当中 

curl -X POST http://ip:9090/-/reload

7.Grafana展示Jmeter实时压测数据+展示Node-exporter数据

点击grafana的logo看到COMPLETE,add data source 新增数据源

1.Grafana 配置 Jmeter压测数据源 

指定docker中的influxdb:8086,并指定jmeter数据库,点击save and test 通过即成功;

2. 展示Jmeter实时压测数据

Import 5496,点击load,加载出来后指定刚增加的data source Influxdb,指定表名字 jmeter,点击import ;

压测时即可看到实时数据,展示效果如下

application名称是Backend listener中填写的application 名称

Transaction 显示的是Samper名称

3.添加Prometheus+node-exporter主机监控数据源

仿照上述新增数据源,内网ip/prometheus/,测试通过即可

4. 展示主机监控数据,添加Dashboard

import dash board 8919,导入并保存即可

效果展示

问题总结

1. 为什么用Nginx?

因为运维只给开一个端口,但是还有那么多服务需要用,所以用作端口代理。

2. 为什么用Docker?

因为Docker部署更加方便。

3. Docker和Jmeter压测时时间不一致,无法写入数据(Grafana和Jmeter压测时间)

docker run -p 3306:3306 --name mysql -v /etc/localtime:/etc/localtime
根据需求更改启动容器时的参数,将宿主机的时间和docker时间一致(docker和宿主机在同一台机器)

4. Jmeter数据无法写入Influxdb数据库,查询measurements为空

Jmeter:配置后端监听器(Backend Listener),使用Nginx作为端口转发,将Influxdb的服务映射到/influxdb路径

5.Jmeter入库后,Grafana配置数据源失败

在docker中运行时指定docker内influx的网络,配置时使用influxdb:8086

6.Grafana展示Jmeter中的数据为空

配置后端监听器measurement值为jmeter,否则读取不到数据

7.多个脚本同时执行添加了后端监听器,压测数据被写入到同一个Application库中

默认根据监听器名称进行判断监听器有没有执行,解决方案,不同后端监听器起不同的名称

8. Grafana 监控发压机 指标数据显示 no data

使用curl查看9100是否能取到node-exporter数据,如果可以取到 去prometheus web页面查看prometheus是否配置成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/67015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

比较opencv,pillow,matplotlib,skimage读取图像的速度比

上面这些库都被广泛用于图像处理和计算机视觉任务; 不同的图像读取库(OpenCV,Pillow,matplotlib和skimage)的读取速度,是怎么样的一个情况? 下面分别从读取速度,以及转换到RGB通道…

《虚拟仿真实验教学平台》三项团体标准启动会在 ALVA 举办

8 月 11 日,《虚拟仿真实验教学平台》三项团体标准启动会(下以“启动会”简称)以线下线上相结合的会议形式在 ALVA Systems 北京总部举办。 启动会上,ALVA 与专家组、编写组成员和企业代表围绕《虚拟仿真实验教学平台建设指南》、…

不同写法的性能差异

“ 达到相同目的,可以有多种写法,每种写法有性能、可读性方面的区别,本文旨在探讨不同写法之间的性能差异 len(str) vs str "" 本部分参考自: [问个 Go 问题,字符串 len 0 和 字符串 "" ,有啥区别?](https://segmentf…

18 Linux之Python定制篇-Python开发平台Ubuntu

18 Linux之Python定制篇-Python开发平台Ubuntu 文章目录 18 Linux之Python定制篇-Python开发平台Ubuntu18.1 安装Ubuntu虚拟机18.4 Ubuntu的root用户18.5 Ubuntu下开发Python 学习视频来自于B站【小白入门 通俗易懂】2021韩顺平 一周学会Linux。可能会用到的资料有如下所示&…

使用iOS应用程序进行数据采集:从入门到实践

随着移动互联网的普及,越来越多的数据产生于移动设备。为了更好地了解用户行为、优化产品体验,我们需要在iOS应用程序中进行数据采集。本文将指导您如何在iOS应用中实现数据采集,从基本概念到实际操作。 数据采集的基本概念与方法 a. 数据采集…

docker内部ip与内网其它ip网段冲突导致无法访问的解决方法

现象: 宿主机和docker内部能互相访问非常正常,但docker内部访问外部网络内网其中一个网段172.18.0.x则无法访问。 排查 由于docker是精简过的系统,需另外安装网络相关命令 首先更新apt-get,否则在apt-get install 命令时会报E:…

剑指 Offer 10- I. 斐波那契数列

剑指 Offer 10- I. 斐波那契数列 方法一 class Solution {int mod (int) 1e9 7;public int fib(int n) {if(n < 1) return n;int[] dp new int[n 1];dp[1] 1;for(int i 2; i < n; i){dp[i] (dp[i - 1] dp[i - 2]) % mod;}return dp[n];} }方法二 对方法一进行…

景区洗手间生活污水处理设备厂家电话

诸城市鑫淼环保小编带大家了解一下景区洗手间生活污水处理设备厂家电话 MBR生活污水处理设备构造介绍&#xff1a; mbr一体化污水处理的设计主要是对生活污水和相类似的工业有机污水的处理&#xff0c;其主要处理手段是采用目前较为成熟的生化处理技术接触氧化法&#xff0c;水…

el-table滚动加载、懒加载(自定义指令)

我们在实际工作中会遇到这样的问题&#xff1a; 应客户要求&#xff0c;某一个列表不允许分页。但是不分页的话&#xff0c;如果遇到大量的数据加载&#xff0c;不但后端响应速度变慢&#xff0c;前端的渲染效率也会降低&#xff0c;页面出现明显的卡顿。 那如何解决这个问题…

基础算法-递推算法-学习

现象&#xff1a; 基础算法-递推算法-学习 方法&#xff1a; 这就是一种递推的算法思想。递推思想的核心就是从已知条件出发&#xff0c;逐步推算出问题的解 最常见案例&#xff1a; 一&#xff1a;正向递推案例&#xff1a; 弹力球回弹问题&#xff1a; * 弹力球从100米高…

OpenLayers7官方文档翻译,OpenLayers7中文文档,OpenLayers快速入门

快速入门 这个入门文档向您展示如何放一张地图在web网页上。 开发设置使用 NodeJS&#xff08;至少需要Nodejs 14 或更高版本&#xff09;&#xff0c;并要求安装 git。 设置新项目 开始使用OpenLayers构建项目的最简单方法是运行&#xff1a;npm create ol-app npm create…

在ubuntu下远程链接仓库gitte/github

后期适当加点图片&#xff0c;提高可读性。 本教程是最基础的连接教程&#xff0c;设计git的操作也仅仅局限于push/pull&#xff0c;如果想全面了解&#xff0c;可以参考廖雪峰git教程 在Ubuntu上初始化本地Git仓库并链接到远程Gitee仓库(github同理)&#xff0c;需要按照以下步…

Go 面向对象(匿名字段)

概述 严格意义上说&#xff0c;GO语言中没有类(class)的概念,但是我们可以将结构体比作为类&#xff0c;因为在结构体中可以添加属性&#xff08;成员&#xff09;&#xff0c;方法&#xff08;函数&#xff09;。 面向对象编程的好处比较多&#xff0c;我们先来说一下“继承…

音视频 ffmpeg命令提取PCM数据

提取PCM ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -f s16le 48000_2_s16le ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -sample_fmt s16 out_s16.wav ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -codec:a pcm_s16le out2_s16le.wav ffmpeg -i buweishui.mp3 -ar 48000 -ac 2 -f…

QWidget的ui界面绘制成图片

文章目录 源文件源码解释效果修复图片清晰度 源文件 #include "widget.h" #include "ui_widget.h"#include <QPixmap> #include <QDir>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// 构造…

Pinely Round 2 (Div. 1 + Div. 2) G. Swaps(组合计数)

题目 给定一个长度为n(n<1e6)的序列&#xff0c;第i个数ai(1<ai<n)&#xff0c; 操作&#xff1a;你可以将当前i位置的数和a[i]位置的数交换 交换可以操作任意次&#xff0c;求所有本质不同的数组的数量&#xff0c;答案对1e97取模 思路来源 力扣群 潼神 心得 感…

Android之布局转圆角

Android之布局转圆角 文章目录 Android之布局转圆角说明一、效果图二、实现步骤1.自定义RoundRelativeLayout2.使用 总结 说明 很多需求比较无语&#xff0c;需要某个布局转圆角&#xff0c;像个显眼包一样&#xff0c;所以为了满足显眼包&#xff0c;必须整呐提示&#xff1a…

Java智慧工地信息化管理平台源码,依托计算机信息、网络通讯、物联网、系统集成及云计算技术建立

Java智慧工地源码 智慧工地APP源码 系统定义&#xff1a; 智慧工地信息化管理平台是依托计算机信息、网络通讯、物联网、系统集成及云计算技术&#xff0c;通过数据采集、信息动态交互、智能分析&#xff0c;建立起来的一套集成的项目建设综合管理系统。实现项目管理信息化、网…

LeetCode 剑指offer 09.用两个栈实现队列

LeetCode 剑指offer 09.用两个栈实现队列 题目描述 用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两个函数 appendTail 和 deleteHead &#xff0c;分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素&#xff0c;deleteHead 操作返回…

消息队列-------Rabbitmq介绍和安装

1.消息队列介绍 消息队列就是基础数据结构中的“先进先出”的一种数据机构。想一下&#xff0c;生活中买东西&#xff0c;需要排队&#xff0c;先排的人先买消费&#xff0c;就是典型的“先进先出” 2.消息队列MQ可以解决的问题 MQ是一直存在&#xff0c;不过随着微服务架构…