菜单
开源

突发负载测试

突发负载测试用于验证系统在突发且大规模利用率激增的情况下是否能维持正常运行和表现。

当系统可能经历突发且大规模流量事件时,突发负载测试非常有用。这类事件的例子包括门票销售(泰勒·斯威夫特)、产品发布(PS5)、广播广告(超级碗)、流程截止日期(税务申报)和季节性促销(黑色星期五)。此外,流量激增也可能由更频繁的事件引起,例如高峰时段、特定任务或用例。

突发负载测试会在非常短或不存在的预热时间内迅速增加到极高的负载水平。通常,它没有平稳期或平稳期非常短暂,因为真实用户在这种情况下通常不会停下来做额外步骤。同样地,下降阶段也非常快或不存在,让整个过程只迭代一次。

此测试可能包含与之前测试类型不同的流程,因为突发通常不是生产环境中平均日常活动的一部分。它也可能需要对脚本中在平均负载测试中不存在的流程进行添加、删除或修改。

有时,团队应调整系统,以便在事件发生期间允许或优先分配资源给高需求流程。

Overview of a spike test

何时执行突发负载测试

当系统预期将接收到突发活动激增时,必须执行此测试。

当系统预期会出现此类行为时,突发负载测试有助于识别系统将如何表现,以及它是否能在突发负载激增中幸存下来。负载远高于平均水平,并且可能专注于与其它测试类型不同的流程集。

注意事项

准备突发负载测试时,请考虑以下几点:

  • 在此类测试中,重点关注关键流程。

    评估流量激增是否触发与其它测试类型相同或不同的流程。相应地创建测试逻辑。

  • 测试通常不会完成。

    在这些场景下,错误很常见。

  • 运行、调优、重复。

    当您的系统存在突发事件风险时,团队必须进行多次突发负载测试并调优系统。

  • 监控。

    后端监控对于此测试的成功结果至关重要。

在 k6 中进行突发负载测试

突发负载测试的主要区别在于模拟突发且极高的负载。它没有平稳(满载)持续时间,或者通常很短暂。

有时,测试可能需要一段负载平稳期。如果需要平稳期,通常也很短暂。下降阶段也可以很快或非必需,因为目标是突然增加系统的负载。

JavaScript
import http from 'k6/http';
import { sleep } from 'k6';

export const options = {
  // Key configurations for spike in this section
  stages: [
    { duration: '2m', target: 2000 }, // fast ramp-up to a high point
    // No plateau
    { duration: '1m', target: 0 }, // quick ramp-down to 0 users
  ],
};

export default () => {
  const urlRes = http.get('https://quickpizza.grafana.com');
  sleep(1);
  // MORE STEPS
  // Add only the processes that will be on high demand
  // Step1
  // Step2
  // etc.
};

在突发负载测试中,负载会迅速增加到极端水平。测试达到最大值后紧接着是下降阶段,迅速回到 0。

突发负载测试的名称来源于其负载以图形表示时的形状。

The shape of the spike test as configured in the preceding script

结果分析

在突发负载测试中需要评估的一些性能指标包括 Pod 速度、负载激增后的恢复时间、恢复正常所需时间,或过载期间关键系统流程的行为。

了解系统如何应对突发激增(如果能幸存下来)有助于优化系统,确保其在实际事件中能够正常运行。在某些事件中,负载极高,可能需要对整个系统进行优化以处理关键流程。在这种情况下,重复测试直到对系统有高度信心。