在CentOS上使用JMeter进行多线程压测的完整步骤
一 环境准备与安装
- 安装 Java 8(JMeter 5.x 要求 Java 8+):
- 执行:
sudo yum install -y java-1.8.0-openjdk-devel
- 配置环境变量:
/etc/profile 中添加
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export PATH=$JAVA_HOME/bin:$PATH
- 使配置生效:
source /etc/profile 并验证:java -version
- 安装 Apache JMeter(以 5.4.3 为例):
- 下载并解压:
tar -zxvf apache-jmeter-5.4.3.tgz -C /usr/local/
- 配置环境变量:
/etc/profile 中添加
export JMETER_HOME=/usr/local/apache-jmeter-5.4.3
export PATH=$JMETER_HOME/bin:$PATH
- 使配置生效:
source /etc/profile 并验证:jmeter -v
- 建议在 非GUI模式 执行压测(资源占用更低、稳定性更好)。
二 编写测试计划
- 在 JMeter GUI 中创建测试计划,添加线程组:
- 右键测试计划 → Add → Threads (Users) → Thread Group
- 关键参数:
- Number of Threads (users):并发用户数(每个线程≈1个虚拟用户)
- Ramp-Up Period (seconds):在多少秒内逐步启动全部线程(如 100 线程、 10 秒,则每秒启动约 10 个线程)
- Loop Count:每个线程循环次数;勾选 Forever 可持续执行
- 需要按固定时长运行时,勾选 Scheduler,设置 Duration(持续时间)
- 添加取样器(如 HTTP Request),填写协议、服务器名/IP、端口、方法、路径、参数等;必要时添加 HTTP Header Manager 设置 Content-Type 等请求头。
- 添加监听器用于结果分析:View Results Tree(调试用)、Aggregate Report(聚合指标如 Average/Median/90%/95%/99%/Throughput/Error%)。
三 命令行执行与参数化并发
- 基本执行(非GUI):
- 命令:
./jmeter -n -t /path/to/test_plan.jmx -l /path/to/results.jtl
- 说明:
-n 非GUI、-t 指定脚本、-l 输出 JTL 结果文件
- 生成 HTML 报告(压测结束后):
- 方式一(同跑同出):
./jmeter -n -t test.jmx -l results.jtl -e -o /path/to/report
- 方式二(事后生成):
./jmeter -g results.jtl -o /path/to/report
- 报告目录中的 index.html 可用浏览器查看
- 命令行参数化线程数与循环次数(无需改脚本):
- 在测试计划中,将线程数与循环次数用 JMeter 函数参数化:
- 线程数:
${__P(threads,1)}
- 循环次数:
${__P(cycles,1)}
- 运行时通过
-J 传入:jmeter -n -t test.jmx -Jthreads=200 -Jcycles=100 -l log.jtl
- 说明:
__P(property,default) 用于读取命令行 -J 传入的属性值,便于基线回归与多场景批量执行。
四 常见场景配置要点
- 瞬时并发(集合点):
- 使用 Synchronizing Timer(同步定时器)
- 设置 Number of Simultaneous Users to Group by(每次集合的用户数)与 Timeout in milliseconds(超时时间)
- 典型用法:线程组 Ramp-Up > 0,但通过同步定时器在指定时刻“汇合”后一起发起请求,模拟“同一时刻 N 个用户并发”
- 指定目标 TPS(吞吐控制):
- 添加 Constant Throughput Timer
- 设置 Target Throughput(目标 TPS,按每分钟/秒填写)
- 选择 Calculate Throughput based on:常用 this thread only(按线程自我调节以达到目标吞吐)
- 持续压测:
- 线程组 Loop Count = Forever,勾选 Scheduler,设置 Duration(如 600 秒=10 分钟)
- 多接口按比例并发:
- 为每个接口创建 吞吐量控制器(Throughput Controller),设置百分比(合计 100%),并在其下放置对应 HTTP Request。
五 性能与稳定性调优
- JMeter 自身(压力机)调优:
- 调整 堆内存(避免超过物理内存的 2/3):编辑
bin/jmeter 或 bin/jmeter.sh,设置 JVM_ARGS="-Xms2G -Xmx8G -XX:MaxMetaspaceSize=512m"(按机器内存合理设置)
- 适当增大 HTTP 客户端空闲超时(如
httpclient4.idletimeout=10000 ms),减少连接异常
- 操作系统与网络调优(压测前执行,谨慎评估线上环境):
- 文件句柄与进程数:
- 临时:
ulimit -n 102400
- 永久:
/etc/security/limits.conf 增加
* soft nofile 65536、* hard nofile 65536
* soft nproc 65565、* hard nproc 65565
- TCP 与端口:
/etc/sysctl.conf 增加
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.ip_local_port_range = 1024 65000
- 执行:
sysctl -p 生效
- 被测服务与中间件(如 Nginx)也需同步调优(如
worker_connections、keepalive_timeout)以避免成为瓶颈。