-
背景
本文主要是记录最近对系统进行压测时,搭建和使用Jmeter对系统进行压测,以及通过部署influxdb来收集压测数据,并通过配置Grafana面板来展示压测时的数据
-
Jmeter GUI 使用
对于刚接触Jmeter的用户来说,先通过Jmeter GUI来熟悉Jmeter是一种比较好的途径
-
实现一个简单的Jmeter压测
-
下载并配置JDK并配置PATH
此处自行进行下载并配置系统path
-
下载并配置Jmeter Path
此处自行进行下载Jmeter压缩包,并配置系统配置
-
启动Jmeter GUI并配置压测
windows环境下打开bin目录下的Jmeter.bat,之后会打开Jmeter GUI,如图所示
在 apache-jmeter-5.6.3\bin\Jmeter.properties 文件中包含了Jmeter的很多配置,包括语言环境等
-
Jmeter Plugs Manager的配置和使用
1、下载jmeter-plugins-manager-1.9.jar、JMeterPlugins-Extras.jar、JMeterPlugins-Standard.jar
提取码:t1m6
将其放置 Jmeter安装目录 lib/ext 下 2、然后重新打开Jmeter
点击 Options – Plugins Manager
选择需要安装的插件信息,jpgc-Standard Set
点击右下角 Install 3、安装后重启Jmeter 4、点击添加线程组页面、可查到
5、监控jp@gc - PerfMon Metrics Collector的使用 链接:pan.baidu.com/s/1SVw9IDP_… 提取码:2dvc a.下载“ServerAgent-2.2.3”,解压到复制到要监控的服务器上,windows和linux通用,使用这个代理服务之前要JDK已经安装配置成功。我这边以centos为例。
若无解压工具、先安装 yum -y install zip unzip 解压 unzip ServerAgent-2.2.3.zip b.进入解压后的ServerAgent-2.2.3文件中 执行 命令 ./startAgent.sh 注意:如果权限不够、就进行权限赋值 chmod 775 startAgent.sh 然后再次启动代理服务,出现如下提示证明成功了,默认端口4444。
查看启动脚本 为非后台启动 可以修改为 后台启动 nohup java -jar CMDRunner.jar --tool PerfMonAgent “$@” & 6、添加资源监控 在JMeter脚本中添加“jp@gc - PerfMon Metrics Collector”监听器
Metric to Collect:根据监控的要求可以选择CPU,Disks I/O,Network I/O等,一次只能选择一个,如果要监控多种资源,可以点击“Add Row”继续添加
-
配置一个Jmeter的压测
一个简单的Http请求的压测配置如图所示,一般包含以下配置原件
-
线程组 - 工作线程的容器可以理解为线程池,用来执行发起请求的能力
-
Http请求 - 配置你的要压测的http请求接口配置
- http相关的请求头的配置
-
查看结果树 - 记录压测的每一个请求的详情,包括请求头,请求体,响应
-
聚合树 - 查看请求的统计信息
-
配置好之后可以对你的压测配置进行保存到本地,形成一个jmx文件,后续可以直接使用这个文件在非GUI环境,比如Linux机器上使用这个配置文件进行压测
-
Linux下Jmeter使用
首先是配置,同样需要Linux机器上有相应的JDK 以及 Jmeter解压包,最好都配置下PATH,之后就可以在Linux上通过压测脚本进行压测了,一个参考的压测脚本如下:
然后执行 jmeter_test_script_6k.sh start 进行启动压测
#!/bin/bash
# JMeter压力测试执行脚本
# 作者:
# 日期: $(date +%Y-%m-%d)
# 配置变量
JMETER_HOME="/root/jmeter/apache-jmeter-5.6.3"
TEST_PLAN="/root/jmeter/fepPress6k.jmx"
BASE_DIR="/root/jmeter"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
# 结果文件路径
RESULT_FILE="${BASE_DIR}/results/fep_test_${TIMESTAMP}.jtl"
REPORT_DIR="${BASE_DIR}/reports/fep_report_${TIMESTAMP}"
LOG_FILE="${BASE_DIR}/logs/fep_test_${TIMESTAMP}.log"
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 打印带颜色的信息
print_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
print_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 检查函数
check_prerequisites() {
print_info "检查运行环境..."
# 检查Java
if ! command -v java &> /dev/null; then
print_error "Java未安装或未在PATH中"
exit 1
fi
# 检查JMeter
if [ ! -f "${JMETER_HOME}/bin/jmeter" ]; then
print_error "JMeter不存在: ${JMETER_HOME}/bin/jmeter"
exit 1
fi
# 检查测试计划文件
if [ ! -f "${TEST_PLAN}" ]; then
print_error "测试计划文件不存在: ${TEST_PLAN}"
exit 1
fi
print_success "环境检查通过"
}
# 创建目录
create_directories() {
print_info "创建必要的目录..."
mkdir -p "${BASE_DIR}/results"
mkdir -p "${BASE_DIR}/reports"
mkdir -p "${BASE_DIR}/logs"
print_success "目录创建完成"
}
# 显示配置信息
show_config() {
echo ""
print_info "=== 测试配置信息 ==="
echo "JMeter路径: ${JMETER_HOME}"
echo "测试计划: ${TEST_PLAN}"
echo "结果文件: ${RESULT_FILE}"
echo "报告目录: ${REPORT_DIR}"
echo "日志文件: ${LOG_FILE}"
echo "时间戳: ${TIMESTAMP}"
echo ""
}
# 执行测试
run_test() {
print_info "开始执行JMeter压力测试..."
# 切换到JMeter目录
cd "${JMETER_HOME}/bin" || exit 1
# 执行JMeter测试
nohup ./jmeter -n -t "${TEST_PLAN}" \
-l "${RESULT_FILE}" \
-e -o "${REPORT_DIR}" \
-Juser.timezone=Asia/Shanghai \
> "${LOG_FILE}" 2>&1 &
# 获取进程ID
JMETER_PID=$!
print_success "JMeter测试已在后台启动"
print_info "进程ID: ${JMETER_PID}"
# 将PID保存到文件
echo "${JMETER_PID}" > "${BASE_DIR}/jmeter.pid"
return 0
}
# 监控测试状态
monitor_test() {
if [ ! -f "${BASE_DIR}/jmeter.pid" ]; then
print_error "找不到JMeter进程ID文件"
return 1
fi
JMETER_PID=$(cat "${BASE_DIR}/jmeter.pid")
print_info "监控测试进程 (PID: ${JMETER_PID})"
print_info "按 Ctrl+C 退出监控(不会停止测试)"
while kill -0 "${JMETER_PID}" 2>/dev/null; do
if [ -f "${RESULT_FILE}" ]; then
LINES=$(wc -l < "${RESULT_FILE}" 2>/dev/null || echo "0")
print_info "当前已执行请求数: $((LINES-1))"
fi
sleep 10
done
print_success "测试已完成"
}
# 显示测试结果
show_results() {
if [ -f "${RESULT_FILE}" ]; then
print_success "测试结果文件: ${RESULT_FILE}"
TOTAL_REQUESTS=$(wc -l < "${RESULT_FILE}")
print_info "总请求数: $((TOTAL_REQUESTS-1))"
fi
if [ -d "${REPORT_DIR}" ]; then
print_success "HTML报告目录: ${REPORT_DIR}"
print_info "可以通过浏览器打开: ${REPORT_DIR}/index.html"
fi
if [ -f "${LOG_FILE}" ]; then
print_success "日志文件: ${LOG_FILE}"
fi
}
# 停止测试
stop_test() {
if [ -f "${BASE_DIR}/jmeter.pid" ]; then
JMETER_PID=$(cat "${BASE_DIR}/jmeter.pid")
if kill -0 "${JMETER_PID}" 2>/dev/null; then
print_warning "正在停止JMeter测试 (PID: ${JMETER_PID})"
kill "${JMETER_PID}"
sleep 5
if kill -0 "${JMETER_PID}" 2>/dev/null; then
print_warning "强制停止JMeter测试"
kill -9 "${JMETER_PID}"
fi
print_success "JMeter测试已停止"
else
print_info "JMeter测试已经停止"
fi
rm -f "${BASE_DIR}/jmeter.pid"
else
print_warning "找不到JMeter进程ID文件"
fi
}
# 清理旧文件
cleanup_old_files() {
print_info "清理7天前的测试文件..."
find "${BASE_DIR}/results" -name "*.jtl" -mtime +7 -delete 2>/dev/null
find "${BASE_DIR}/reports" -type d -mtime +7 -exec rm -rf {} + 2>/dev/null
find "${BASE_DIR}/logs" -name "*.log" -mtime +7 -delete 2>/dev/null
print_success "清理完成"
}
# 显示帮助信息
show_help() {
echo "用法: $0 [选项]"
echo ""
echo "选项:"
echo " start 启动JMeter压力测试"
echo " stop 停止JMeter压力测试"
echo " monitor 监控测试进度"
echo " status 查看测试状态"
echo " cleanup 清理旧的测试文件"
echo " help 显示此帮助信息"
echo ""
}
# 查看测试状态
show_status() {
if [ -f "${BASE_DIR}/jmeter.pid" ]; then
JMETER_PID=$(cat "${BASE_DIR}/jmeter.pid")
if kill -0 "${JMETER_PID}" 2>/dev/null; then
print_success "JMeter测试正在运行 (PID: ${JMETER_PID})"
# 显示最新的结果文件信息
LATEST_RESULT=$(ls -t "${BASE_DIR}/results"/*.jtl 2>/dev/null | head -1)
if [ -f "${LATEST_RESULT}" ]; then
LINES=$(wc -l < "${LATEST_RESULT}")
print_info "当前请求数: $((LINES-1))"
print_info "结果文件: ${LATEST_RESULT}"
fi
else
print_warning "JMeter进程不存在,但PID文件存在"
rm -f "${BASE_DIR}/jmeter.pid"
fi
else
print_info "JMeter测试未运行"
fi
}
# 主函数
main() {
case "${1:-start}" in
"start")
check_prerequisites
create_directories
show_config
run_test
print_info "使用 '$0 monitor' 监控测试进度"
print_info "使用 '$0 stop' 停止测试"
;;
"stop")
stop_test
;;
"monitor")
monitor_test
show_results
;;
"status")
show_status
;;
"cleanup")
cleanup_old_files
;;
"help"|"-h"|"--help")
show_help
;;
*)
print_error "未知选项: $1"
show_help
exit 1
;;
esac
}
# 脚本入口
main "$@"
-
使用influxdb收集并配置Grafana展示面板
同时可以使用influxdb来对Jmeter的压测信息进行收集,并使用Grafana 配置influxdb 数据源进行展示Jmeter的压测数据
-
安装Influxdb
tar.gz安装包安装
wget https://dl.influxdata.com/influxdb/releases/influxdb-1.8.4_linux_amd64.tar.gz
[root@iZ8vb7u9c6qu93ecd45frhZ media]# ll
total 289780
-rw-r--r-- 1 root root 83911070 Mar 1 21:36 grafana-enterprise-8.4.2.linux-amd64.tar.gz
-rw-r--r-- 1 root root 63153191 May 6 2021 influxdb-1.7.9.x86_64.rpm
-rw-r--r-- 1 root root 64420310 Jan 28 2021 influxdb-1.8.4_linux_amd64.tar.gz
-rw-r--r-- 1 root root 9033415 Dec 8 16:52 node_exporter-1.3.1.linux-amd64.tar.gz
-rw-r--r-- 1 root root 76202164 Feb 28 23:58 prometheus-2.34.0-rc.0.linux-amd64.tar.gz
解压并移动到/usr/local下
tar -zxvf influxdb-1.8.4_linux_amd64.tar.gz
mv influxdb-1.8.4_linux_amd64 /usr/local/influxdb
设置软连接
ln -s /usr/local/influxdb/usr/bin/influx /usr/local/bin/influx
ln -s /usr/local/influxdb/usr/bin/influx /usr/local/bin/influxd
启动influxdb
#启动
influxd
#进入数据库命令行
influx
进入数据库命令行创建数据库、用户、密码为空
influx
>create database jmeter
>show databases
>use jmeter
>CREATE USER "root" WITH PASSWORD 'root' WITH ALL PRIVILEGES
>exit
rpm包安装
下载安装包
wget https://dl.influxdata.com/influxdb/releases/influxdb-1.7.9.x86_64.rpm
[root@iZ8vb7u9c6qu93ecd45frhZ media]# ll
total 289780
-rw-r--r-- 1 root root 83911070 Mar 1 21:36 grafana-enterprise-8.4.2.linux-amd64.tar.gz
-rw-r--r-- 1 root root 63153191 May 6 2021 influxdb-1.7.9.x86_64.rpm
-rw-r--r-- 1 root root 64420310 Jan 28 2021 influxdb-1.8.4_linux_amd64.tar.gz
-rw-r--r-- 1 root root 9033415 Dec 8 16:52 node_exporter-1.3.1.linux-amd64.tar.gz
-rw-r--r-- 1 root root 76202164 Feb 28 23:58 prometheus-2.34.0-rc.0.linux-amd64.tar.gz
安装
yum localinstall -y grafana-6.5.1-1.x86_64.rpm
启动influxdb
systemctl start influxd &
安装启动后同样需要创建数据库及账号,同上
-
配置Grafana
填写数据库及账号密码(根据实际创建填写)后点击,save&test
Granfana导入jmeter面板
选择一个写好的面板Apache JMeter Dashboard using Core InfluxdbBackendListenerClient dashboard for Grafana | Grafana Labs导入即可
填写数据库类型及数据库名称,点击import
配置Jmeter
在Jmeter中添加后端监听器配置如图,启动jmeter后查看Grafana面板数据
参考: