| .. | ||
| utils | ||
| config.js | ||
| README.md | ||
| run-active.bat | ||
| run-browse.bat | ||
| run-single-api.bat | ||
| scenario-active.js | ||
| scenario-browse.js | ||
| scenario-single-api.js | ||
| tokens.txt | ||
| 压测接口文档.md | ||
直播论坛 - k6 压测脚本
目录结构
k6/
├── config.js # 全局配置(API地址、压测参数)
├── tokens.txt # Token文件(每行一个)
├── utils/
│ └── helpers.js # 公共工具函数
├── scenario-browse.js # 场景一:普通用户浏览
├── scenario-active.js # 场景二:活跃用户互动
├── scenario-single-api.js # 单接口极限压测
├── run-browse.bat # Windows运行脚本(浏览场景)
├── run-active.bat # Windows运行脚本(互动场景)
├── run-single-api.bat # Windows运行脚本(单接口)
├── 压测接口文档.md # API接口文档
└── README.md # 本文件
环境准备
1. 安装 k6
Windows (推荐使用 Chocolatey):
choco install k6
Windows (使用 winget):
winget install k6 --source winget
Windows (手动安装): 从 https://github.com/grafana/k6/releases 下载最新版本
验证安装:
k6 version
2. 准备 Token
在 tokens.txt 文件中添加 Token,格式:
- 每行一个 Token
- 不需要包含
Bearer前缀(脚本会自动添加) - 以
#开头的行会被忽略(注释)
示例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxxx.yyyyy
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.aaaaa.bbbbb
Token 数量建议:
- 快速测试:10-50 个
- 正式压测:100-1000+ 个
- Token 数量可以少于 VU 数量,脚本会循环使用
运行压测
方式一:使用批处理脚本(推荐)
双击运行对应的 .bat 文件:
run-browse.bat- 普通用户浏览场景run-active.bat- 活跃用户互动场景run-single-api.bat- 单接口压测
方式二:命令行运行
# 进入k6目录
cd k6
# 场景一:普通用户浏览
k6 run --out web-dashboard scenario-browse.js
# 场景二:活跃用户互动
k6 run --out web-dashboard scenario-active.js
# 单接口压测(指定接口)
k6 run --out web-dashboard -e API_NAME=GetPosts scenario-single-api.js
# 快速测试模式
k6 run --out web-dashboard -e QUICK_TEST=true scenario-browse.js
Web Dashboard
压测启动后会自动开启 Web Dashboard:
- 地址: http://127.0.0.1:5665
- 功能: 实时查看 QPS、响应时间、错误率等指标
压测场景说明
场景一:普通用户浏览 (scenario-browse.js)
模拟普通用户的浏览行为,以读操作为主:
- 首页加载(轮播图、榜单、直播列表)
- 社区帖子列表浏览
- 帖子详情查看
- 评论列表查看
- 翻页加载
适用场景: 测试系统的读取性能、QPS 上限
场景二:活跃用户互动 (scenario-active.js)
模拟活跃用户的互动行为,读写混合:
- 浏览帖子
- 点赞帖子
- 发表评论
- 评论点赞
- 送花
适用场景: 测试系统的写入性能、TPS、并发冲突处理
注意事项:
- 会在数据库中产生真实数据(评论、点赞)
- 送花有时间限制(1小时/次),部分请求会失败
- 错误率会比纯读场景略高
场景三:单接口压测 (scenario-single-api.js)
针对单个接口进行极限压测:
支持的接口:
| 接口名 | 说明 | 类型 |
|---|---|---|
| GetPosts | 帖子列表 | GET |
| GetPostDetail | 帖子详情 | GET |
| GetPostComments | 评论列表 | GET |
| Rankings | 主播榜单 | GET |
| RankingsMore | 更多排行 | GET |
| LiveStreamers | 直播列表 | GET |
| GetUserInfo | 用户信息 | GET |
| Banners | 轮播图 | GET |
| GetMessages | 消息列表 | GET |
| LikePost | 帖子点赞 | POST |
| LikeComment | 评论点赞 | POST |
使用示例:
# 测试帖子列表接口
k6 run --out web-dashboard -e API_NAME=GetPosts scenario-single-api.js
# 测试帖子详情接口(指定帖子ID)
k6 run --out web-dashboard -e API_NAME=GetPostDetail -e POST_ID=1 scenario-single-api.js
配置说明
config.js 参数说明
// 阶梯式压力配置
stages: [
{ duration: '30s', target: 50 }, // 30秒爬升到50 VU
{ duration: '1m', target: 100 }, // 1分钟爬升到100 VU
{ duration: '2m', target: 100 }, // 保持100 VU持续2分钟
// ...
]
// 性能阈值
thresholds: {
http_req_duration: ['p(95)<500'], // 95%请求 < 500ms
http_req_failed: ['rate<0.05'], // 错误率 < 5%
http_reqs: ['rate>100'], // QPS > 100
}
修改压测强度
编辑 config.js 中的 stages 配置:
// 示例:更高的并发压力
stages: [
{ duration: '1m', target: 500 },
{ duration: '3m', target: 1000 },
{ duration: '5m', target: 1000 },
{ duration: '1m', target: 0 },
]
输出指标说明
| 指标 | 说明 |
|---|---|
| http_reqs | 总请求数 / QPS |
| http_req_duration | 请求响应时间 |
| http_req_failed | 失败请求比例 |
| vus | 当前虚拟用户数 |
| iterations | 完成的迭代次数 |
关键指标解读
- avg: 平均响应时间
- med: 中位数响应时间
- p(90): 90%的请求在此时间内完成
- p(95): 95%的请求在此时间内完成
- p(99): 99%的请求在此时间内完成
- max: 最大响应时间
常见问题
Q: 提示 "没有可用的 Token"
A: 在 tokens.txt 中添加有效的 Token
Q: Web Dashboard 打不开
A:
- 确保 k6 版本 >= 0.49
- 检查端口 5665 是否被占用
- 尝试手动指定端口:
k6 run --out web-dashboard=port=6666 script.js
Q: 错误率很高
A:
- 检查 Token 是否有效
- 检查服务器是否正常运行
- 减少并发数量,逐步增加压力
Q: 如何查看详细的错误信息
A: 脚本会在请求失败时打印错误信息到控制台
Q: VU 数量比 Token 数量多怎么办
A: 脚本会自动循环使用 Token,不会报错。但建议 Token 数量尽可能接近 VU 数量以模拟真实场景。
进阶用法
输出到 InfluxDB + Grafana
k6 run --out influxdb=http://localhost:8086/k6 scenario-browse.js
输出到 JSON 文件
k6 run --out json=result.json scenario-browse.js
自定义 VU 数量和持续时间
k6 run --vus 100 --duration 5m scenario-browse.js
注意事项
- 压测环境: 建议在测试环境进行,避免影响生产数据
- 数据清理: 活跃互动场景会产生真实数据,压测后可能需要清理
- 服务器监控: 压测时同时监控服务器 CPU、内存、数据库等指标
- 逐步增压: 从小并发开始,逐步增加压力,观察系统表现
- Token 管理: 确保 Token 的有效性和数量