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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM