Loading

Jmeter5.4分布式压测

jmeter分布式压测介绍

在使用Jmeter进行性能测试时,如果并发数比较大时候,单机受限内存、CPU、网络IO,会出现服务器压力还没有上去,压测服务器已经由于模拟的压力太大变的很卡甚至死机,这时可以使用Jmeter提供的分布式测试的功能。

按照一般的压力机配置,jmeter的GUI模式下(Windows),最多支持300左右的模拟请求线程,再大的话,容易造成卡顿、无响应等情况,这是限于jmeter其本身的机制和硬件配置。
有时候为了尽量模拟业务场景,需要模拟大量的并发请求,这个时候单台压力机就显得有心无力。针对这个情况,jmeter的解决方案是支持分布式压测,即将大量的模拟并发分配给多台压力机,来满足这种大流量的并发请求场景

在进行性能压测的时候,往往需要很大的并发量。但是一台电脑由于硬件方面的原因,支持的并发数不能达到上万级别。公司的电脑只支持到2000并发,内存和CPU就告急了。明显一台电脑支持不了我们的需求,这个时候就需要我们用到分布式了

实现原理

一台控制机搭配多台压力机,同时对服务器进行压力测试。压力机执行性能测试脚本,返回结果到控制机。控制机同时可以作为压力机

  1. Jmeter分布式测试时,选择其中一台作为调度机(master),其它机器做为执行机(slave)。
  2. 执行时,master会把脚本发送到每台slave上,slave 拿到脚本后就开始执行,slave执行时不需要启动GUI,它应该是通过命令行模式执行的。
  3. 执行完成后,slave会把结果回传给master,master会收集所有slave的信息并汇总。

准备工作

  1. 主从机在同一个局域网下,保证能ping通,且在多网卡环境需要保证启动的网卡都在一个网段
  2. Master和Slave安装相同版本jmeter以及JDK
  3. 保证电脑运行的只有一个网卡(config只显示一个ip信息),如果多网卡要指定网卡通讯
  4. 关闭防火墙,如果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
posted @ 2020-10-20 23:06  Binzichen  阅读(1937)  评论(0编辑  收藏  举报