260 lines
6.6 KiB
Markdown
260 lines
6.6 KiB
Markdown
# 直播论坛 - 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):**
|
||
```bash
|
||
choco install k6
|
||
```
|
||
|
||
**Windows (使用 winget):**
|
||
```bash
|
||
winget install k6 --source winget
|
||
```
|
||
|
||
**Windows (手动安装):**
|
||
从 https://github.com/grafana/k6/releases 下载最新版本
|
||
|
||
**验证安装:**
|
||
```bash
|
||
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` - 单接口压测
|
||
|
||
### 方式二:命令行运行
|
||
|
||
```bash
|
||
# 进入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)
|
||
|
||
模拟普通用户的浏览行为,以读操作为主:
|
||
|
||
1. 首页加载(轮播图、榜单、直播列表)
|
||
2. 社区帖子列表浏览
|
||
3. 帖子详情查看
|
||
4. 评论列表查看
|
||
5. 翻页加载
|
||
|
||
**适用场景**: 测试系统的读取性能、QPS 上限
|
||
|
||
### 场景二:活跃用户互动 (scenario-active.js)
|
||
|
||
模拟活跃用户的互动行为,读写混合:
|
||
|
||
1. 浏览帖子
|
||
2. 点赞帖子
|
||
3. 发表评论
|
||
4. 评论点赞
|
||
5. 送花
|
||
|
||
**适用场景**: 测试系统的写入性能、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 |
|
||
|
||
**使用示例**:
|
||
```bash
|
||
# 测试帖子列表接口
|
||
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 参数说明
|
||
|
||
```javascript
|
||
// 阶梯式压力配置
|
||
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` 配置:
|
||
|
||
```javascript
|
||
// 示例:更高的并发压力
|
||
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:
|
||
1. 确保 k6 版本 >= 0.49
|
||
2. 检查端口 5665 是否被占用
|
||
3. 尝试手动指定端口: `k6 run --out web-dashboard=port=6666 script.js`
|
||
|
||
### Q: 错误率很高
|
||
A:
|
||
1. 检查 Token 是否有效
|
||
2. 检查服务器是否正常运行
|
||
3. 减少并发数量,逐步增加压力
|
||
|
||
### Q: 如何查看详细的错误信息
|
||
A: 脚本会在请求失败时打印错误信息到控制台
|
||
|
||
### Q: VU 数量比 Token 数量多怎么办
|
||
A: 脚本会自动循环使用 Token,不会报错。但建议 Token 数量尽可能接近 VU 数量以模拟真实场景。
|
||
|
||
## 进阶用法
|
||
|
||
### 输出到 InfluxDB + Grafana
|
||
|
||
```bash
|
||
k6 run --out influxdb=http://localhost:8086/k6 scenario-browse.js
|
||
```
|
||
|
||
### 输出到 JSON 文件
|
||
|
||
```bash
|
||
k6 run --out json=result.json scenario-browse.js
|
||
```
|
||
|
||
### 自定义 VU 数量和持续时间
|
||
|
||
```bash
|
||
k6 run --vus 100 --duration 5m scenario-browse.js
|
||
```
|
||
|
||
## 注意事项
|
||
|
||
1. **压测环境**: 建议在测试环境进行,避免影响生产数据
|
||
2. **数据清理**: 活跃互动场景会产生真实数据,压测后可能需要清理
|
||
3. **服务器监控**: 压测时同时监控服务器 CPU、内存、数据库等指标
|
||
4. **逐步增压**: 从小并发开始,逐步增加压力,观察系统表现
|
||
5. **Token 管理**: 确保 Token 的有效性和数量
|