文章目录
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后卡死,数分钟后报连接超时的错误。
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到请求头中
实现步骤
-
本地测试,将文件放至路径
E:/token.txt
内,并进行CSV数据文件设置。
-
配置HTTP信息头管理器将动态token值配置成全局变量。
-
配置正则表达式提取器提取出动态token值。
-
本地远程启动Linux虚拟机测试发现可以请求到文本文档里的token值
设置线程组线程数为2,则获取到文本文档里开头2个token值。
5. 部署到Linux服务器之前,需将token.txt路径更改为linux上的存放路径
所以CSV数据文件设置中文件路径应修改为 /opt/jmeter/bin/token.txt
- 察看结果树发现也能在Linux上读取到文本文档内的token值。
二、测试能否远程操控Linux虚拟机使用BeanShell后置处理程序(直播课开始脚本-开始骑行)写入到指定的文件中,请求开始骑行接口的trainingId能不能生成在远程的linux服务器文件里
实现步骤
-
本地测试,先将BeanShell后置处理程序内的生成路径更改为 D:/outputToken.txt
-
登录运行测试,查看D:/outputToken.txt是否在路径生成,发现成功生成,且接口的trainingId和token内容成功写入文本文档。
-
部署到Linux服务器之前,需将token.txt文件和BeanShell后置处理程序内的生成路径更改为linux上的存放路径,例如存放在Linux根目录下的outputToken.txt
-
保存压测脚本并进行测试,执行成功后发现根目录底下的确出现了outputToken.txt文件,打开发现从接口获取的trainingId和token内容成功写入文本文档。
JMeter与其他压测产品分布式比较
- JMeter优点有:基于java,可跨平台,开源好用。
- 选取了市场上其他主流性能压测工具Apache Bench(ab)、LoadRunner、阿里云PTS、FastHttpLocust、wrk与JMeter进行对比。
- locust 因为是基于 python 的压测框架,而 python 的 GIL 限制,无法直接利用多核处理器,需要手动打开多个 locust 进程来利用 CPU 多核,才能充分使用压测客户机。
- 经过谷歌搜索趋势分析发现搜索阿里云PTS的用户数量第一,其次就是JMeter压测工具。