jmeter压测笔记

一、安装jmeter:

下载地址:https://jmeter.apache.org/download_jmeter.cgi

jmeter版本:apache-jmeter-5.6.3

解压,部署到控制机和执行机,架构如下:

安装插件:

Plugins Manager下载地址:https://jmeter-plugins.org/install/Install/

Server Agent下载地址:http://jmeterplugins.com/downloads/index.html

从页面下载安装:

jmeter-plugins-manager-1.11.jar、

ServerAgent-2.2.1.zip

在插件管理里搜索并安装:

PerfMon、

Basic Graphs、

Additional Graphs。

安装性能监控ServerAgent到目标机:

ServerAgent-2.2.3.zip。

对于arm64系统需要自己下载安装libsigar-aarch64-linux.so:

下载地址:https://raw-cdn.gitcode.com/open-source-toolkit/28704/blobs/0fa9ff40ddd887054c8680425abfb1048be524dc/libsigar-aarch64-linux.zip

解压拿到libsigar-aarch64-linux.so放到ServerAgent-2.2.3/lib目录下。

ServerAgent打开调试日志的启动选项:

java -jar ./ServerAgent-2.2.3/CMDRunner.jar --tool PerfMonAgent --loglevel debug

二、配置jmeter

控制机配置:

修改 bin/jmeter.properties:

remote_hosts=10.10.10.120:4000,10.10.10.121:4000

server.rmi.ssl.disable=true

执行机配置:

修改 bin/jmeter.properties:

server_port=4000

server.rmi.localport=4000

server.rmi.ssl.disable=true

修改 bin/jmeter-server:

RMI_HOST_DEF=-Djava.rmi.server.hostname=10.10.10.120

执行机开放jmeter-server防火墙端口:

firewall-cmd --add-port=4000/tcp --permanent && firewall-cmd --reload

目标机开放性能监控agent防火墙端口:

firewall-cmd --add-port=4444/tcp --permanent && firewall-cmd --reload

三、启动jmeter

控制机启动命令:

windows下 双击 jmeter.bat。

点击远程启动、点击启动。

windows主要用于编写和调试jmeter执行计划的脚本,实际压测采用linux下的无界面分布式压测。

linux下无GUI执行:

启动所有执行机:

# 后台启动,方便有问题时执行stoptest.sh
./jmeter/bin/jmeter -n -t ./myTestPlan.jmx -r &

或指定启动的执行机列表,逗号分隔:

# 后台启动,方便有问题时执行stoptest.sh
./jmeter/bin/jmeter -n -t ./myTestPlan.jmx -R 10.10.10.120:4000,10.10.10.121:4000 &

通过结果日志生成html报告:

./jmeter/bin/jmeter -g ./outputs/agg.csv -o ./report/

控制机停止压测命令:

sh ./jmeter/bin/stoptest.sh

stoptest.sh发送控制消息给控制机的控制机进程,再由控制进程发送消息给执行机。

执行机启动命令:

cd apache-jmeter-5.6.3/bin/

./jmeter-server

执行机循环启动jmeter-server脚本:

#!/bin/bash
APP_NAME="jmeter-server"
APP_COMMAND="./jmeter-server-5.6.3/bin/jmeter-server"
LOG_FILE="./jmeter-server-loop.log"
CHECK_INTERVAL=10
RESTART_COUNT=0 
 
log_info() {
    local log_content="[$(date '+%Y-%m-%d %H:%M:%S')] $1"
    echo "$log_content"
    echo "$log_content" >> "$LOG_FILE"
}
 
 
cleanup() {
    log_info "监控脚本即将退出,正在杀死目标程序 $APP_NAME..."
     
    ps aux | grep "$APP_NAME" | grep -v grep | awk '{print $2}' | xargs kill
     
    ps aux | grep "$APP_NAME" | grep -v grep 2>&1 > /dev/null
    if [ "$?" != "0" ]; then
        log_info "警告:$APP_NAME 进程未完全杀死!"
    else
        log_info "$APP_NAME 进程已成功杀死,监控脚本退出完成。"
    fi
     
    exit 0
}
 
trap cleanup SIGINT SIGTERM SIGQUIT
 
 
log_info "====== 程序监控脚本启动 ======"
log_info "监控程序:$APP_NAME"
log_info "检查间隔:$CHECK_INTERVAL 秒"
log_info "日志文件:$LOG_FILE"
 
while true; do
    ps aux | grep "$APP_NAME" | grep -v grep 2>&1 > /dev/null
    if [ "$?" != "0" ]; then
        RESTART_COUNT=$((RESTART_COUNT + 1))
        log_info "程序 $APP_NAME 已退出,本次监控周期内重启次数:$RESTART_COUNT"
        log_info "正在执行启动命令:$APP_COMMAND"
         
        $APP_COMMAND > /dev/null 2>&1 &
        if [ "$?" == "0" ]; then
            log_info "程序 $APP_NAME 启动成功"
        else
            log_info "警告:程序 $APP_NAME 启动失败,请检查命令是否正确!"
        fi
         
        sleep 3
    fi
    sleep "$CHECK_INTERVAL"
done

目标机启动性能监控agent命令(root权限):

cd ServerAgent-2.2.3

sh startAgent.sh

目标机循环启动ServerAgent脚本:

#!/bin/bash
APP_NAME="ServerAgent"
APP_COMMAND="./ServerAgent-2.2.3/startAgent.sh"
LOG_FILE="./server-agent-loop.log"
CHECK_INTERVAL=10
RESTART_COUNT=0 
 
log_info() {
    local log_content="[$(date '+%Y-%m-%d %H:%M:%S')] $1"
    echo "$log_content"
    echo "$log_content" >> "$LOG_FILE"
}
 
 
cleanup() {
    log_info "监控脚本即将退出,正在杀死目标程序 $APP_NAME..."
     
    ps aux | grep "$APP_NAME" | grep -v grep | awk '{print $2}' | xargs kill
     
    ps aux | grep "$APP_NAME" | grep -v grep 2>&1 > /dev/null
    if [ "$?" != "0" ]; then
        log_info "警告:$APP_NAME 进程未完全杀死!"
    else
        log_info "$APP_NAME 进程已成功杀死,监控脚本退出完成。"
    fi
     
    exit 0
}
 
trap cleanup SIGINT SIGTERM SIGQUIT
 
 
log_info "====== 程序监控脚本启动 ======"
log_info "监控程序:$APP_NAME"
log_info "检查间隔:$CHECK_INTERVAL 秒"
log_info "日志文件:$LOG_FILE"
 
while true; do
    ps aux | grep "$APP_NAME" | grep -v grep 2>&1 > /dev/null
    if [ "$?" != "0" ]; then
        RESTART_COUNT=$((RESTART_COUNT + 1))
        log_info "程序 $APP_NAME 已退出,本次监控周期内重启次数:$RESTART_COUNT"
        log_info "正在执行启动命令:$APP_COMMAND"
         
        $APP_COMMAND > /dev/null 2>&1 &
        if [ "$?" == "0" ]; then
            log_info "程序 $APP_NAME 启动成功"
        else
            log_info "警告:程序 $APP_NAME 启动失败,请检查命令是否正确!"
        fi
         
        sleep 3
    fi
    sleep "$CHECK_INTERVAL"
done

四、设置jmeter执行计划

结果监听器:

在自己电脑本地调试通过监听器“查看结果树”进行,到线上压测时关闭此监听器。

在线上压测只需开启监听器:聚合报告、PerfMon Metrics Collector。

全局变量:

通过“用户定义变量”实现。

获取token:

增加setUp线程组,添加获取token的请求,在请求下增加“JSON提取器”获取结果里的token,然后通过“BeanShell 后置处理程序”放入全局属性。

请求头添加token:

在work线程组添加“HTTP信息头管理器”,从之前设置的全局属性里取token放入头信息里。

对http状态码是200但应用返回错误码的情况:

为整个work线程组增加“响应断言”:

可变的请求参数:

通过为请求增加“CSV 数据文件设置”实现,将参数放入csv,每行一组参数。可以循环使用或只执行一遍。

定义的变量名在请求中引用:

在请求中同时可以设置是否对参数进行url编码。

调整线程数:

在自己电脑本地调试可以只设置一个线程,持续6分钟:

在线上进行分布式压测时,需要改为实际的压测线程数:

编辑{压测名}.jmx文件:

注意:这里的ThreadGroup.num_threads线程数为单个执行机启动的线程数,总的压测线程数为ThreadGroup.num_threads乘以执行机数量,因为压测配置jmx是相同的分发到执行机执行。

--end--

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值