负载测试
负载测试主要关注在并发用户数或每秒请求数方面评估系统的当前性能。
什么是负载测试
负载测试是一种性能测试,用于确定系统在正常和峰值条件下的行为。
负载测试用于确保当许多用户同时访问应用程序时,应用程序的性能令人满意。
您应该运行负载测试以:
-
评估系统在典型负载和峰值负载下的当前性能。
-
确保在对系统(代码和基础架构)进行更改时不断满足性能标准。
您可能对系统的平均流量和高峰时段的流量有所了解。在决定您的性能目标应该是什么时,此信息将非常有用,换言之,如何配置性能阈值。
假设您看到平均大约 60 个并发用户和 100 个用户在操作高峰时段。
在正常时间和高峰时间满足性能目标对您来说可能很重要,因此建议在配置负载测试时考虑到高负载 - 在这种情况下为 100 个用户。
k6 中的负载测试
请注意,此测试有一个简单的阈值。99% 请求的响应时间必须低于 1.5 秒。阈值是确保您的系统达到您为其设置的性能目标的一种方式。
sample-load-test.js
import http from 'k6/http';
import { check, group, sleep } from 'k6';
export let options = {
stages: [
{ duration: '5m', target: 100 }, // 模拟流量在 5 分钟内从 1 个用户增加到 100 个用户。
{ duration: '10m', target: 100 }, // 保持 100 个用户 10 分钟
{ duration: '5m', target: 0 }, // 减少到 0 个用户
],
thresholds: {
http_req_duration: ['p(99)<1500'], // 99% 的请求必须在 1.5 秒内完成
'logged in successfully': ['p(99)<1500'], // 99% 的请求必须在 1.5 秒内完成
},
};
const BASE_URL = 'https://test-api.k6.io';
const USERNAME = 'TestUser';
const PASSWORD = 'SuperCroc2020';
export default () => {
let loginRes = http.post(`${BASE_URL}/auth/token/login/`, {
username: USERNAME,
password: PASSWORD,
});
check(loginRes, {
'logged in successfully': (resp) => resp.json('access') !== '',
});
let authHeaders = {
headers: {
Authorization: `Bearer ${loginRes.json('access')}`,
},
};
let myObjects = http.get(`${BASE_URL}/my/crocodiles/`, authHeaders).json();
check(myObjects, { 'retrieved crocodiles': (obj) => obj.length > 0 });
sleep(1);
};
典型负载测试的 VU 图表与此类似
请注意,用户数从 0 开始,然后缓慢上升到标称值,并在此停留很长时间。斜坡下降阶段是可选的。
我们建议您始终在所有负载测试中包含一个加速阶段,因为:
- 它允许您的系统预热或自动缩放以处理流量
- 它允许您比较低负载和额定负载阶段之间的响应时间。
- 如果您使用 SaaS 云服务运行负载测试,它允许自动性能警报更好地了解您系统的正常行为。
负载测试 – 模拟正常的一天
您还可以更进一步,将负载测试配置为更接近您的正常和峰值条件。在这种情况下,您可以将负载测试配置为在一天中的大部分时间保持 60 名用户,并在操作高峰时段增加到 100 名用户,然后再减少到正常负载。
确保您没有超过正常数量的 VU - 这不是负载测试,而是压力测试
。
ramp-up-scenario.js
import http from 'k6/http';
import { check, group, sleep } from 'k6';
export let options = {
stages: [
{ duration: '5m', target: 60 }, // 模拟 5 分钟内从 1 到 60 个用户的流量增加。
{ duration: '10m', target: 60 }, // 保持 60 个用户 10 分钟
{ duration: '3m', target: 100 }, // 在 3 分钟内增加到 100 个用户(高峰时段开始)
{ duration: '2m', target: 100 }, // 在短时间内(高峰时段)停留在 100 个用户
{ duration: '3m', target: 60 }, // 在 3 分钟内减少到 60 个用户(高峰时段结束)
{ duration: '10m', target: 60 }, // 以 60 用户继续 10 分钟
{ duration: '5m', target: 0 }, // 减少到 0 个用户
],
thresholds: {
http_req_duration: ['p(99)<1500'], // 99% 的请求必须在 1.5 秒内完成
},
};
const BASE_URL = 'https://test-api.k6.io';
const USERNAME = 'TestUser';
const PASSWORD = 'SuperCroc2020';
export default () => {
let loginRes = http.post(`${BASE_URL}/auth/token/login/`, {
username: USERNAME,
password: PASSWORD,
});
check(loginRes, {
'logged in successfully': (resp) => resp.json('access') !== '',
});
let authHeaders = {
headers: {
Authorization: `Bearer ${loginRes.json('access')}`,
},
};
let myObjects = http.get(`${BASE_URL}/my/crocodiles/`, authHeaders).json();
check(myObjects, { 'retrieved crocodiles': (obj) => obj.length > 0 });
sleep(1);
};
k6 在模拟斜坡上升/斜坡下降场景方面非常灵活。
关于性能阈值的说明
每当您进行负载测试时,您都会有一些期望。
典型的期望是:
- 99% 的请求应在 5 秒内完成。
- 95% 的请求应在 1 秒内完成。
- 99% 的用户应该能够在第一次尝试时成功登录
性能阈值是一种以正式方式描述您的期望的方式,并在每次测试运行时自动评估这些期望。配置阈值后,您将看到每个阈值的通过/失败指标,您将立即知道您的系统是否满足您的期望,而无需详细分析结果。
从量小着手
如果这是您第一次运行负载测试,请从量小着手。您的应用程序和基础设施可能并不像您想象的那样坚如磐石。这些测试会迅速导致他们的应用程序(或暂存环境)崩溃。
如果您的系统在负载测试下崩溃,则意味着您的负载测试已演变为压力测试。
参考官方文档
官方文档地址: https://k6.io/docs/