JMeter分布式压测环境搭建

一、JMeter分布式压测介绍

在工作中使用jmeter做大并发压力测试的场景下,单机受限内存、CPU、网络IO,会出现服务器压力还没有上去,但是压测服务器已经由于模拟的压力太大死机了。为了让jmeter工具提供更强大的负载能力,jmeter提供了多台机器同时产生负载的机制,下面是架构图。
JMeter分布式压测环境搭建

二、JMeter分布式压测环境搭建

1.Windows搭建JMeter作为Master

步骤1:安装部署JDK,注意JMeter3必须JDK1.8以上支持。
windows安装部署JDK可参见:https://blog.****.net/q13554515812/article/details/83278200 
步骤2:直接去官网下载最新的二进制源码包即可。
官网下载地址:https://jmeter.apache.org/download_jmeter.cgi
步骤3:解压jmeter到指定目录,配置Jmeter环境变量参见:
https://blog.****.net/q13554515812/article/details/85096579

2.Linux搭建JMeter作为Slave

步骤1:下载并将Jmeter安装到/opt目录下,命令如下:

cd /opt
wget http://mirrors.shu.edu.cn/apache//jmeter/binaries/apache-jmeter-5.0.zip
unzip apache-jmeter-5.0.zip -d /opt
ln -snf apache-jmeter-5.0 jmeter

步骤2:配置启动脚本,将如下内容存放到目录/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

步骤3:启动jmeter slave服务,验证是否监听1099端口,命令如下:

/etc/init.d/jmeter-slave start
netstat -ntlp | grep '1099'

3.分布式环境配置

步骤1:确保Master和Slave安装正确。
步骤2:Slave启动,并监听1099端口。
步骤3:在Master机器的jmeter安装目录下bin目录下,找到properties文件,修改远程主机选项,添加2个Slave服务器的地址。
JMeter分布式压测环境搭建
步骤4:启动jmeter Master,多网卡模式需要指定IP地址启动
jmeter -Djava.rmi.server.hostname=192.168.1.77
步骤5:验证分布式环境是否搭建成功
1)jmeter启动之后在如下选项中,会出现你添加的远程主机列表
JMeter分布式压测环境搭建
2)打开一个仅有一个http请求的脚本,【运行】-【远程全部启动】,执行完成,进入【聚合报告】中查看发现有两个HTTP请求说明环境搭建成功。
JMeter分布式压测环境搭建

4.注意事项

1)如果使用csv进行参数化,需要把参数文件在每台Slave上拷贝一份,最好都放置在bin目录下,因为Jmeter会直接从bin目录下查找;
2)slave机器执行脚本时,若断言执行成功则在master机器上是看不到请求响应数据的,只有在断言出错时才可见slave的返回;

三、FAQ

Q:远程启动,若出现错误提示:no such object in table
R:
S:删除配置中的端口即可
Q:JMeter分布式压测,连接Slave机器出现如下报错:
java.rmi.ConnectException: Connection refused to host: 192.168.1.104; nested exception is:
R:Slave机器防火墙开启,导致Master机器连接Slave机器连接失败。
S:检查slave机器的防火墙是否开启