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

1,520 阅读7分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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,当网络变化时值会出现变化。

  • 进入安装目录的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后卡死,数分钟后报连接超时的错误。 在这里插入图片描述 在这里插入图片描述

    1. server.rmi.ssl.disable=true

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

  • 命令启动JMeter之前需通过cmd的ipconfig命令查询本机IPv4地址 在这里插入图片描述

  • 当Linux虚拟机使用桥接模式时,可移除网卡,可双击jmeter.bat脚本文件直接启动 在这里插入图片描述 在这里插入图片描述

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

    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 行的结果则说明运行成功。 在这里插入图片描述

  • 测试本地能否向虚拟机发送并执行压测脚本,此处编写了一个请求百度的压测脚本,发现请求成功,至此分布式环境搭建测试完成! 在这里插入图片描述

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

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

实现步骤

  1. 本地测试,将文件放至路径 E:/token.txt 内,并进行CSV数据文件设置。 在这里插入图片描述

  2. 配置HTTP信息头管理器将动态token值配置成全局变量。 在这里插入图片描述

  3. 配置正则表达式提取器提取出动态token值。 在这里插入图片描述

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

    设置线程组线程数为2,则获取到文本文档里开头2个token值。 在这里插入图片描述

在这里插入图片描述 在这里插入图片描述 5. 部署到Linux服务器之前,需将token.txt路径更改为linux上的存放路径

所以CSV数据文件设置中文件路径应修改为 /opt/jmeter/bin/token.txt 在这里插入图片描述

  1. 察看结果树发现也能在Linux上读取到文本文档内的token值。 在这里插入图片描述 在这里插入图片描述

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

实现步骤

  1. 本地测试,先将BeanShell后置处理程序内的生成路径更改为 D:/outputToken.txt 在这里插入图片描述

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

  3. 部署到Linux服务器之前,需将token.txt文件和BeanShell后置处理程序内的生成路径更改为linux上的存放路径,例如存放在Linux根目录下的outputToken.txt 在这里插入图片描述 在这里插入图片描述

  4. 保存压测脚本并进行测试,执行成功后发现根目录底下的确出现了outputToken.txt文件,打开发现从接口获取的trainingId和token内容成功写入文本文档。 在这里插入图片描述

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

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