在Grafana k6中,Stage(阶段) 是负载测试脚本的核心配置概念,用于动态控制虚拟用户(VUs)的数量随时间的变化。通过定义多个阶段,用户可以模拟真实场景中的流量波动(如用户逐步增加、峰值维持、平滑退出等),从而更精准地评估系统在不同负载下的性能表现。以下是详细解析:
一、Stage的核心作用
- 动态负载模拟
每个Stage定义了目标虚拟用户数(target
) 和持续时间(duration
)。例如:
stages: [
{ duration: '30s', target: 100 }, // 30秒内从0逐步增加到100个VU
{ duration: '5m', target: 100 }, // 维持100个VU持续5分钟
{ duration: '10s', target: 0 } // 10秒内从100降至0个VU
]
这种配置避免了瞬时高并发导致的系统崩溃,更贴近真实用户访问模式。
- 性能瓶颈识别
通过分阶段加压,可观察系统在负载逐步上升时的响应时间、错误率等指标变化,定位性能拐点(如CPU瓶颈、数据库连接池耗尽)。
二、Stage的配置参数
参数 | 说明 | 示例值 |
---|---|---|
target |
阶段结束时需达到的虚拟用户数 | 100 、500 |
duration |
阶段的持续时间(支持s 秒、m 分钟、h 小时) |
"30s" 、"5m" |
gracefulStop |
(可选)阶段结束时的优雅停止时间,用于等待剩余请求完成 | "10s" |
注:若未配置
stages
,k6默认使用固定VU数(通过vus
和duration
指定)。
三、典型应用场景
渐进式负载测试(Ramp-up)
stages: [ { duration: '1m', target: 50 }, // 热身阶段:缓慢加压 { duration: '3m', target: 200 }, // 主压力阶段:持续高负载 { duration: '30s', target: 0 } // 恢复阶段:平滑退出 ]
用途:模拟用户登录早高峰、促销活动流量。
压力测试(Stress Testing)
stages: [ { duration: '2m', target: 1000 } // 快速达到极限并发 ]
用途:测试系统最大承载能力,触发熔断或降级机制。
稳定性测试(Soak Testing)
stages: [
{ duration: '10m', target: 100 },
{ duration: '8h', target: 100 } // 长时间稳定负载
]
用途:检测内存泄漏、资源缓慢耗尽问题。
四、最佳实践与注意事项
避免瞬时压力
直接启动大量VU可能导致请求突增(如vus: 1000, duration: '1s'
),引发系统拒绝服务。应通过stages
分阶段增加负载。结合其他配置项
- 与
rps
(每秒请求数)配合,精确控制吞吐量:
export const options = { stages: [...], rps: 100 // 限制每秒最大请求数 };
- 使用
thresholds
(阈值)定义性能达标标准:thresholds: { http_req_duration: ['p(95) < 500'], // 95%请求延迟需<500ms http_req_failed: ['rate<0.01'] // 错误率<1% }
- 考虑系统预热时间
在正式加压前增加低负载阶段(如{target: 10, duration: '1m'}
),避免冷启动影响(如JVM编译优化、数据库缓存预热)。
五、完整示例脚本
import http from 'k6/http';
import { check } from 'k6';
export const options = {
stages: [
{ duration: '30s', target: 50 },
{ duration: '1m', target: 200 },
{ duration: '20s', target: 0 },
],
thresholds: {
http_req_duration: ['p(95) < 1000'],
},
};
export default function () {
const res = http.get('https://api.example.com/data');
check(res, {
'status is 200': (r) => r.status === 200,
});
}
六、结果分析要点
通过stages
生成的测试报告中,需重点关注:
- 各阶段的关键指标对比:如
http_req_duration
在加压阶段是否陡增。 - 错误率变化:高负载阶段是否出现错误率峰值(如
http_req_failed
)。 - 资源利用率关联:结合Grafana监控(如CPU、内存),分析系统资源与负载的关联性。