date: 2020-12-19title: Jmeter分布式压测环境部署 #标题
tags: Jmeter分布式压测 #标签
categories: linux大杂烩 # 分类

最近和测试一起对业务接口进行压测,发现性能瓶颈可能不止会出现在服务端,也有可能是压力源不够,故特此记录下Jmeter分布式压测环境部署。

Jmeter分布式压测原理

Jmeter的分布式控制,说的通俗一点,就是指远程启动功能,具体原理如下图 (来自官网):

Jmeter分布式压测环境部署 - 图1

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本身就需要优化一番,所有机器配置如下:

  1. # limits.conf 修改后需要重新打开终端,以便生效。
  2. $ cat > /etc/security/limits.conf << EOF
  3. * - nofile 655360
  4. * - memlock unlimited
  5. * - stack 655360
  6. * - nproc unlimited
  7. EOF
  8. $ cat > /etc/sysctl.conf << EOF
  9. kernel.sysrq = 0
  10. kernel.core_uses_pid = 1
  11. fs.file-max=655360
  12. kernel.msgmnb = 65536
  13. kernel.msgmax = 65536
  14. kernel.shmmax = 68719476736
  15. kernel.shmall = 4294967296
  16. kernel.pid_max = 655360
  17. net.ipv4.tcp_tw_reuse = 1
  18. net.ipv4.tcp_tw_recycle = 0
  19. net.ipv4.tcp_max_tw_buckets = 10000
  20. net.ipv4.tcp_fin_timeout = 30
  21. net.ipv4.tcp_timestamps = 0
  22. net.ipv4.tcp_sack = 1
  23. net.ipv4.tcp_window_scaling = 1
  24. net.ipv4.tcp_ecn = 0
  25. net.ipv4.tcp_keepalive_time = 600
  26. net.ipv4.tcp_keepalive_intvl = 30
  27. net.ipv4.tcp_keepalive_probes = 3
  28. net.ipv4.tcp_max_orphans = 655360
  29. net.ipv4.tcp_max_syn_backlog = 262144
  30. net.ipv4.tcp_mem = 65536 131072 262144
  31. net.ipv4.udp_mem = 65536 131072 262144
  32. net.ipv4.tcp_rmem = 4096 87380 16777216
  33. net.ipv4.tcp_wmem = 4096 16384 16777216
  34. net.ipv4.ip_local_port_range = 1024 65535
  35. net.ipv4.route.gc_timeout = 100
  36. # 禁止icmp重定向报文
  37. net.ipv4.conf.all.accept_redirects = 0
  38. # 禁止icmp源路由
  39. net.ipv4.conf.all.accept_source_route = 0
  40. net.core.somaxconn = 65535
  41. net.core.rmem_default = 8388608
  42. net.core.wmem_default = 8388608
  43. net.core.rmem_max = 16777216
  44. net.core.wmem_max = 16777216
  45. net.core.netdev_max_backlog = 262144
  46. vm.swappiness = 10
  47. vm.overcommit_memory = 1
  48. vm.max_map_count = 262144
  49. EOF
  50. $ sysctl -p # 刷新内核参数

安装JDK

注:三台机器都要配置JDK环境。
自行去oracle官网下载java包 jdk-8u261-linux-x64.tar.gz ,然后上传至服务器。

  1. $ mkdir /apps/usr -p && systemctl stop firewalld && systemctl disable firewalld && setenforce 0
  2. $ tar zxf jdk-8u261-linux-x64.tar.gz -C /apps/usr/
  3. $ ln -sf /apps/usr/jdk1.8.0_261 /apps/usr/jdk
  4. $ cat >> /etc/profile << 'EOF'
  5. export JAVA_HOME=/apps/usr/jdk
  6. export CLASSPATH=$JAVA_HOME/lib
  7. export PATH=$JAVA_HOME/bin:$PATH
  8. EOF
  9. $ source /etc/profile
  10. $ java -version # 查看版本信息
  11. java version "1.8.0_261"
  12. Java(TM) SE Runtime Environment (build 1.8.0_261-b12)
  13. Java HotSpot(TM) 64-Bit Server VM (build 25.261-b12, mixed mode)

配置master

以下操作只需在master上进行。

  1. $ wget https://mirrors.tuna.tsinghua.edu.cn/apache/jmeter/binaries/apache-jmeter-5.2.1.tgz
  2. $ tar zxf apache-jmeter-5.2.1.tgz -C /apps/usr/
  3. $ cat >> /etc/profile << 'EOF'
  4. export JMETER_HOME=/apps/usr/apache-jmeter-5.2.1/
  5. export CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$CLASSPATH
  6. export PATH=$JMETER_HOME/bin:$PATH
  7. EOF
  8. $ source /etc/profile
  9. $ jmeter -v # 查看jmeter版本
  10. Dec 19, 2020 12:24:00 AM java.util.prefs.FileSystemPreferences$1 run
  11. INFO: Created user preferences directory.
  12. _ ____ _ ____ _ _ _____ _ __ __ _____ _____ _____ ____
  13. / \ | _ \ / \ / ___| | | | ____| | | \/ | ____|_ _| ____| _ \
  14. / _ \ | |_) / _ \| | | |_| | _| _ | | |\/| | _| | | | _| | |_) |
  15. / ___ \| __/ ___ \ |___| _ | |___ | |_| | | | | |___ | | | |___| _ <
  16. /_/ \_\_| /_/ \_\____|_| |_|_____| \___/|_| |_|_____| |_| |_____|_| \_\ 5.2.1
  17. Copyright (c) 1999-2019 The Apache Software Foundation
  18. # 调整jmeter配置
  19. $ cd /apps/usr/apache-jmeter-5.2.1
  20. $ vim bin/jmeter.properties # 修改此文件
  21. remote_hosts=192.168.20.5:1099,192.168.20.6:1099 # 指定执行机的IP:端口
  22. server_port=1099 # 此处需和remote_hosts指定的端口一致
  23. server.rmi.ssl.disable=true # 此处改为true
  24. server.rmi.localport=4000 # 取消注释
  25. mode=Standard # 取消注释
  26. $ vim bin/jmeter-server # 修改此文件
  27. RMI_HOST_DEF=-Djava.rmi.server.hostname=192.168.20.10 # 取消注释并改为本机IP
  28. # 将修改后的jmeter目录发送至其他节点
  29. $ for i in `seq 5 6`;do rsync -az /apps/usr/apache-jmeter-5.2.1 192.168.20.$i:/apps/usr/;done

配置slave端

  1. $ cat >> /etc/profile << 'EOF'
  2. export JMETER_HOME=/apps/usr/apache-jmeter-5.2.1/
  3. export CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$CLASSPATH
  4. export PATH=$JMETER_HOME/bin:$PATH
  5. EOF
  6. $ source /etc/profile
  7. $ jmeter -v # 查看jmeter版本
  8. Dec 19, 2020 12:24:00 AM java.util.prefs.FileSystemPreferences$1 run
  9. INFO: Created user preferences directory.
  10. _ ____ _ ____ _ _ _____ _ __ __ _____ _____ _____ ____
  11. / \ | _ \ / \ / ___| | | | ____| | | \/ | ____|_ _| ____| _ \
  12. / _ \ | |_) / _ \| | | |_| | _| _ | | |\/| | _| | | | _| | |_) |
  13. / ___ \| __/ ___ \ |___| _ | |___ | |_| | | | | |___ | | | |___| _ <
  14. /_/ \_\_| /_/ \_\____|_| |_|_____| \___/|_| |_|_____| |_| |_____|_| \_\ 5.2.1
  15. Copyright (c) 1999-2019 The Apache Software Foundation
  16. $ vim /apps/usr/apache-jmeter-5.2.1/bin/jmeter-server
  17. 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报告的目录

压测过程中,屏幕输出如下:

Jmeter分布式压测环境部署 - 图2