课程:B站大学
记录linux搭建性能测试环境,后续分享locust性能测试框架
Linux 服务器上搭建 JMeter 性能测试与监控环境(实战版)
-
- [前言:为什么我劝你把 JMeter 搬到 Linux 上](#前言:为什么我劝你把 JMeter 搬到 Linux 上)
- [一、服务器准备:你需要什么样的 Linux](#一、服务器准备:你需要什么样的 Linux)
-
- [1.1 配置应该选多大](#1.1 配置应该选多大)
- [1.2 推荐用什么系统](#1.2 推荐用什么系统)
- [二、安装 JDK:JMeter 的依赖](#二、安装 JDK:JMeter 的依赖)
-
- [2.1 先看看有没有 Java](#2.1 先看看有没有 Java)
- [2.2 安装 OpenJDK](#2.2 安装 OpenJDK)
- [2.3 配置环境变量](#2.3 配置环境变量)
- [三、安装 JMeter:几步搞定](#三、安装 JMeter:几步搞定)
-
- [3.1 下载解压](#3.1 下载解压)
- [3.2 配置环境变量](#3.2 配置环境变量)
- [3.3 目录结构规划](#3.3 目录结构规划)
- 四、把脚本传到服务器上
-
- [4.1 怎么传文件](#4.1 怎么传文件)
-
- [方法一:scp 命令(,推荐)](#方法一:scp 命令(,推荐))
- [方法二:SFTP 工具](#方法二:SFTP 工具)
- [方法三:Git 仓库](#方法三:Git 仓库)
- [4.2 路径问题要留意](#4.2 路径问题要留意)
- [五、非 GUI 模式怎么跑压测](#五、非 GUI 模式怎么跑压测)
-
- [5.1 为什么要用命令行模式](#5.1 为什么要用命令行模式)
- [5.2 核心命令就这一行](#5.2 核心命令就这一行)
- [5.3 实际跑一下](#5.3 实际跑一下)
- [5.4 控制并发数和时长](#5.4 控制并发数和时长)
-
- [方式一:改 JMX 脚本里的参数](#方式一:改 JMX 脚本里的参数)
- 方式二:写个自动化脚本
- [5.5 报告怎么看](#5.5 报告怎么看)
- 六、监控方案:压测时服务器状态怎么看
-
- [6.1 为什么必须监控](#6.1 为什么必须监控)
- [6.2 最简单:top 命令](#6.2 最简单:top 命令)
- [6.3 更好用:htop](#6.3 更好用:htop)
- [6.4 进阶方案:Prometheus + Grafana](#6.4 进阶方案:Prometheus + Grafana)
-
- [快速安装(用 Docker):](#快速安装(用 Docker):)
- [6.5 常用监控指标一览](#6.5 常用监控指标一览)
- [6.6 快速判断服务器能不能扛](#6.6 快速判断服务器能不能扛)
- 七、常见问题与坑
-
- [7.1 压测发不出去](#7.1 压测发不出去)
- [7.2 JMeter 报 OOM](#7.2 JMeter 报 OOM)
- [7.3 报告生成失败](#7.3 报告生成失败)
- [7.4 注意事项](#7.4 注意事项)
- 八、总结
- 实践是检验整理的唯一标准
前言:为什么我劝你把 JMeter 搬到 Linux 上
在性能测试的工程化实践中,GUI 永远只负责"调试",而非"执行"。
鉴于 Windows 桌面环境在资源调度和高并发下的固有局限,我已将全套压测环境迁移至 Linux 服务器。这不仅规避了 GUI 渲染带来的性能损耗,更为实时监控和结果准确性提供了底层保障。
本文将毫无保留地分享这套 Linux 压测环境的搭建全流程。
假设你已备好 .jmx脚本,我们直接上实战。
一、服务器准备:你需要什么样的 Linux
1.1 配置应该选多大
很多新手问这个问题,我直接给个参考:
┌──────────┬────────┬───────┬─────────┐
│ 并发数 │ CPU │ 内存 │ 带宽 │
├──────────┼────────┼───────┼─────────┤
│ 50 以下 │ 4 核 │ 8GB │ 5Mbps │
│ 50-100 │ 8 核 │ 16GB │ 10Mbps │
│ 100 以上 │ 16 核+ │ 32GB+ │ 20Mbps+ │
└──────────┴────────┴───────┴─────────┘
当然这个不是死的,如果你只是跑简单的接口压测,4 核 8GB 也够用。关键是压测之前先用低并发试试水,看看服务器资源占用情况。
1.2 推荐用什么系统
CentOS 7/8、Ubuntu 18.04+、Debian 9+ 这些主流发行版都行。我个人偏好 CentOS 7,稳,而且很多公司服务器都是这个。
至于云服务器还是物理机,看你们公司情况。云服务器的好处是弹性,有问题随时可以加配置。
二、安装 JDK:JMeter 的依赖
2.1 先看看有没有 Java
很多 Linux 服务器默认已经装了 Java,先检查一下:
python
java -version
如果显示版本号了,说明有 Java,可以跳过安装这一步。如果没有,显示 "command not found",继续往下看。
2.2 安装 OpenJDK
JMeter 5.x 需要 JDK 8 以上,但我建议你用 JDK 11。JDK 17 虽然新,但容易出现兼容性问题,JDK 11 是 LTS 版本,稳定。
CentOS / RHEL 系列:
1、 安装 JDK 11
python
yum install -y java-11-openjdk java-11-openjdk-devel
2、 验证安装
python
java -version
3、应该看到类似输出:
python
# openjdk version "11.0.20" 2023-07-18
# OpenJDK Runtime Environment (build 11.0.20+8-b23)
# OpenJDK 64-Bit Server VM (build 11.0.20+8-b23, mixed mode)
Ubuntu / Debian 系列:
python
apt update
apt install -y openjdk-11-jdk
2.3 配置环境变量
为了方便以后使用,最好配置一下环境变量:
1、 打开 profile 文件
python
vim /etc/profile
#2、在文件末尾添加这两行(按 i 进入编辑模式)
python
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
export PATH=$PATH:$JAVA_HOME/bin
3、 按 ESC 退出编辑模式,输入 :wq 保存退出
4、 生效配置
python
source /etc/profile
5、 验证
python
echo $JAVA_HOME
小技巧:如果你不确定 JDK 安装路径,可以用 find /usr -name "java" 命令找一下。
三、安装 JMeter:几步搞定
3.1 下载解压
官方下载的是 tar.gz 包,解压就能用,不需要编译安装:
1、 进到你想放的目录,我习惯放 /opt
python
cd /opt
2、 下载 JMeter(用清华镜像源会快一点)
python
wget https://mirrors.tuna.tsinghua.edu.cn/apache/jmeter/binaries/apache-jmeter-5.6.3.tgz
3、 解压
python
tar -zxf apache-jmeter-5.6.3.tgz
4、 为了好记,改个短名字
python
mv apache-jmeter-5.6.3 jmeter
5、 查看目录结构
python
ls -la /opt/jmeter/
6、 应该看到 bin、lib、docs 这些目录
3.2 配置环境变量
还是编辑 /etc/profile:
python
vim /etc/profile
1、 添加这两行
python
export JMETER_HOME=/opt/jmeter
export PATH=$PATH:$JMETER_HOME/bin
2、 保存退出
python
source /etc/profile
3、 验证安装成功
python
jmeter --version
4、应该看到:
python
# Created the tree successfully using ./bin/healthcheck.properties
# Apache JMeter 5.6.3
记住:以后在任意目录输入 jmeter 就能运行,不用每次都 cd 到 bin 目录。
3.3 目录结构规划
建议一开始就规划好目录,省得以后乱找文件:
1、 创建项目目录
python
mkdir -p /root/jmeter/{test-plans,scripts,data/csv,config,reports,logs}
2、解释一下每个目录干啥的
python
# test-plans/ 放你的 .jmx 脚本文件
# scripts/ 放你写的自动化脚本
# data/csv/ 放测试数据
# config/ 放配置文件
# reports/ 放生成的 HTML 报告
# logs/ 放运行日志
四、把脚本传到服务器上
4.1 怎么传文件
你本地写好的 JMX 脚本,需要传到服务器上。以下几种方式看哪个方便:
方法一:scp 命令(,推荐)
1、 在你本地电脑的终端运行,不是服务器上
python
scp /你本地/的路径/你的脚本.jmx root@服务器IP:/root/jmeter/test-plans/
2、 传 CSV 数据也是同理
python
scp /你本地/的路径/testdata.csv root@服务器IP:/root/jmeter/data/csv/
方法二:SFTP 工具
用 FileZilla 之类的工具,界面跟普通 FTP 一样,左边选本地文件,右边选服务器目录,拖过去就行。
方法三:Git 仓库
如果脚本纳入版本管理,直接在服务器上 clone:
python
cd /root
git clone https://github.com/你的仓库地址/jmeter-scripts.git
4.2 路径问题要留意
这里有个大坑:Windows 和 Linux 路径格式不一样。
- Windows 路径:C:\Users\test\data.csv
- Linux 路径:/root/jmeter/data/csv/data.csv
如果你在 JMX 脚本里用了绝对路径,传到服务器上 100% 会报错。解决办法:
- 用相对路径:CSV 文件和 JMX 放在同一目录,引用时用 ./data.csv 或直接写文件名
- 上传后手动改:传到服务器上,用 sed 命令批量替换路径
我推荐第一种,简单省事。
五、非 GUI 模式怎么跑压测
5.1 为什么要用命令行模式
这个问题必须单独说清楚。很多新手觉得 GUI 界面直观,但 GUI 会消耗额外资源。你是来做压测的,服务器资源要用来产生压力,而不是给图形界面用的。专业压测都是用命令行模式,也叫非 GUI 模式。
5.2 核心命令就这一行
1、 切到项目目录
python
cd /root/jmeter
2、 执行压测
python
jmeter -n \
-t test-plans/你的脚本.jmx \
-l results/测试结果.jtl \
-e -o reports/报告目录
参数解释:
- -n :非 GUI 模式,必须加
- -t :指定测试脚本文件
- -l :指定结果保存文件(jtl 格式)
- -e :测试结束后生成 HTML 报告
- -o :报告输出目录,注意这个目录必须为空
5.3 实际跑一下
python
cd /root/jmeter
1、 执行脚本
python
jmeter -n \
-t test-plans/api_test.jmx \
-l results/test_50.jtl \
-e -o reports/test_50
2、 运行过程中会显示进度
python
# Running the test!
# Summarising data...Done.
5.4 控制并发数和时长
有两种方式:
方式一:改 JMX 脚本里的参数
在脚本里把线程数、持续时间改成变量形式,然后用命令行传入具体值:
python
# 在 JMX 里把线程数改成 ${thread_num},时长改成 ${duration}
# 然后命令行这样传参
jmeter -n \
-t test-plans/api_test.jmx \
-l results/test_50.jtl \
-e -o reports/test_50 \
-Jthread_num=50 \
-Jduration=300
方式二:写个自动化脚本
每次敲一长串命令容易出错,我写了个简单的脚本:
python
#!/bin/bash
# 默认值
THREADS=50
DURATION=300
# 读取参数
while getopts "t:d:h" opt; do
case $opt in
t) THREADS=$OPTARG ;;
d) DURATION=$OPTARG ;;
h) echo "用法: $0 -t 并发数 -d 时长(秒)"
exit ;;
esac
done
# 生成报告目录名(带时间戳)
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
echo "开始压测:${THREADS}并发,${DURATION}秒"
jmeter -n \
-t /root/jmeter/test-plans/api_test.jmx \
-l /root/jmeter/results/test_${THREADS}_${TIMESTAMP}.jtl \
-e -o /root/jmeter/reports/test_${THREADS}_${TIMESTAMP} \
-Jthread_num=${THREADS} \
-Jduration=${DURATION}
echo "完成!报告在 /root/jmeter/reports/test_${THREADS}_${TIMESTAMP}"
保存为 run_test.sh,给执行权限就能用:
python
chmod +x run_test.sh
示例:跑 30 并发,5 分钟
python
./run_test.sh -t 30 -d 300
5.5 报告怎么看
压测结束后,进入报告目录,用浏览器打开 index.html。重点看这几个指标:
- Average:平均响应时间,越小越好
- 90% Line / 95% Line / 99% Line:90% / 95% / 99% 的请求在多少毫秒内完成,更能反映真实体验
- Throughput:TPS,每秒处理请求数,这个越大说明性能越好
- Error %:错误率,压测要求是 0%
截图描述:聚合报告页面顶部有一排数字卡片,显示样本数、平均响应时间、中位数、90分位、95分位、99分位、最小值、最大值、错误率、吞吐量等指标。中间是响应时间随时间变化的折线图,底部是每个请求的详细列表,包括请求名称、样本数、平均
值、异常比例等。
六、监控方案:压测时服务器状态怎么看
6.1 为什么必须监控
压测的时候,服务器状态直接影响结果准确性。你以为系统在扛压,其实服务器 CPU 已经 100% 了,测试结果当然不准。所以压测必须配合监控,发现服务器瓶颈。
6.2 最简单:top 命令
服务器自带,不用安装任何软件:
1、 直接运行
python
top
截图描述:top 界面分为上下两部分。上半部分是系统状态,显示当前时间、运行时间、登录用户数、负载平均值(三个数字分别代表1分钟/5分钟/15分钟的平均负载)。接着是 CPU
使用情况,按用户进程、系统进程、IO等待等分类显示。下半部分是进程列表,按 CPU 占用排序,每行显示 PID、用户名、CPU 占用百分比、内存占用、命令名等。按 q 退出。
重点看这几个:
- load average:负载平均值。如果数值超过 CPU 核心数,说明有进程在排队了。4 核 CPU 负载超过 4,就要小心。
- %CPU:压测时 JMeter 进程(java 进程)应该占用比较高
- %MEM:内存别超过 80%,超过容易 OOM
6.3 更好用:htop
如果觉得 top 不够直观,装 htop,彩色界面 + 鼠标操作:
1、 CentOS
python
yum install -y htop
2、 Ubuntu
python
apt install -y htop
3、 运行
python
htop
截图描述:htop 界面比 top 漂亮很多。顶部有三个横条,分别是 CPU、内存、交换分区的使用率,用不同颜色区分。中间是进程列表,可以用方向键滚动查看。最下方是功能键说明,F9 可以杀掉进程,F3
可以搜索进程。这个界面支持鼠标点击操作,比如点击内存列就能按内存占用排序,看起来比 top 舒服多了。
6.4 进阶方案:Prometheus + Grafana
如果你是长期做性能测试,或者需要监控多台服务器,推荐装这套。架构大概是这么回事:
┌─────────────┐ 抓指标 ┌─────────────┐ 告警 ┌─────────────┐
│ 目标服务器 │ ─────────> │ Prometheus │ ────────> │ Alertmanager│
│(Node Exporter)│ │ │ │ │
└─────────────┘ └──────┬──────┘ └─────────────┘
│
▼
┌─────────────┐
│ Grafana │ <-- 可视化面板
└─────────────┘
为什么选这套:
- Prometheus:专门存时序数据的数据库,监控场景首选
- Grafana:图表特别漂亮,可以自己拼仪表盘
- Alertmanager:支持告警,可以推送到钉钉、飞书、邮件
快速安装(用 Docker):
1、 装 Docker
python
yum install -y docker docker-compose
2、 启动
python
systemctl start docker
3、 创建项目目录
python
mkdir -p /root/monitoring-stack
cd /root/monitoring-stack
4、 这里需要 docker-compose.yml 文件,先创建
python
vim docker-compose.yml
把以下内容粘进去:
python
version: '3.1'
services:
prometheus:
image: prom/prometheus:latest
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- ./prometheus-data:/prometheus
ports:
- "9090:9090"
node-exporter:
image: prom/node-exporter:latest
ports:
- "9100:9100"
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
volumes:
- ./grafana-data:/var/lib/grafana
再创建 prometheus.yml:
python
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['node-exporter:9100']
启动服务:
python
docker-compose up -d
启动成功后:
- Grafana:http://你的服务器IP:3000 (首次登录账号 admin/admin)
- Prometheus:http://你的服务器IP:9090
截图描述:Grafana 首页是一个监控仪表盘,展示了多个面板。顶部是 CPU 使用率折线图,蓝色曲线从 0% 走到 30% 左右。左侧导航栏可以切换仪表盘和数据源。右侧有告警列表,显示"CPU
使用率正常"。页面下方还有内存使用率、磁盘使用率、网络流量等图表。
6.5 常用监控指标一览
┌────────────┬──────────┬──────────────────────────┐
│ 指标 │ 正常范围 │ 超过会怎样 │
├────────────┼──────────┼──────────────────────────┤
│ CPU 使用率 │ < 70% │ 持续 >85% 会影响压测结果 │
│ 内存使用率 │ < 80% │ >90% 可能 OOM 崩溃 │
│ 磁盘 IO │ 正常 │ IO 等待高会影响响应时间 │
│ 网络带宽 │ < 50% │ 跑满了请求会超时 │
└────────────┴──────────┴──────────────────────────┘
6.6 快速判断服务器能不能扛
压测期间另一个终端跑 top,观察 java 进程:
- CPU < 50%:服务器很轻松,可以继续加压
- CPU 50%-80%:开始吃力了
- CPU > 80%:基本到瓶颈了,再加也没意义
七、常见问题与坑
7.1 压测发不出去
先检查几个地方:
- 目标服务器端口开着没
- 防火墙有没有拦截
- 网络通不通:telnet 目标IP 端口
7.2 JMeter 报 OOM
内存不够了,改 bin/jmeter 里的堆内存设置:
python
vim /opt/jmeter/bin/jmeter
python
# 找到这行
HEAP="-Xms1g -Xmx1g"
# 改成更大,比如 4GB
HEAP="-Xms4g -Xmx4g"
7.3 报告生成失败
常见原因:
- 结果文件格式不对,确保 JMX 里设置成 CSV 格式
- -o 指定的目录不是空的,用新目录或者先清空
7.4 注意事项
- 选好时间:压测尽量选凌晨或周末,别影响正常用户
- 提前打招呼:跟运维、后端同事都说一声
- 从小开始:先低并发跑通,再逐步加压
- 全程监控:压测过程中别走开,随时看服务器状态
八、总结
Linux 上跑 JMeter 压测就这么点事:
- 装 JDK:用 OpenJDK 11
- 装 JMeter:解压就行,配环境变量
- 传脚本:用 scp 或 SFTP
- 跑压测:jmeter -n -t -l -e -o 这几个参数记住
- 做监控:top/htop 或者 Prometheus + Grafana
核心就一句话:服务器资源要用来压测,不是给图形界面用的。
✦ 希望这篇文章能帮你快速搭建起 Linux 压测环境。如果有问题,评论区见。
实践是检验整理的唯一标准
