第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 选型决策流程

下图根据你面临的四个核心问题,引导至最合适的工具:

移动端压测工具选型流程图 需要压测的对象是什么? 后端 API / 接口 → 考虑 JMeter / k6 端到端业务流程 → 考虑 Locust / k6 设备资源 / 内存 → Android Profiler 是否要求 CI 轻量? 是 → k6 否 → JMeter 需要 Python 生态? 是 → Locust 否 → k6 直接使用 ADB 监控 始终使用 Android Profiler JMeter k6 Locust Android Profiler 选型建议 协议兼容 & CI 轻量 → k6 | Python/快速原型 → Locust 完整监控/已有 Java 团队 → JMeter | 设备资源压测 → Android Profiler 实际项目可组合使用:k6 做流程 + Profiler 做监控
组合推荐:大多数移动端压测项目采用 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 高并发内存溢出:
    原因:每个线程独立对象、监听器过多。优化:
    # 调大 JVM 堆
    jmeter -Jmemory=4096 -n -t test.jmx
    关闭不必要的监听器,使用 Simple Data Writer 替代 View Results Tree。
  • Locust CPU 瓶颈:
    原因:Python GIL 导致 worker 间争抢。优化:每个物理核分配一个 worker,用 --processes 参数启动多进程。
  • k6 报告格式错误:
    原因:JSON 导出时中文编码问题。解决:k6 默认 UTF-8 无 BOM,确保 CI 解析工具兼容。
  • Android Profiler 采样率过高拖死设备:
    原因:1000Hz 采样导致系统负载飙升。优化:移动端压测场景推荐 500~1000 Hz,并配合 --duration 30 控制时长。

3.5 小结