【Jmeter入门】搭建分布式压测环境流程

文章目录

    • 背景技术
    • JMeter分布式运行原理
    • JMeter分布式搭建准备环境
    • Windows下配置Jmeter
    • Linux虚拟机下配置Jmeter5.1
    • 接口数据存放测试:本地编写.jmx压测脚本远程启动Linux虚拟机运行
    • JMeter与其他压测产品分布式比较

Linux下JMeter分布式压测环境搭建
与接口数据存放测试

背景技术

  • 在项目中我们经常会有压测的需求,而小巧轻便且免费的JMeter也顺势成为了我们的主流压测工具。
  • JMeter是Apache组织开发的开源项目,设计之初就是用于做性能测试的。
  • 同时它在实现对各种接口的调用方面做得比较成熟,因此,常被用作接口功能测试和性能测试。
  • 它能够很好的支持各种常见接口,如HTTP(S)、WebService、JDBC、FTP等、并以多种形式展示测试结果。
  • 对于并发量很大的需求,如上万并发量,很容易受到CPU和内存的限制,单机模拟场景是实现不了的。
  • 为了让JMeter提供更大的负载能力,须使用它的分布式机制,即多台机器同时产生负载的功能。
  • 真实的性能测试,不存在网络瓶颈问题。测试结果保存在本地一台master上,用master即可管理多个Jmeter Engines(slave)。

JMeter分布式运行原理

  • JMeter分布式执行时,将Windows电脑作为调度机(master),Linux服务器作为执行机(slave)。
  • master与slave上安装的JMeter版本尽量保持一致,否则启动时会出现版本不一致的报错提示。
  • master在本地编辑好.jmx压测脚本,执行时,master将jmx脚本发送至slave上执行,并返回结果到master上。

JMeter分布式搭建准备环境

  • Linux服务器 + JDK8 + JMeter5.1
  • Windows + JDK8 + JMeter5.1

Windows下配置Jmeter

  • 进入官网下载Jmeter,当前下载版本为Jmeter5.1

  • 后续配置需要用到虚拟机ip地址,可先通过Linux终端命令ip addr来获取

  • 由下图可知此时为192.168.1.158,当网络变化时值会出现变化。
    【Jmeter入门】搭建分布式压测环境流程_第1张图片

  • 进入安装目录的bin目录下找到jmeter.properties文件编辑打开

  • 搜索英文关键词并修改以下参数
    1.remote_hosts=192.168.1.158
    #remote_hosts修改的是目标机器的ip地址
    #可以是多个ip,中间以逗号间隔

    2.server.rmi.localport=1099
    server_port=1099

    #使得每次运行时端口能固定处于1099
    在这里插入图片描述
    #由于JMeter运行成功后endpoint的端口需开放,统一将其配置为1099端口
    #若连接前不开放则会使JMeter随机生成endpoint运行端口
    #会导致连接虚拟机ip后卡死,数分钟后报连接超时的错误。
    在这里插入图片描述
    【Jmeter入门】搭建分布式压测环境流程_第2张图片

    1. server.rmi.ssl.disable=true

    #禁用SSL,如果没有修改则运行时就会出现下图报错,localhost时回环ip地址,JMeter启动失败
    在这里插入图片描述

  • 命令启动JMeter之前需通过cmd的ipconfig命令查询本机IPv4地址
    【Jmeter入门】搭建分布式压测环境流程_第3张图片

  • 当Linux虚拟机使用桥接模式时,可移除网卡,可双击jmeter.bat脚本文件直接启动
    【Jmeter入门】搭建分布式压测环境流程_第4张图片
    【Jmeter入门】搭建分布式压测环境流程_第5张图片

  • 当电脑具有虚拟机多网卡时,启动方式必须使用以下命令启动方式

    jmeter -Djava.rmi.server.hostname=192.168.1.66

    #其中-Djava.rmi.server.hostname为本机IPv4地址

  • 多网卡命令启动原因分析:

    JMeter采用了RMI进行远程调用,在开启RMI服务时,如果master有多个网卡,它只是使用其中任意一个网卡,默认情况下,导致jmeter的master机器和slave机器不在同一个网段内,无法互通,导致连接失败

  • 解决方法:

  • 在多网卡的master上开启RMI服务的话必须指定IP,使他们能够在同一个网段内。

  • 否则电脑处于多网卡时,JMeter远程启动Linux时会卡死数分钟

Linux虚拟机下配置Jmeter5.1

  • 压缩Windows上配置好的Jmeter5.1文件夹上传至Linux进行unzip解压并重命名为jmeter

  • 新建opt文件夹

mkdir opt
  • 解压并放到新建目录opt下
mv jmeter /opt
  • 使用cd命令进入 /opt/jmeter/bin 目录
  • 配置启动脚本,在目录 /etc/init.d/ 下新建jmeter-slave文件,将如下内容存放到其中,并赋予执行权限。
#!/bin/bash
# @author radiomen

# chkconfig: 345 26 74
# description: jmeter slave

# 定义显示颜色
RED='\e[1;91m'
GREEN='\e[1;92m'
WITE='\e[1;97m'
NC='\e[0m'

MY_IP=""

function get_system_ip()
{
	SYSTEM_VERSION=$(cat /etc/redhat-release | grep -o -E '[0-9]+\.[0-9]+')
	# 判断是否是centos操作系统的版本
	if [[ $SYSTEM_VERSION == 7\.* ]];then
		ifconfig ens33 >/dev/null 2>&1
		if [ $? -eq 0 ];then
			MY_IP=$(ifconfig ens33 | grep 'inet ' | awk '{print $2}')
		else
			MY_IP=$(ifconfig eth0 | grep 'inet ' | awk '{print $2}')
		fi
	else
		ifconfig eth0 >/dev/null 2>&1
		if [ $? -eq 0 ];then
			MY_IP=$(ifconfig eth0 | grep 'inet addr:' | awk '{print $2}' | grep -o -E '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+')
		else
			MY_IP=$(ifconfig ens33 | grep 'inet addr:' | awk '{print $2}' | grep -o -E '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+')
		fi
	fi
}

function start()
{	
	FLAG=$(ps -ef | grep '/opt/jmeter/bin/' | grep -v 'grep' | wc -l)
	if [ $FLAG -eq 0 ];then
		echo "Start jmeter server!"
		get_system_ip
		/opt/jmeter/bin/jmeter-server -Djava.rmi.server.hostname=$MY_IP &
		echo -e $GREEN"Start jmeter server successed!"$NC
	else
		echo -e $RED"Jmeter server is already start!"$NC
	fi
	
}
 
function stop()
{	
	FLAG=$(ps -ef | grep '/opt/jmeter/bin/' | grep -v 'grep' | wc -l)
	if [ $FLAG -eq 0 ];then
		echo -e $RED"Jmeter server not starte!"$NC
	else
		echo "Stop jmeter server!"
		kill -9 $(ps -ef | grep 'jmeter' | grep -v grep | awk '{print $2}') && echo -e $GREEN"Stop jmeter server successed!"$NC
	fi
}

function restart()
{
	FLAG=$(ps -ef | grep '/opt/jmeter/bin/' | grep -v 'grep' | wc -l)
	if [ $FLAG -eq 0 ];then
		start
	else
		stop
		sleep 2
		start
	fi
}

case $1 in
	'start')
		start;;
	'stop')
		stop;;
	'restart')
		restart;;
	*)
		echo "Usage: $0 {start|stop|restart}"
		exit 1
esac
  • 在Linux虚拟机终端输入 /etc/init.d/jmeter-slave start 运行JMeter。
    在这里插入图片描述

  • 运行成功后出现endpoint里面的端口需要开放,如上图的1099端口,需要在防火墙开放并查询端口是否开放。
    在这里插入图片描述

  • 若不确定JMeter正常启动,可通过 ps -ef|grep jmeter 命令进行查询。若查询到 >1 行的结果则说明运行成功。
    在这里插入图片描述

  • 测试本地能否向虚拟机发送并执行压测脚本,此处编写了一个请求百度的压测脚本,发现请求成功,至此分布式环境搭建测试完成!
    【Jmeter入门】搭建分布式压测环境流程_第6张图片

接口数据存放测试:本地编写.jmx压测脚本远程启动Linux虚拟机运行

一、测试目的:请求接口地址,能否读取指定位置文件(例如token.txt)里面的每一个token到请求头中

实现步骤

  1. 本地测试,将文件放至路径 E:/token.txt 内,并进行CSV数据文件设置。
    【Jmeter入门】搭建分布式压测环境流程_第7张图片

  2. 配置HTTP信息头管理器将动态token值配置成全局变量。
    【Jmeter入门】搭建分布式压测环境流程_第8张图片

  3. 配置正则表达式提取器提取出动态token值。
    【Jmeter入门】搭建分布式压测环境流程_第9张图片

  4. 本地远程启动Linux虚拟机测试发现可以请求到文本文档里的token值

    设置线程组线程数为2,则获取到文本文档里开头2个token值。
    【Jmeter入门】搭建分布式压测环境流程_第10张图片

【Jmeter入门】搭建分布式压测环境流程_第11张图片
在这里插入图片描述
5. 部署到Linux服务器之前,需将token.txt路径更改为linux上的存放路径

所以CSV数据文件设置中文件路径应修改为 /opt/jmeter/bin/token.txt
【Jmeter入门】搭建分布式压测环境流程_第12张图片

  1. 察看结果树发现也能在Linux上读取到文本文档内的token值。
    【Jmeter入门】搭建分布式压测环境流程_第13张图片
    【Jmeter入门】搭建分布式压测环境流程_第14张图片

二、测试能否远程操控Linux虚拟机使用BeanShell后置处理程序(直播课开始脚本-开始骑行)写入到指定的文件中,请求开始骑行接口的trainingId能不能生成在远程的linux服务器文件里

实现步骤

  1. 本地测试,先将BeanShell后置处理程序内的生成路径更改为 D:/outputToken.txt
    【Jmeter入门】搭建分布式压测环境流程_第15张图片

  2. 登录运行测试,查看D:/outputToken.txt是否在路径生成,发现成功生成,且接口的trainingId和token内容成功写入文本文档。
    在这里插入图片描述

  3. 部署到Linux服务器之前,需将token.txt文件和BeanShell后置处理程序内的生成路径更改为linux上的存放路径,例如存放在Linux根目录下的outputToken.txt
    【Jmeter入门】搭建分布式压测环境流程_第16张图片
    【Jmeter入门】搭建分布式压测环境流程_第17张图片

  4. 保存压测脚本并进行测试,执行成功后发现根目录底下的确出现了outputToken.txt文件,打开发现从接口获取的trainingId和token内容成功写入文本文档。
    【Jmeter入门】搭建分布式压测环境流程_第18张图片

JMeter与其他压测产品分布式比较

  • JMeter优点有:基于java,可跨平台,开源好用。
  • 选取了市场上其他主流性能压测工具Apache Bench(ab)、LoadRunner、阿里云PTS、FastHttpLocust、wrk与JMeter进行对比。
  • locust 因为是基于 python 的压测框架,而 python 的 GIL 限制,无法直接利用多核处理器,需要手动打开多个 locust 进程来利用 CPU 多核,才能充分使用压测客户机。
  • 经过谷歌搜索趋势分析发现搜索阿里云PTS的用户数量第一,其次就是JMeter压测工具。

【Jmeter入门】搭建分布式压测环境流程_第19张图片

你可能感兴趣的:(测试,分布式,linux,压力测试,测试,java)