Jmeter5.4分布式压测
jmeter分布式压测介绍
在使用Jmeter进行性能测试时,如果并发数比较大时候,单机受限内存、CPU、网络IO,会出现服务器压力还没有上去,压测服务器已经由于模拟的压力太大变的很卡甚至死机,这时可以使用Jmeter提供的分布式测试的功能。
按照一般的压力机配置,jmeter的GUI模式下(Windows),最多支持300左右的模拟请求线程,再大的话,容易造成卡顿、无响应等情况,这是限于jmeter其本身的机制和硬件配置。
有时候为了尽量模拟业务场景,需要模拟大量的并发请求,这个时候单台压力机就显得有心无力。针对这个情况,jmeter的解决方案是支持分布式压测,即将大量的模拟并发分配给多台压力机,来满足这种大流量的并发请求场景
在进行性能压测的时候,往往需要很大的并发量。但是一台电脑由于硬件方面的原因,支持的并发数不能达到上万级别。公司的电脑只支持到2000并发,内存和CPU就告急了。明显一台电脑支持不了我们的需求,这个时候就需要我们用到分布式了
实现原理
一台控制机搭配多台压力机,同时对服务器进行压力测试。压力机执行性能测试脚本,返回结果到控制机。控制机同时可以作为压力机
- Jmeter分布式测试时,选择其中一台作为调度机(master),其它机器做为执行机(slave)。
- 执行时,master会把脚本发送到每台slave上,slave 拿到脚本后就开始执行,slave执行时不需要启动GUI,它应该是通过命令行模式执行的。
- 执行完成后,slave会把结果回传给master,master会收集所有slave的信息并汇总。
准备工作
- 主从机在同一个局域网下,保证能ping通,且在多网卡环境需要保证启动的网卡都在一个网段
- Master和Slave安装相同版本jmeter以及JDK
- 保证电脑运行的只有一个网卡(config只显示一个ip信息),如果多网卡要指定网卡通讯
- 关闭防火墙,如果Windows系统作为master,Linux系统的服务器作为slave,还需要注意master和slave的防火墙是否已经关闭,Linux系统的服务器关闭防火墙命令:
systemctl stop firewalld
systemctl status firewalld
systemctl disable firewalld
systemctl enable firewalld
配置Master
修改jmeter.properties
在主控机的jmeter的bin目录下修改配置文件:jmeter.properties
remote_hosts=ip:port (多个压力机之间用“,”隔开)
server.rmi.localport=1099
server.rmi.ssl.disable=true
启动master的jmeter服务
配置Slave
修改jmeter.properties
通修改master一样,打开linux里jmeter的bin目录的jmeter.properties文件
server_port=1099
server.rmi.localport=1099
server.rmi.ssl.disable=true
命令启动Slave的jmeter-server
jmeter-server -Djava.rmi.server.hostname=IP ,启动 anget 节点。jmeter-server 后面的参数指定 agent 的 IP
例:
jmeter-server -Djava.rmi.server.hostname=192.168.48.131
如果发现端口被占用,可以用命令杀死进程,再启动
【Linux】
查找端口进程的PID
# 查找进程PID
netstat -tlnp | grep 1099
# 杀死进程
kill -9 PID
【Mac】
# 查看8080端口占用情况
sudo lsof -i :8080
# 杀死进程
sudo kill -9 653
【Windows】
# 通过端口查看进程,获取对应PID
netstat -ano|findstr 8080
# 根据PID查询哪个程序或进程占用了端口
tasklist|findstr 2668
# 结束该进程
taskkill /f /t /im TIM.exe
或
taskkill /f /t /im 2668
如果发现master上时区和slave上的Linux时区不一致,主要修改Linux时区
# 修改时区命令
timedatectl set-timezone "Asia/Shanghai"
# 查看
date -R
Slave机器jmeter jvm调优
为了掠尽所有执行机的硬件和网络资源,加强执行机的发压能力,还需要对每台执行机进行深度jmeter jvm调优(修改jmeter.bat中jmeter的内存参数,从512m调整为合适大小)
vi打开jmeter.sh文件
一般而言,堆的最大值不要超过物理内存的一半,否则容易导致jmeter运行变慢、卡顿甚至内存溢出(因为java本身的垃圾回收机制是动态分配内存,
调整时候其本身会占用很多内存),NEW分配的内存,不宜太大!
这里默认值为
JVM_ARGS="-Xms512m -Xmx512m" jmeter.sh etc.
改为:
JVM_ARGS="-Xms512m -Xmx4096m" jmeter.sh etc.
修改日志级别
进入jmeter安装目录下的bin目录
找到log4j2.xml文件
可以设置以下日志级别:fatal, error, warn, info,debug,其中fatal打印日志最少,debug级别日志最详细
运行稳定测试时,如果jmeter-server.log打印过多,容易占满磁盘,这种情况下容易影响性能,所以我们可以设置日志级别到最高(fatal),这样级别不会打印什么日志内容
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Licensed to the Apache Software Foundation (ASF) under one or more
~ contributor license agreements. See the NOTICE file distributed with
~ this work for additional fatalrmation regarding copyright ownership.
~ The ASF licenses this file to you under the Apache License, Version 2.0
~ (the "License"); you may not use this file except in compliance with
~ the License. You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<Configuration status="fatal" packages="org.apache.jmeter.gui.logging">
<Appenders>
<File name="jmeter-log" fileName="${sys:jmeter.logfile:-jmeter.log}" append="false">
<PatternLayout>
<pattern>%d %p %c{1.}: %m%n</pattern>
</PatternLayout>
</File>
<GuiLogEvent name="gui-log-event">
<PatternLayout>
<pattern>%d %p %c{1.}: %m%n</pattern>
</PatternLayout>
</GuiLogEvent>
</Appenders>
<Loggers>
<Root level="fatal">
<AppenderRef ref="jmeter-log" />
<AppenderRef ref="gui-log-event" />
</Root>
<Logger name="org.apache.jmeter.junit" level="fatal" />
<!--
<Logger name="org.apache.jmeter.control" level="fatal" />
<Logger name="org.apache.jmeter.testbeans" level="fatal" />
<Logger name="org.apache.jmeter.engine" level="fatal" />
<Logger name="org.apache.jmeter.threads" level="fatal" />
<Logger name="org.apache.jmeter.gui" level="fatal" />
<Logger name="org.apache.jmeter.testelement" level="fatal" />
<Logger name="org.apache.jmeter.util" level="fatal" />
<Logger name="org.apache.jmeter.protocol.http" level="fatal" />
-->
<!-- # For CookieManager, AuthManager etc: -->
<!--
<Logger name="org.apache.jmeter.protocol.http.control" level="fatal" />
<Logger name="org.apache.jmeter.protocol.ftp" level="fatal" />
<Logger name="org.apache.jmeter.protocol.jdbc" level="fatal" />
<Logger name="org.apache.jmeter.protocol.java" level="fatal" />
<Logger name="org.apache.jmeter.testelements.property" level="fatal" />
-->
<Logger name="org.apache.jorphan" level="fatal" />
<!--
# Apache HttpClient logging examples
-->
<!-- # Enable header wire + context logging - Best for fatalging -->
<!--
<Logger name="org.apache.http" level="fatal" />
<Logger name="org.apache.http.wire" level="fatal" />
-->
<!-- # Enable full wire + context logging -->
<!-- <Logger name="org.apache.http" level="fatal" /> -->
<!-- # Enable context logging for connection management -->
<!-- <Logger name="org.apache.http.impl.conn" level="fatal" /> -->
<!-- # Enable context logging for connection management / request execution -->
<!--
<Logger name="org.apache.http.impl.conn" level="fatal" />
<Logger name="org.apache.http.impl.client" level="fatal" />
<Logger name="org.apache.http.client" level="fatal" />
-->
<!--
# Reporting logging configuration examples
-->
<!-- # If you want to fatal reporting, uncomment this line -->
<!-- <Logger name="org.apache.jmeter.report" level="fatal" /> -->
<!--
# More user specific logging configuration examples.
-->
<!-- <Logger name="org.apache.jorphan.reflect" level="fatal" /> -->
<!--
# fataling: Enabling the next fatal line causes javax.net.ssl.SSLException: Received fatal alert: unexpected_message
for certain sites when used with the default HTTP Sampler
-->
<!--
<Logger name="org.apache.jmeter.util.HttpSSLProtocolSocketFactory" level="fatal" />
<Logger name="org.apache.jmeter.util.JsseSSLManager" level="fatal" />
-->
<!--
# Enable Proxy request fatal
-->
<!-- <Logger name="org.apache.jmeter.protocol.http.proxy.HttpRequestHdr" level="fatal" /> -->
</Loggers>
</Configuration>
非GUI模式运行
命令运行
jmeter -n -t test.jmx -R 10.1.44.122,10.1.44.123 -l test.jtl
或
jmeter -n -t test.jmx -r -l test.jtl
参数
- n:非gui运行
- t:指定测试脚本
- R:指定多少个 agent 启动并参与测试
- r: 代表全部 agent 启动并参与测试
- l:生成测试结果文件
命令运行并同时生成report
参考文章:https://www.cnblogs.com/zibinchen/p/12373183.html
jmeter -n -t test.jmx -R 10.1.44.122,10.1.44.123 -l test.jtl -e -o tableresult
或
jmeter -n -t test.jmx -r -l test.jtl -e -o tableresult