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=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