date: 2020-12-19title: Jmeter分布式压测环境部署 #标题
tags: Jmeter分布式压测 #标签
categories: linux大杂烩 # 分类
最近和测试一起对业务接口进行压测,发现性能瓶颈可能不止会出现在服务端,也有可能是压力源不够,故特此记录下Jmeter分布式压测环境部署。
Jmeter分布式压测原理
Jmeter的分布式控制,说的通俗一点,就是指远程启动功能,具体原理如下图 (来自官网):
1、客户端机器(window系统或者Linux服务器)作为一个控制器Master,控制多台slave机器的操作。
2、Master和slave机器上最好装有相同版本的jdk和Jmeter,并配置好环境变量。
3、Master通过GUI界面或者非GUI模式启动slave机器,将Jmeter压测脚本发送给每台启动的slave,slave获得脚本后开始执行。slave本地不需预先存储脚本,但是需要有脚本中的依赖文件(如csv文件等)。
4、各台slave执行完成后,将结果传回给Master,Master收集后整合显示出来。
说明:调度机(master)和执行机(slave)最好分开,由于master需要发送信息给slave并且会接收slave回传回来的测试数据,所以mater自身会有消耗,所以建议单独用一台机器作为mater,mater不参与测试,只负责发送指令。
Jmeter分布式部署
在部署jmeter之前,最好和测试先统一下jmeter的版本,如果你的jmeter版本和测试人员生成jmx压测脚本的版本不一致,可能会导致错误。
环境准备
OS | hostname | IP | roles |
---|---|---|---|
Centos 7.5 | master | 192.168.20.10 | master |
Centos 7.5 | slave01 | 192.168.20.5 | slave01 |
Centos 7.5 | slave02 | 192.168.20.6 | slave02 |
系统参数调优
由于jmeter作为压力源,本身也会有性能瓶颈,最容易成为瓶颈的,就是最大可打开文件数,所以jmeter本身就需要优化一番,所有机器配置如下:
# limits.conf 修改后需要重新打开终端,以便生效。
$ cat > /etc/security/limits.conf << EOF
* - nofile 655360
* - memlock unlimited
* - stack 655360
* - nproc unlimited
EOF
$ cat > /etc/sysctl.conf << EOF
kernel.sysrq = 0
kernel.core_uses_pid = 1
fs.file-max=655360
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
kernel.pid_max = 655360
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_max_tw_buckets = 10000
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_ecn = 0
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_max_orphans = 655360
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_mem = 65536 131072 262144
net.ipv4.udp_mem = 65536 131072 262144
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 16384 16777216
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.route.gc_timeout = 100
# 禁止icmp重定向报文
net.ipv4.conf.all.accept_redirects = 0
# 禁止icmp源路由
net.ipv4.conf.all.accept_source_route = 0
net.core.somaxconn = 65535
net.core.rmem_default = 8388608
net.core.wmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
vm.swappiness = 10
vm.overcommit_memory = 1
vm.max_map_count = 262144
EOF
$ sysctl -p # 刷新内核参数
安装JDK
注:三台机器都要配置JDK环境。
自行去oracle官网下载java包 jdk-8u261-linux-x64.tar.gz ,然后上传至服务器。
$ mkdir /apps/usr -p && systemctl stop firewalld && systemctl disable firewalld && setenforce 0
$ tar zxf jdk-8u261-linux-x64.tar.gz -C /apps/usr/
$ ln -sf /apps/usr/jdk1.8.0_261 /apps/usr/jdk
$ cat >> /etc/profile << 'EOF'
export JAVA_HOME=/apps/usr/jdk
export CLASSPATH=$JAVA_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
EOF
$ source /etc/profile
$ java -version # 查看版本信息
java version "1.8.0_261"
Java(TM) SE Runtime Environment (build 1.8.0_261-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.261-b12, mixed mode)
配置master
以下操作只需在master上进行。
$ wget https://mirrors.tuna.tsinghua.edu.cn/apache/jmeter/binaries/apache-jmeter-5.2.1.tgz
$ tar zxf apache-jmeter-5.2.1.tgz -C /apps/usr/
$ cat >> /etc/profile << 'EOF'
export JMETER_HOME=/apps/usr/apache-jmeter-5.2.1/
export CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$CLASSPATH
export PATH=$JMETER_HOME/bin:$PATH
EOF
$ source /etc/profile
$ jmeter -v # 查看jmeter版本
Dec 19, 2020 12:24:00 AM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
_ ____ _ ____ _ _ _____ _ __ __ _____ _____ _____ ____
/ \ | _ \ / \ / ___| | | | ____| | | \/ | ____|_ _| ____| _ \
/ _ \ | |_) / _ \| | | |_| | _| _ | | |\/| | _| | | | _| | |_) |
/ ___ \| __/ ___ \ |___| _ | |___ | |_| | | | | |___ | | | |___| _ <
/_/ \_\_| /_/ \_\____|_| |_|_____| \___/|_| |_|_____| |_| |_____|_| \_\ 5.2.1
Copyright (c) 1999-2019 The Apache Software Foundation
# 调整jmeter配置
$ cd /apps/usr/apache-jmeter-5.2.1
$ vim bin/jmeter.properties # 修改此文件
remote_hosts=192.168.20.5:1099,192.168.20.6:1099 # 指定执行机的IP:端口
server_port=1099 # 此处需和remote_hosts指定的端口一致
server.rmi.ssl.disable=true # 此处改为true
server.rmi.localport=4000 # 取消注释
mode=Standard # 取消注释
$ vim bin/jmeter-server # 修改此文件
RMI_HOST_DEF=-Djava.rmi.server.hostname=192.168.20.10 # 取消注释并改为本机IP
# 将修改后的jmeter目录发送至其他节点
$ for i in `seq 5 6`;do rsync -az /apps/usr/apache-jmeter-5.2.1 192.168.20.$i:/apps/usr/;done
配置slave端
$ cat >> /etc/profile << 'EOF'
export JMETER_HOME=/apps/usr/apache-jmeter-5.2.1/
export CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$CLASSPATH
export PATH=$JMETER_HOME/bin:$PATH
EOF
$ source /etc/profile
$ jmeter -v # 查看jmeter版本
Dec 19, 2020 12:24:00 AM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
_ ____ _ ____ _ _ _____ _ __ __ _____ _____ _____ ____
/ \ | _ \ / \ / ___| | | | ____| | | \/ | ____|_ _| ____| _ \
/ _ \ | |_) / _ \| | | |_| | _| _ | | |\/| | _| | | | _| | |_) |
/ ___ \| __/ ___ \ |___| _ | |___ | |_| | | | | |___ | | | |___| _ <
/_/ \_\_| /_/ \_\____|_| |_|_____| \___/|_| |_|_____| |_| |_____|_| \_\ 5.2.1
Copyright (c) 1999-2019 The Apache Software Foundation
$ vim /apps/usr/apache-jmeter-5.2.1/bin/jmeter-server
RMI_HOST_DEF=-Djava.rmi.server.hostname=192.168.20.5 # 此处修改为本机IP即可。
至此,jmeter的slave和master都配置完成了,其余slave按照上述配置即可。
启动jmeter-server
$ jmeter-server
Using local port: 4000
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[192.168.20.10:4000](local),objID:[-2ce162dc:17676bb74ba:-7fff, -7099113867767960712]]]
注:master和slave都需要启动,然后master新开一个窗口,进行压力测试。
压测示例
压测需要测试人员提供相应的压测脚本,也就是下面用到的 .jmx 文件,我这里准备了一份,是对有道云的一个压测脚本,可以用于验证你的jmeter部署的是否异常(生成jmx压测脚本时所用的jmeter版本,最好和你部署的jmeter一致)。
提取压测脚本:下载jmx脚本,提取码:1233。
# 执行压测脚本
$ jmeter -n -t youdaoyun.jmx -R 192.168.20.5:1099,192.168.20.6:1099 -l /tmp/500_100_60.jtl -e -o /tmp/test
# -t:source.jmx 脚本路径
# -l:result.jtl 运行结果保存路径(.jtl),此文件必须不存在
# -e:在脚本运行结束后生成html报告
# -o:用于存放html报告的目录
压测过程中,屏幕输出如下: