# 直播论坛 - 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 的有效性和数量