一、安装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--

189

被折叠的 条评论
为什么被折叠?



