JMeter:高并发时的分布式压测

为什么需要分布式压测

JMeter是基于Java的应用,以线程的方式来模拟用户。每个线程占有的内存一般是8KB,所以并发用户较高时,使用单台计算机容易出现Java内存溢出错误。因而,在高并发时,通常需要借助多台机器同时发压,以产生足够的负载。

分布式压测的原理

  1. 控制节点(Master):控制节点是JMeter测试计划的中心节点,负责协调和控制整个压测过程。它从配置文件中读取Slave端地址,将测试计划分发到多个远程节点(Slave),收集并汇总测试结果。

  2. 远程节点(Slave):远程节点是测试计划的执行节点,负责实际模拟用户的并发访问行为。它们分布在多台物理机器上,可以是同一局域网中的多台机器,也可以是分布在不同地区的云主机。

  3. 测试计划同步:在开始压测之前,控制节点将测试计划分发到所有远程节点上,确保每个节点执行的测试计划是一致的。这些配置文件包括线程组配置、HTTP请求、断言、验证器等。

  4. 参数化文件:如果测试计划中用到了参数化文件,这些文件是不会被Master分发给Slave的,因为需要自己存放到Slave端。

  5. 并发执行:每个远程节点独立运行测试计划,并发地发送请求,并发数为测试计划中指定的并发数n。由于测试负载被分散到多个节点上执行,总并发数为节点数*n,可以实现高并发的访问效果。

  6. 结果收集:远程节点将测试结果发送回控制节点,控制节点负责收集、汇总和展示所有节点的结果。可以通过图形界面或者命令行查看压测结果,包括响应时间、吞吐量、错误率等。

分布式压测的简明步骤

前置条件

1、各个计算机在相同的目录下安装相同版本的JDK

2、各个计算机在相同的目录下安装相同版本的JMeter

3、各个JMeter的基础参数保持一致

配置

1、确定master(测试管理机)及slave(测试执行机)

2、Master配置

目录:%jmeter_home%/bin/

1)修改jmeter.properties:

# 指定slave的ip和端口(使用默认端口1099,如果不使用默认端口,在IP后面添加:端口号),如需添加slave节点,在此追加IP

remote_hosts=XX.XX.XX.1,XX.XX.XX.2

这里也可以不配置,执行时使用-R参数来指定slave机器:

jmeter.sh -n -t 脚本.jmx -R slaveIP1,slaveIP2

# 禁用ssl

server.rmi.ssl.disable=true

默认远程传输是需要加密的,如不禁用ssl,需要生成密钥及证书后进行配置。

2)修改jmeter-server:(IP为本机外网IP

RMI_HOST_DEF=-Djava.rmi.server.hostname=XX.XX.XX.1

3)修改system.properties,指定hostname(IP为本机外网IP

java.rmi.server.hostname=XX.XX.XX.1

3、slave配置

如需添加slave节点,复制本条操作,修改IP。IP为本机外网IP

目录:%jmeter_home%/bin/

1)修改jmeter.properties:

remote_hosts=XX.XX.XX.2

# 禁用ssl

server.rmi.ssl.disable=true

2)修改jmeter-server:

RMI_HOST_DEF=-Djava.rmi.server.hostname=XX.XX.XX.2

3)修改system.properties,指定hostname

java.rmi.server.hostname=XX.XX.XX.2

执行前的准备

1、修改脚本中的并发数

若需要压测100,在2台机器上执行,则线程设置50即可,jmeter执行中不会自动负载均衡,每一台服务器都会完整地运行测试计划。

2、脚本jmx文件

如常放置到master机器的脚本目录下。

注:Master和Slave最好分开。因为Master需要发送信息给Slave,并且接收从Slave传回的测试数据,会有一定的消耗,同时作为Slave发压机的话,可能导致Master性能不够。

3、数据文件

如有任何参数化文件,放置到所有slave机器上。

注:如果数据文件路径为相对路径,且原本指定为与脚本文件同一目录,则需要放置到%jmeter_home%/bin/目录下。分布式执行时,运行时当前目录为bin目录,而不是jmx脚本文件的目录。(为方便管理,可将所有的数据文件放置在一个文件夹下,如指定为./data/usrForLoan10.txt,则在bin下创建data文件夹统一放置数据文件)

如需要读取不同的数据(如登录账号互踢,不同server上需要使用不同的数据文件,可使用相同的文件名,但是内容不同即可。)

执行

1、启动jmeter-server

在所有要执行脚本的机器上启动jmeter-server(如master也需要作为发压机使用,也需要启动)

目录:%jmeter_home%/bin/

执行:nohup ./jmeter-server &

注:每次执行测试前,都需要杀死原本的jmeter-server进程并重新启动。否则执行脚本时会提示busy。

2、在master上启动测试脚本

目录:%jmeter_home%/bin/test-script

执行:nohup ../jmeter.sh -n -t 脚本.jmx -r -l 结果文件.jtl &

注:比原来的命令多了-r参数

3、启动后查看是否执行成功

1)查看各slave上的日志文件 %jmeter_home%/bin/jmeter-server.log,确保log在更新(原本写入test-script下面jmeter.log中的内容会被写入该文件。)

2)查看master上的jtl结果文件:确保请求分别被分发到不同的slave上

结果处理

1、处理jtl文件

将jtl文件导入jmeter时,为了使不同slave上的结果合并汇总,需要将jtl文件中slave IP删除,使用以下命令:

sed 's/XX\.XXX\.XX\.2-//g' 结果文件.jtl | sed 's/XX\.XXX\.XX\.1-//g'>removeIP.jtl

用空字符串替换目标字符串,其中,

  1. s表示替换;
  2. //中间的内容表示要被替换的字符串,“.”是正则表达式中的特殊字符,需要使用“\”转义
  3. 如果有要替换的字符,写在第二个/后面,比如s/stringToBeReplaced/newString/g
  4. g表示行内全局查找
  5. 蓝色字体分别是待处理文件和最后生成的结果文件

2、将处理后的jtl文件导入jmeter

遗留问题

查看结果树中通常需要查看error msg,但是似乎只有执行脚本的master下面生成了error.jtl,仅有这一台机器的数据。slave机器上的错误信息未被记录。且jtl文件中的response msg为空,导致无法看到出错详情。

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

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

相关文章

Unity UGUI 之 图集

本文仅作学习笔记与交流,不作任何商业用途 本文包括但不限于unity官方手册,唐老狮,麦扣教程知识,引用会标记,如有不足还请斧正 本文在发布时间选用unity 2022.3.8稳定版本,请注意分别 1.什么是图集 精灵图…

tensorflow安装及数据操作----学习笔记(一)

安装Miniconda 下载对应系统版本的Miniconda。我的系统是ubuntu,所以选择Miniconda3 Linux 64-bit。下载后执行下载的sh脚本 sh Miniconda3-latest-Linux-x86_64.sh -b执行后,运行conda初始化命令 ~/miniconda3/bin/conda init关闭当前命令终端&#…

google 浏览器插件开发简单学习案例:TodoList;打包成crx离线包

参考: google插件支持: https://blog.csdn.net/weixin_42357472/article/details/140412993 这里是把前面做的TodoList做成google插件,具体网页可以参考下面链接 TodoList网页: https://blog.csdn.net/weixin_42357472/article/de…

phpstorm配置xdebug3

查看php路径相关信息 php --ini安装xdebug https://www.jetbrains.com/help/phpstorm/2024.1/configuring-xdebug.html?php.debugging.xdebug.configure php.ini 配置 在最后添加,以下是我的配置 [xdebug] zend_extension/opt/homebrew/Cellar/php8.1/8.1.29/p…

NXP芯片知识:eMIOS和STM和LCU和BCTU和TRGMUX和PIT区别

在嵌入式系统中,各种定时和控制模块有不同的功能和应用场景。以下是这些模块的具体应用区别: 1. Enhanced Modular I/O System (eMIOS) 应用场景: 脉宽调制(PWM):用于电机控制、亮度调节、音频信号生成等…

2024秋招算法

文章目录 参考资料一 数组1.1 二分查找1.2 移除元素1.3 长度最小的子数组1.4 螺旋矩阵1.5 在排序数组中查找元素的第一个和最后一个位置 二 链表2.1 移除链表元素2.2 设计链表2.3 反转链表2.4 两两交换链表中的节点2.5 删除链表的倒数第N个节点2.6 链表相交2.7 环形链表II 三 哈…

HIVE:使用get_json_object解析json对象

1 json对象 JSON 对象使用在大括号 {…} 中书写。对象可以包含多个 key/value(键/值)对。key 必须是字符串,value 可以是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)。key 和 value 中使用冒号 :…

力扣爆刷第167天之TOP200五连刷101-105(二叉树序列化、验证IP、LFU)

力扣爆刷第167天之TOP200五连刷101-105(二叉树序列化、验证IP、LFU) 文章目录 力扣爆刷第167天之TOP200五连刷101-105(二叉树序列化、验证IP、LFU)一、224. 基本计算器二、297. 二叉树的序列化与反序列化三、283. 移动零四、468. …

【每日一练】python的类型注解和Union类型使用方法

""" 本节课程内容 函数(方法)的类型注解 Union类型 1.为函数(方法)的形参进行类型的注解 2.为函数(方法)的返回值进行类型的注解 注意:类型注解并非强制性,是提示…

React 学习——行内样式、外部样式、动态样式

三种样式的写法 import "./index.css"; //同级目录下的样式文件 function App() {const styleCol {color: green,fontSize: 40px}// 动态样式const isBlock false;return (<div className"App">{/* 行内样式 */}<span style{{color:red,fontSiz…

Vue修饰符的使用

在 Vue.js 中&#xff0c;修饰符&#xff08;modifiers&#xff09;是一种特殊的后缀&#xff0c;用于指令以特殊方式修改指令的行为。修饰符通过在指令名称后面添加点&#xff08;.&#xff09;及修饰符名称来表示。Vue 提供了一些常用的修饰符&#xff0c;帮助开发者处理事件…

工程视角:数据结构驱动的应用开发--字典(dictionary),列表(list)与实体

这里写目录标题 业务业务场景流程分析 实现数据访问层&#xff08;DAL&#xff09;业务逻辑层&#xff08;BLL&#xff09;用户界面层&#xff08;UI&#xff09;工具类 设计思路为什么抽出工具类关于U层使用字典的好处工程视角 业务 业务场景 在一个金融应用系统中&#xff0c…

iptables 限制端口仅特定IP访问。

注意&#xff1a; 需要用源地址(-s)&#xff0c;而不是目的地址(-d) 单个IP&#xff1a; iptables -A INPUT -p tcp -m tcp --dport 3306 -s 127.0.0.1 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 3306 -j DROP 多个IP&#xff1a; iptables -A INPUT -p tcp -m t…

LLaVA论文阅读+Colab部署

LLaVA &#xff1a;Visual Instruction Tuning 1. Colab上部署LLaVA2. 论文摘要3. 多模态指令跟随数据4. 模型架构5. 模型训练6. 消融实验7. CC3M数据过滤8. 总结 1. Colab上部署LLaVA 代码&#xff1a; https://github.com/Czi24/Awesome-MLLM-LLM-Colab/tree/master/MLLM/LL…

CUDA编程02 - 数据并行介绍

一:概述 数据并行是指在数据集的不同部分上执行计算工作,这些计算工作彼此相互独立且可以并行执行。许多应用程序都具有丰富的数据并行性,使其能够改造成可并行执行的程序。因此,对于程序员来说,熟悉数据并行的概念以及使用并行编程语言来编写数据并行的代码是非常重要的。…

2024.7.23总结(东莞入职培训day2)

今天写总结也很晚了&#xff0c;但是今天收获特别丰满&#xff0c;必须回顾一下&#xff0c;这些都是宝贵的财富。 1.讲课老师很特别棒 今天的讲课老师特别棒&#xff0c;很是优秀&#xff0c;她讲的课程质量还是非常高的&#xff0c;能够带动学生去深度思考&#xff0c;小伙…

超大数字四舍五入保留N位小数【没bug】

大部分npm常用的插件四舍五入都是用数值直接去计算四舍五入的存在精度问题&#xff0c;本方法是用用字符串拆分比较整数大小&#xff0c;这样就避开了精度的问题&#xff1b; 该方法可以传入&#xff1a;1.134、99.99、9999999999999999999.99999、.001、12.、0.、00.、类似的…

.netcore TSC打印机打印

此文章给出两种打印案例&#xff0c; 第一种是单列打印&#xff0c;第二种是双列打印 需要注意打印机名称的设置&#xff0c;程序中使用的打印机名称为999&#xff0c;电脑中安装打印机时名称也要为999。 以下是我在使用过程中总结的一些问题&#xff1a; 一 TSC打印机使用使…

【Node.js基础02】fs、path模块

目录 一&#xff1a;fs模块-读写文件 1 加载fs模块对象 2 读制定文件内容文件 3 向文件中写入内容 二&#xff1a;path模块-路径处理 1 问题引入 2 __dirname内置变量 使用方法 一&#xff1a;fs模块-读写文件 fs模块封装了与本机文件系统交互方法和属性 1 加载fs模块…

弹性布局 flex layout HTML CSS

文章目录 效果图参考文档代码 效果图 其实弹性布局的好处是&#xff1a;当网页大小变化&#xff08;如窗口resize&#xff09;时&#xff0c;处于弹性容器(flex container)中的弹性元素(flex item) 之间的距离也会变化。 需要特别注意的是&#xff1a; 弹性布局的主要CSS如下。…