告别JMeter!我用 k6 5 分钟完成高并发压测

为什么选择 k6,而不是JMeter。

曾经我也用 JMeter 做压测------拖拽组件、配置线程组、调试监听器......看似图形化,实则繁琐低效。直到遇见 k6:一个用 JavaScript 写脚本、命令行一键运行、天然集成 CI/CD 的现代压测工具。

选择 k6,不是因为它"取代"了 JMeter,而是因为它解决了 JMeter 在"开发者工作流"中的痛点

  • 脚本难维护 → 用 JS 写,Git 友好
  • 资源消耗大 → 轻量高效
  • CI 集成麻烦 → 命令行原生支持
  • 监控复杂 → 一键对接 Grafana

如果你也厌倦了 JMeter 的笨重配置,k6 能让你用写代码的方式,5 分钟完成一次高并发压测。

快速安装

  • macOS:brew install k6

  • Linux(Debian/Ubuntu):

    • 添加仓库密钥与源,执行 sudo apt-get install k6
bash 复制代码
sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69

echo 'deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main' | sudo tee /etc/apt/sources.list.d/k6.list

sudo apt-get update && sudo apt-get install k6
  • Windows(Scoop/WSL):

    • scoop install k6 或在 WSL 内安装
  • 验证安装

bash 复制代码
k6 version

# 输出:k6.exe v1.4.0 (commit/a9f9e3b28a, go1.25.4, windows/amd64)

核心概念

  • VU(Virtual User):虚拟用户,模拟真实用户行为。
  • Iteration:每个 VU 执行一次 default 函数即一次迭代。
  • Options:并发数、持续时间、阈值、阶段(stages)。
  • Checks:断言,不影响请求但计入通过率。
  • Thresholds:性能阈值(如 P95 < 200ms),违反则测试失败。

第一个脚本:测试短链跳转

  • 文件:web/k6/redirect.js

  • 脚本要点:

    • 运行阶段(stages)模拟并发爬坡与回落。
    • 阈值约束 p95,防止性能回归。
    • 支持环境变量覆盖 BASE、CODES、VUS。
    • 内置 HTML 报告生成(无需额外安装)。
javascript 复制代码
import http from 'k6/http'
import { check, sleep } from 'k6'
import { htmlReport } from 'https://raw.githubusercontent.com/benc-uk/
k6-reporter/main/dist/bundle.js'
export const options = {
  stages: [
    { duration: '30s', target: Number(__ENV.VUS1 || 100) },
    { duration: '2m', target: Number(__ENV.VUS2 || 500) },
    { duration: '30s', target: 0 },
  ],
  thresholds: {
    http_req_duration: ['p(95)<300'],
    checks: ['rate>0.99'],
  },
}
const BASE = __ENV.BASE || 'http://localhost:8080'
let codes = (__ENV.CODES || '千问,腾讯技术').split(',').map(s => s.trim
()).filter(Boolean)
if (codes.length === 0) codes = ['test']
export default function () {
  const code = codes[Math.floor(Math.random() * codes.length)]
  const url = `${BASE}/${encodeURIComponent(code)}`
  const res = http.get(url, { redirects: 0 })
  check(res, { '302': r => r.status === 302 })
  sleep(Number(__ENV.SLEEP || 0.3))
}
export function handleSummary(data) {
  return { 'summary.json': JSON.stringify(data), 'summary.html': 
  htmlReport(data) }
}

脚本可以直接让ai生成大大加快压测速度

  • 运行:

    • cd web/k6
    • k6 run .\redirect.js
    • 生成 summary.html / summary.json(用浏览器打开 HTML 即可)。

压测结果分析

  • http_reqs:总请求与速率(QPS),衡量吞吐。
  • http_req_duration:总时延(p50/p90/p95);p95 是体验目标的主指标。
  • http_req_waiting:TTFB(服务端处理主耗时);若≈duration,瓶颈在服务端。
  • http_req_failed / checks:错误率与断言通过率;理想≈0%、≈100%。
  • 被违反阈值(breached thresholds):性能目标未达标的直接证据。
  • 趋势曲线:随阶段变化的延迟与吞吐,拐点暴露瓶颈(连接池/线程/队列/GC)。

HTML 报告适合单次测试查看,但长期性能趋势分析仍需对接 Grafana。

生成实时可视化报告(InfluxDB + Grafana)

目标:压测过程中就能看到并发、QPS、延迟曲线,便于定位时段性问题。

  • 准备(Docker,不装即用)

    • docker pull influxdb:1.8 && docker run -d --name influxdb -p 8086:8086 influxdb:1.8
    • docker exec -it influxdb influx -execute "CREATE DATABASE k6"
    • docker pull grafana/grafana:latest && docker run -d --name grafana -p 3000:3000 grafana/grafana:latest
  • 将 k6 写入 InfluxDB:

  • Grafana 配置:

将压测集成到 CI/CD:实现自动化性能回归

光有本地压测还不够。真正的工程实践是:每次代码提交,自动运行压测,性能下降立即告警

以 GitHub Actions 为例,在项目中添加 .github/workflows/perf-test.yml

yaml 复制代码
name: Performance Test
on:
  push:
    branches: [ main ]  # 推送到主分支时触发
jobs:
  k6:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run k6 test
        env:
          BASE_URL: https://example.com #按需修改
        run: |
          docker run -i --rm -v ${PWD}:/scripts -e BASE_URL \
            grafana/k6 run /scripts/web/k6/redirect.js

总结:k6 不是 JMeter 的替代品,而是为开发者量身打造的"性能验证工具"。它用代码代替配置,用自动化代替手动,让你在开发阶段就能发现性能问题。

参考资料

相关推荐
依_旧2 小时前
【玩转全栈】----Django基本配置和介绍
java·后端
爱可生开源社区2 小时前
SCALE | 2025 年 10 月《大模型 SQL 能力排行榜》发布
后端
radient3 小时前
Agent的"思考" - 智能体
后端·架构·ai编程
百***35513 小时前
什么是Spring Boot 应用开发?
java·spring boot·后端
梅花143 小时前
基于Django的博客系统
后端·python·django·毕业设计·博客·博客系统·毕设
Hilaku4 小时前
我为什么说全栈正在杀死前端?
前端·javascript·后端
朝新_4 小时前
【统一功能处理】SpringBoot 统一功能专题:拦截器、数据封装、异常处理及 DispatcherServlet 源码初探
java·spring boot·后端·spring·javaee
q***46524 小时前
如何使用Spring Boot框架整合Redis:超详细案例教程
spring boot·redis·后端
q***23574 小时前
在2023idea中如何创建SpringBoot
java·spring boot·后端