【Linux 服务器上搭建 JMeter 性能测试与监控环境(实战版)】

课程: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 控制并发数和时长)
      • [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% 会报错。解决办法:

  1. 用相对路径:CSV 文件和 JMX 放在同一目录,引用时用 ./data.csv 或直接写文件名
  2. 上传后手动改:传到服务器上,用 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 首页是一个监控仪表盘,展示了多个面板。顶部是 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 压测就这么点事:

  1. 装 JDK:用 OpenJDK 11
  2. 装 JMeter:解压就行,配环境变量
  3. 传脚本:用 scp 或 SFTP
  4. 跑压测:jmeter -n -t -l -e -o 这几个参数记住
  5. 做监控:top/htop 或者 Prometheus + Grafana

核心就一句话:服务器资源要用来压测,不是给图形界面用的。

✦ 希望这篇文章能帮你快速搭建起 Linux 压测环境。如果有问题,评论区见。

实践是检验整理的唯一标准

相关推荐
顾北122 小时前
从零搭建 ELK 栈(ES+Kibana+Logstash):含 IK + 拼音分词,MySQL 同步 ES 完整配置
运维·elasticsearch
papaofdoudou2 小时前
Linux内核的边界在哪里?
linux·运维·服务器
路由侠内网穿透2 小时前
本地部署开源零信任网络平台 NetBird 并实现外部访问
运维·服务器·数据库·开源
zzzsde2 小时前
【Linux】文件:基础IO
linux·运维·服务器
qq_254674412 小时前
Docker Docker Compose
运维·docker·容器
Aurora(^*_*^)2 小时前
docker 部署openclaw踩坑记录
运维·docker·容器
wanhengidc2 小时前
服务器托管对企业的作用
大数据·运维·服务器·分布式·智能手机
基于底层的菜鸟2 小时前
VsCode GitHub Copilot Chat 节省request
服务器·copilot·ai编程
Yupureki2 小时前
《Linux系统编程》15.进程间通信-管道
linux·运维·服务器·c语言·c++