2. 压测工具选型:JMeter、Locust、wrk、k6、Vegeta 对比,工具安装与基础配置

在构建授权测试与 Kubernetes 资源限制调优场景库之前,选对压测工具是第一步。不同工具在协议支持、资源开销、脚本灵活性和分布式能力上差异显著。本节从五个主流工具的核心特性出发,给出选型依据,并演示基础安装与配置。

2.1 工具核心特性对比

下表从协议支持、并发模型、脚本语言、资源开销、分布式支持五个维度进行横向对比,帮助你在不同场景下快速决策。

工具 协议支持 并发模型 脚本语言 资源开销 分布式支持
JMeter HTTP/HTTPS、JDBC、JMS、gRPC(插件) 线程池 GUI 配置 + BeanShell/JSR223 较高(JVM 堆内存敏感) 原生 Master-Slave
Locust HTTP/HTTPS(核心)、gRPC(扩展) 协程(gevent) Python 中等 Master-Worker(HTTP 模式)
wrk HTTP/HTTPS 多线程 + epoll/kqueue Lua(脚本化) 极低 单机多核,无原生分布式
k6 HTTP/HTTPS、gRPC、WebSocket Go 协程 JavaScript(ES6) 低 k6-operator(Kubernetes)
Vegeta HTTP/HTTPS Go 协程 命令行 + JSON 配置 极低 无原生分布式,可配合 shell
选型建议: 授权测试通常需要动态 Token 注入和复杂断言,推荐 JMeter(GUI 调试友好)或 k6(CI/CD 集成强)。Kubernetes 资源限制调优场景下,wrk 和 Vegeta 的低资源开销更适合在容器内运行,避免压测工具本身成为瓶颈。

2.2 工具安装与基础配置

以下给出各工具在 Linux 环境下的标准安装方式及基础配置要点。所有命令均基于 Ubuntu 22.04 LTS 验证。

2.2.1 JMeter

JMeter 依赖 Java 运行环境,推荐使用 OpenJDK 17。

# 安装 OpenJDK 17
sudo apt update && sudo apt install -y openjdk-17-jdk

# 下载并解压 JMeter 5.6.3
wget https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.3.tgz
tar -xzf apache-jmeter-5.6.3.tgz -C /opt/

# 配置环境变量
echo 'export JMETER_HOME=/opt/apache-jmeter-5.6.3' >> ~/.bashrc
echo 'export PATH=$JMETER_HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

# 验证安装
jmeter --version

基础配置: 修改 jmeter.properties 中的 language=en 为 zh_CN 可切换中文界面。压测前建议调整 JVM 堆内存:HEAP="-Xms4g -Xmx8g"。

2.2.2 Locust

Locust 通过 pip 安装,Python 版本需 ≥ 3.8。

# 创建虚拟环境(推荐)
python3 -m venv locust-env
source locust-env/bin/activate

# 安装 Locust
pip install locust

# 验证安装
locust --version

基础配置: 编写 locustfile.py 定义用户行为。启动时通过 --web-host 0.0.0.0 暴露 Web UI,--headless 模式用于无界面自动化。

2.2.3 wrk

wrk 需从源码编译,依赖 make 和 gcc。

# 安装编译依赖
sudo apt install -y build-essential libssl-dev

# 克隆并编译 wrk
git clone https://github.com/wg/wrk.git
cd wrk
make

# 将二进制复制到系统路径
sudo cp wrk /usr/local/bin/

# 验证安装
wrk --version

基础配置: wrk 通过命令行参数控制并发与时长,典型用法:wrk -t12 -c400 -d30s http://target。Lua 脚本用于自定义请求和响应处理。

2.2.4 k6

k6 官方提供 APT 仓库,安装简便。

# 添加 k6 官方仓库
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69
echo "deb https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list
sudo apt update

# 安装 k6
sudo apt install -y k6

# 验证安装
k6 version

基础配置: k6 脚本使用 JavaScript,支持 __VU 和 __ITER 内置变量。通过 k6 run --vus 10 --duration 30s script.js 启动测试。环境变量可通过 -e MY_VAR=value 注入。

2.2.5 Vegeta

Vegeta 提供预编译二进制,下载即用。

# 下载最新版本(以 v12.11.1 为例)
wget https://github.com/tsenart/vegeta/releases/download/v12.11.1/vegeta_12.11.1_linux_amd64.tar.gz
tar -xzf vegeta_12.11.1_linux_amd64.tar.gz

# 移动到系统路径
sudo mv vegeta /usr/local/bin/

# 验证安装
vegeta --version

基础配置: Vegeta 采用管道式设计,典型用法:echo "GET http://target" | vegeta attack -rate=100 -duration=30s | vegeta report。支持 JSON 格式的目标文件,便于批量测试。

2.3 工具选型决策流程

以下 SVG 图展示了从场景需求到工具选择的决策路径,帮助你快速定位最适合当前任务的压测工具。

压测工具选型决策流程 压测场景需求 协议 复杂? 简单 HTTP wrk / Vegeta 复杂协议 JMeter / k6 CI/CD 集成? GUI 调试 JMeter 自动化 k6 / Locust K8s 资源限制调优场景优先考虑 wrk / Vegeta

2.4 基础配置验证清单

完成安装后,建议执行以下快速验证,确保工具基础功能正常。

  • JMeter: 启动 GUI 模式 jmeter,创建测试计划并添加 HTTP 请求默认值,运行一次空请求确认无异常。
  • Locust: 使用官方示例 locust -f examples/basic.py --headless -u 1 -r 1 -t 5s,观察终端输出。
  • wrk: 对本地服务执行 wrk -t2 -c10 -d5s http://127.0.0.1:8080,确认延迟和吞吐量数据可读。
  • k6: 运行 k6 run --vus 1 --duration 5s github.com/grafana/k6/samples/http_get.js,检查报告输出。
  • Vegeta: 执行 echo "GET http://127.0.0.1:8080" | vegeta attack -rate=10 -duration=5s | vegeta report,确认无错误。
注意: 在 Kubernetes 集群内运行压测工具时,务必为压测 Pod 设置资源限制(requests/limits),避免压测工具抢占集群资源导致测试结果失真。后续章节将详细讲解 K8s 资源限制的配置方法。

2.5 本章小结