k6 性能测试快速指南:从安装到读懂结果只要 4 步
【免费下载链接】k6A modern load testing tool, using Go and JavaScript项目地址: https://gitcode.com/GitHub_Trending/k6/k6
如果你是被要求"验证一下系统能扛多少量"却还没工具下手的开发或测试同学,可以看看 k6。它是一款用 Go 写的现代负载测试工具:虚拟用户的行为用 JavaScript 描述,负载曲线几行配置,跑完终端直接给你一份响应时间和错误率统计。前后端同学都能在半小时内看到第一个结果。
🧭 快速认识:k6 在性能测试里能干什么
一句话定位:k6 把负载测试做成了"单元测试的样子"——脚本进代码仓库、可评审、可复用,还能挂进 CI 当门禁。核心能力有五个:
- 测试即代码:用户行为写成 JS 脚本,能版本管理、拆模块,同一份脚本本地跑、CI 跑都行
- 灵活的负载模型:爬坡(stages)、恒定并发、恒定请求速率(RPS)、每 VU 固定迭代次数,覆盖大多数压测形态
- 阈值判定:把 SLO 写进脚本,比如"p(99) < 3000ms",没达标测试直接判失败
- 多协议支持:HTTP(S)、WebSocket、gRPC,还能驱动真实浏览器页面
- 结果多渠道输出:终端摘要、JSON、Prometheus、InfluxDB,或直接进 Grafana 看板
🚀 快速上手:4 步跑出第一个结果
- 安装:用包管理器(Homebrew、apt、winget 等)装,或直接下载单个二进制文件,也支持官方 Docker 镜像。装完
k6 version能打印版本号就算成功。 - 写一个最小脚本:几个文件都不需要,就一段代码:
import http from "k6/http"; export default function () { http.get("https://example.com"); }- 执行:命令行敲
k6 run script.js,测试立即开始,终端会实时滚动 VU 数和请求速率。 - 看结果:跑完后终端打印一张统计表——迭代数、req/s、平均耗时,以及 p(90)、p(95)、p(99) 分位数。
到这一步,你已经完成了一次完整的最小性能测试。
📝 完整流程实操:以爬坡压测为例
拿仓库里现成的 examples/stages.js 走一遍"设计脚本→配置负载→执行测试→读结果"四步。
第 1 步,设计脚本。模拟一个用户行为:访问一个页面,并断言返回状态码是 200。脚本只有十几行,重点是default导出的那个函数——每个虚拟用户循环执行它。
第 2 步,配置负载。在options.stages里声明三个阶段:10 秒内从 0 爬到 5 个 VU,保持 5 个 VU 跑 5 秒,再用 5 秒降回 0。总时长 20 秒,负载曲线先升、平、降,对目标系统没有突袭。
第 3 步,执行测试。k6 run stages.js。执行期间终端顶部实时显示当前 VU 数,你能直观看到爬坡过程。
第 4 步,读结果。结束后看三处:总请求量和 req/s 是否符合预期;check 的通过率(状态码断言有没有挂);http_req_duration各分位数的值。如果脚本里配了 thresholds,最后一行会给出明确的 Pass 或 Fail 结论——这是把压测结果变成"可判定结论"的关键。
🛠 实战场景:按"要解决的问题"选压测方式
不按行业分,按问题分,三种最常见的问法:
"这次上线后接口是不是变慢了?"——性能回归。把脚本放进 CI,每次部署前对预发环境跑一轮短压测,用 p(95) 阈值当门禁。结果变差了流水线直接标红,退化被挡在发布之前,而不是被用户发现。
"系统到多少 QPS 会崩?"——容量摸底。这种问题用恒定并发不合适,应该让请求速率持续往上加(k6 的 scenarios 里有专门的到达速率模型),盯着响应时间曲线找到它"膝盖弯"的拐点。那个拐点附近,就是你的容量上限参考值。
"长连接稳不稳、有没有漏?"——连接稳定性。用 WebSocket 模块让虚拟用户建立连接后长挂不关,持续几十分钟甚至几小时,观察断连率和服务端连接数是否只增不减。仓库的 examples/websockets/ 里有可直接改造的示例脚本。
⚠️ 最常见的 5 个坑和解法
- 现象:测试头几秒 p(99) 和慢请求数明显偏高。原因:连接池冷启动,TLS 握手、连接建立都发生在这几秒。解法:读数时区分冷启动段,或开头加几秒低负载的爬坡做预热,让数据只反映稳态。
- 现象:VU 加到几百,压测机 CPU 先满了,目标系统却很闲。原因:本地机器资源成了瓶颈,流量根本没送出去。解法:单机降并发,或改用 k6 的分布式模式——一个 Coordinator 把负载分发给多个 Agent,各自独立发流量再汇总指标。
- 现象:测试判了 Fail,但翻数据觉得"其实还行"。原因:阈值定得比真实 SLO 严,个别毛刺点就踩线。解法:拿阈值和真实 SLO 对一遍;读结果时把耗时和错误率放在一起看,别孤立地看某一条阈值。
- 现象:所有指标都绿,线上用户还是报错。原因:check 只断言了状态码,没验证业务内容——接口 200 但返回了空数据也算"通过"。解法:对关键字段加断言,哪怕是校验响应体长度,都能拦掉一批"假绿"。
- 现象:实际压出来的请求速率和配置的不一致。原因:闭环模型下 VU 每轮结束要 sleep,迭代节奏被你的 sleep 值锁死,并发不变、速率就会漂移。解法:要精确控制 QPS 就用到达速率类负载模型,把"每秒多少请求"当成一等配置项。
📊 结果怎么看:必看的 4 个数字
- p(90) / p(95) / p(99) 响应时间:平均值会骗人,分位数才代表大多数用户的真实体感;SLO 通常就该写成"95% 的请求在 800ms 内"这种形式
- 错误率(http_req_failed、checks 失败占比):响应慢尚可谈,报错是不可谈判的底线
- 吞吐量(req/s):说明系统实际承载了多少压力,配合负载配置判断"是不是真的压到位了"
- VU 数与迭代节奏:反向验证负载模型是否按设计执行,排上面第 5 个坑就靠它
读法上有个顺序:先看错误率有没有超线,再看分位数达标没有,最后确认吞吐和 VU 曲线符合预期——三步走完,这次测试才算"有效读数"。
🧩 进阶与生态:接下来去哪
脚本的全部配置项和 JS 模块 API,以 README 里指向的官方文档为准,覆盖安装、协议、阈值、场景等所有主题。想抄作业,examples/ 目录按主题放了一整套可运行脚本:gRPC 调用、浏览器自动化、加密接口、secrets 管理都有。想理解分布式执行怎么工作的,docs/design/ 里的设计文档讲了 Coordinator 与 Agent 的协作细节。k6 还有活跃的扩展生态,缺哪个协议或输出格式,大概率有人已经写过扩展。
k6 的入门门槛比图形化工具高一点——你得会写几行 JS——但换来的是:测试可以被评审、被复用、被自动化调度。给你个明确的第一步:clone 仓库(https://gitcode.com/GitHub_Trending/k6/k6)后装好 k6,用 examples/stages.js 对你手上任意一个测试环境跑一遍。看到终端里 VU 曲线爬上去的那一刻,你就上手了。
【免费下载链接】k6A modern load testing tool, using Go and JavaScript项目地址: https://gitcode.com/GitHub_Trending/k6/k6
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考