live-forum/server/k6
2026-03-24 11:27:37 +08:00
..
utils 重新推送 2026-03-24 11:27:37 +08:00
config.js 重新推送 2026-03-24 11:27:37 +08:00
README.md 重新推送 2026-03-24 11:27:37 +08:00
run-active.bat 重新推送 2026-03-24 11:27:37 +08:00
run-browse.bat 重新推送 2026-03-24 11:27:37 +08:00
run-single-api.bat 重新推送 2026-03-24 11:27:37 +08:00
scenario-active.js 重新推送 2026-03-24 11:27:37 +08:00
scenario-browse.js 重新推送 2026-03-24 11:27:37 +08:00
scenario-single-api.js 重新推送 2026-03-24 11:27:37 +08:00
tokens.txt 重新推送 2026-03-24 11:27:37 +08:00
压测接口文档.md 重新推送 2026-03-24 11:27:37 +08:00

直播论坛 - 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

压测场景说明

场景一:普通用户浏览 (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

使用示例:

# 测试帖子列表接口
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:

  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

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

注意事项

  1. 压测环境: 建议在测试环境进行,避免影响生产数据
  2. 数据清理: 活跃互动场景会产生真实数据,压测后可能需要清理
  3. 服务器监控: 压测时同时监控服务器 CPU、内存、数据库等指标
  4. 逐步增压: 从小并发开始,逐步增加压力,观察系统表现
  5. Token 管理: 确保 Token 的有效性和数量