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.rhkb.cn/news/114489.html

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

相关文章

Ubuntu22.04.1上 mosquitto安装及mosquitto-auth-plug 认证插件配置

Ubuntu22.04.1上 mosquitto安装及mosquitto-auth-plug 认证插件配置 1、先上效果,可以根据mysql中mosquitto数据库的不同users角色登陆mosquitto: SELECT * FROM mosquitto.users; id,username,pw,super 1,jjolie,PBKDF2$sha256$901$yZnELWKK4NnaNNJl…

JavaScript中详解数组的算法

在 JavaScript 中,数组是一种常见的数据结构,它可以存储多个元素,并且可以通过索引来访问和修改这些元素。数组算法是对数组进行各种操作和处理的方法和技巧。下面是一些常见的数组算法: 遍历数组:可以使用 for 循环、…

NIO原理浅析(二)

IO分类 阻塞和非阻塞 阻塞IO:用户空间引发内核空间的系统调用,需要内核IO操作彻底完成之后,返回值才会返回到用户空间,执行用户的操作。阻塞指的用户空间程序的执行状态,用户空间程序需要等到IO操作彻底执行完毕。j…

<Cadence> PCB封装制作(一) 封装组成元素介绍制作表贴焊盘

目录 01 封装的组成元素 02 焊盘Design Layers组成 03 制作表贴焊盘 获取表贴器件(0603电阻)的相关信息 制作表贴器件(0603电阻)焊盘封装 04 文章总结 大家好,这里是程序员杰克。一名平平无奇的嵌入式软件工程师…

java八股文面试[JVM]——类初始化过程

回顾类加载过程: 知识来源: 【2023年面试】Class初始化过程是什么_哔哩哔哩_bilibili

C++day7(auto关键字、lambda表达式、C++中的数据类型转换、C++标准模板库(STL)、list、文件操作)

一、Xmind整理&#xff1a; 关键词总结&#xff1a; 二、上课笔记整理&#xff1a; 1.auto关键字 #include <iostream>using namespace std;int fun(int a, int b, float *c, char d, double *e,int f) {return 12; }int main() {//定义一个函数指针&#xff0c;指向fu…

云备份——第三方库简单介绍并使用(上)

目录 一&#xff0c;Jsoncpp库序列化和反序列化 二&#xff0c;bundle文件压缩库 2.1 文件压缩 2.2 文件解压 一&#xff0c;Jsoncpp库序列化和反序列化 首先我们需要先了解一下json是什么&#xff0c;json是一种数据交换格式&#xff0c;采用完全独立于编程语言的文本格式来…

敏感接口权限校验

前端校验 &#xff08;从前端或者从token里面拿一下&#xff09;&#xff0c;看一下用户有没有这个页面的权限&#xff08;但是一般不用&#xff0c;因为nodejs也可以写后端&#xff0c;但是放到前端去校验不安全&#xff09; 后端校验 需要梳理敏感数据接口&#xff0c;将这…

IBM Spectrum LSF Explorer 为要求苛刻的分布式和任务关键型高性能技术计算环境提供强大的工作负载管理

IBM Spectrum LSF Explorer 适用于 IBM Spectrum LSF 集群的强大、轻量级报告解决方案 亮点 ● 允许不同的业务和技术用户使用单一解决方案快速创建和查看报表和仪表板 ● 利用可扩展的库提供预构建的报告 ● 自定义并生成性能、工作负载和资源使用情况的报…

FreeSWITCH 1.10.10 简单图形化界面4 - 腾讯云NAT设置

FreeSWITCH 1.10.10 简单图形化界面4 - 腾讯云NAT设置 0、 界面预览1、 查看IP地址2、 修改协议配置3、 开放腾讯云防火墙4、 设置ACL5、 设置协议中ACL&#xff0c;让PBX匹配内外网6、 重新加载SIP模块7、 查看状态8、 测试一下 0、 界面预览 http://myfs.f3322.net:8020/ 用…

【Java Web】敏感词过滤

一、前缀树 假设有敏感词&#xff1a;b&#xff0c;abc&#xff0c;abd&#xff0c;bcd&#xff0c;abcd&#xff0c;efg&#xff0c;hii 那么前缀树可以构造为&#xff1a; 二、敏感词过滤器 package com.nowcoder.community.util;import org.apache.commons.lang3.CharUt…

算法通关村-----哈希和队列的基本知识

哈希概念 哈希也称为散列&#xff0c;就是把任意长度的输入&#xff0c;通过散列算法&#xff0c;变成固定长度的输出&#xff0c;这个输出值就是散列值。 哈希存储 现在有1&#xff0c;2&#xff0c;3…15&#xff0c;要将其存储到大小为7的哈希表中&#xff0c;应该如何存…

OS 死锁处理

如果P先申请mutex 则mutex从1置零&#xff0c;假设申请到的empty 0则empty变成-1阻塞态 同理C中mutex从0变为-1&#xff0c;那么如果想离开阻塞态&#xff0c;那么就需要执行V&#xff08;empty&#xff09;但是如果执行V&#xff08;empty&#xff09;就需要P&#xff08;mu…

什么是跨域(cross-origin)请求,如何解决跨域问题?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 跨域请求和跨域问题⭐ 解决跨域问题的方法1. CORS&#xff08;跨域资源共享&#xff09;2. JSONP&#xff08;JSON with Padding&#xff09;3. 代理服务器4. WebSocket5. 使用服务器中继 ⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff…

python爬取bilibili,下载视频

一. 内容简介 python爬取bilibili&#xff0c;下载视频 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 链接&#xff1a;https://pan.baidu.com/s/1WuXTso_iltLlnrLffi1kYQ?pwd1234 三.主要流程 3.1 下载单个视频 代码 import requests impor…

C# 多线程交替按照指定顺序执行

1.关于AutoResetEvent和ManualResetEvent的区别解释如下&#xff1a; AutoResetEvent和ManualResetEvent是.NET中的两个线程同步类。它们之间的主要区别在于其释放信号的方式以及对等待线程的影响。 AutoResetEvent的作用是在等待的线程被信号唤醒后&#xff0c;将信号自动重…

Flink CDC学习笔记

第一章 CDC简介 1.1 什么是CDC ​ CDC (Change Data Capture 变更数据获取&#xff09;的简称。核心思想就是&#xff0c;检测并获取数据库的变动&#xff08;增删查改&#xff09;&#xff0c;将这些变更按发生的顺序记录下来&#xff0c;写入到消息中间件以供其它服务进行订…

什么是Python爬虫分布式架构,可能遇到哪些问题,如何解决

目录 什么是Python爬虫分布式架构 1. 调度中心&#xff08;Scheduler&#xff09;&#xff1a; 2. 爬虫节点&#xff08;Crawler Node&#xff09;&#xff1a; 3. 数据存储&#xff08;Data Storage&#xff09;&#xff1a; 4. 反爬虫处理&#xff08;Anti-Scraping&…

OpenCV(一):Android studio jni配置OpenCV(亲测有效,保姆级)

目录 1.下载OpenCV的SDK 2.创建Android Native C项目 3.Android项目中导入OpenCV工程 4.导入OpenCV的库文件 5.实现opencv高斯模糊图像处理的demo 要在Android Studio中配置使用OpenCV库的C方法&#xff0c;需要完成以下步骤&#xff1a; 1.下载OpenCV的SDK 首先&#x…