第3章 主流压测工具选型:JMeter、Locust、k6、Android Profiler
移动端压测场景多样:从 HTTP API 到 WebSocket、从 NATS 到数据库连接、从单机调试到 CI 流水线。没有万能的工具,只有合适的选择。本章从原理、实现方式、运维成本、CI 集成能力四个维度深度测评四款主流工具,并给出选型决策路线图。
3.1 工具全景对比
下表列出核心差异,帮助快速定位:
| 维度 | JMeter | Locust | k6 | Android Profiler |
|---|---|---|---|---|
| 脚本语言 | GUI 图形编排 / XML | Python | JavaScript (ES6) | Java / Kotlin (集成) |
| 协议支持 | HTTP, HTTPS, JDBC, JMS, gRPC 等丰富插件 | HTTP 原生,其他协议需扩展 | HTTP, WebSocket, gRPC 内置 | CPU/内存/网络/GPU 系统级 |
| 分布式能力 | 主从架构,成熟配置 | Master + Worker,原生支持 | 内置 `k6 cloud`,本地需手动分配 | 单设备,不适用于分布式 |
| CI 集成复杂度 | 命令行 + Jenkins 插件,中等 | Python 库直接调用,简单 | 原生支持 Docker/CI,零依赖 | ADB 命令 + 脚本,轻量但局限 |
| 资源开销 | 重(JVM 堆 + GUI) | 中(Python 协程) | 轻(Go 二进制) | 轻(作为 ADB 插件) |
| 典型移动端场景 | 接口 / 后端压测 | 端到端流程压测 | 性能调优 & CI 回归 | 设备侧资源监控 |
3.2 选型决策流程
下图根据你面临的四个核心问题,引导至最合适的工具:
组合推荐:大多数移动端压测项目采用 k6 + Android Profiler 组合,前者覆盖 CI 流程,后者负责设备侧资源采集。若团队 Python 经验丰富,可用 Locust 替代 k6;若已有 JMeter 资产,则无需迁移。
3.3 快速上手指令与最小示例
3.3.1 JMeter (命令行模式)
# 非 GUI 执行 .jmx 脚本,输出结果到 CSV
jmeter -n -t test_plan.jmx -l results.csv -e -o report_dir
# 常用参数:-Jthreads=50 -Jduration=120 支持动态覆盖
3.3.2 Locust (Python 脚本)
# 最小脚本文件 locustfile.py
from locust import HttpUser, task, between
class MobileUser(HttpUser):
wait_time = between(1, 3)
@task
def get_home(self):
self.client.get("/api/v1/home")
# 命令行启动(单机模式)
locust -f locustfile.py --host=https://staging.example.com --headless -u 50 -r 10 --run-time 60
3.3.3 k6 (JavaScript 脚本)
// k6-test.js
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
vus: 50,
duration: '60s',
};
export default function () {
http.get('https://staging.example.com/api/v1/home');
sleep(1);
}
// 执行命令
k6 run k6-test.js
CI 集成关键:k6 提供
--summary-export=report.json 导出 JSON 结果,可直接被 Jenkins/GitHub Actions 解析。推荐在 CI 中设置阈值 --threshold http_req_duration[95%]<2000,失败时非零退出。
3.3.4 Android Profiler (ADB + CpuProfiler)
# 启动 CPU 采样(命令式监控,无需 GUI)
adb shell am profile start --sampling 1000 com.example.app
# 停止并拉取 .trace 文件
adb shell am profile stop com.example.app
adb pull /data/local/tmp/your.trace .
# 使用 Perfetto 命令行采集 30 秒
adb shell perfetto -c /data/misc/perfetto-configs/trace_config.pb -o /data/misc/perfetto-traces/trace
adb pull /data/misc/perfetto-traces/trace
3.4 常见踩坑与优化
- JMeter 高并发内存溢出:
原因:每个线程独立对象、监听器过多。优化:
关闭不必要的监听器,使用 Simple Data Writer 替代 View Results Tree。# 调大 JVM 堆 jmeter -Jmemory=4096 -n -t test.jmx - Locust CPU 瓶颈:
原因:Python GIL 导致 worker 间争抢。优化:每个物理核分配一个 worker,用--processes参数启动多进程。 - k6 报告格式错误:
原因:JSON 导出时中文编码问题。解决:k6 默认 UTF-8 无 BOM,确保 CI 解析工具兼容。 - Android Profiler 采样率过高拖死设备:
原因:1000Hz 采样导致系统负载飙升。优化:移动端压测场景推荐 500~1000 Hz,并配合--duration 30控制时长。