

# REL12-BP03 测试可扩展性和性能要求
<a name="rel_testing_resiliency_test_non_functional"></a>

 使用负载测试等技术来验证工作负载是否满足扩展和性能要求。

 在云中，可以按需为工作负载创建生产规模测试环境。可以使用云来预置一个与预期生产环境非常接近的测试环境，而不是依赖于缩减的测试环境（这可能会导致对生产行为的预测不准确）。此环境有助于您更准确地模拟应用程序面临的现实世界条件来进行测试。

 除了性能测试工作外，还务必验证基础资源、扩展设置、服务配额和韧性设计在负载之下是否按预期运行。这种整体方法验证应用程序可根据需要可靠地扩展和执行，即使在最苛刻的条件下也不例外。

 **期望结果：**即使在峰值负载下，工作负载也会保持其预期的行为。您可以主动解决随着应用程序发展和演变而可能出现的任何与性能有关的问题。

 **常见反模式：**
+  您使用的测试环境与生产环境不太匹配。
+  您将负载测试视为单独的一次性活动，而不是部署持续集成（CI）管道不可或缺的部分。
+  您没有定义明确且可衡量的性能要求，例如响应时间、吞吐量和可扩展性目标。
+  您在不切实际或负载不足的情况下执行测试，并且无法针对峰值负载、突然激增和持续高负载进行测试。
+  您没有通过超出预期的负载限制来对工作负载进行压力测试。
+  您使用了不充分或不适当的负载测试和性能分析工具。
+  您缺乏全面的监控和警报系统来跟踪性能指标和检测异常情况。

 **建立此最佳实践的好处：**
+  负载测试有助于您在系统投入生产之前识别其潜在的性能瓶颈。在模拟生产级流量和工作负载时，您可以确定系统可能难以处理负载的领域，例如响应时间慢、资源限制或系统故障。
+  当您在各种负载条件下测试系统时，可以更好地了解支持工作负载所需的资源需求。这些信息有助于您在资源分配方面做出明智的决策，并防止资源过度配置或配置不足。
+  要识别潜在的故障点，您可以观察工作负载在高负载条件下的性能。这些信息有助于您通过酌情实施容错机制、失效转移策略和冗余措施，来提高工作负载的可靠性和韧性。
+  您可以尽早发现并解决性能问题，这有助于避免系统中断、响应时间缓慢和用户不满意所带来的代价高昂的后果。
+  在测试期间收集的详细性能数据和分析信息有助于您排查生产环境中可能出现的与性能相关的问题。这可以加快事件响应和解决速度，从而减少对用户和组织运营的影响。
+  在某些行业，主动性能测试有助于工作负载达到合规标准，从而降低受处罚或出现法律问题的风险。

 **在未建立这种最佳实践的情况下暴露的风险等级：**高 

## 实施指导
<a name="implementation-guidance"></a>

 第一步是定义全面的测试策略，该策略涵盖扩展和性能要求的各个方面。首先，根据业务需求（例如吞吐量、延迟直方图和错误率），明确定义工作负载的服务级别目标（SLO）。接下来，设计一套测试来模拟各种负载场景，范围涵盖从平均使用量到突然激增和持续的峰值负载，并验证工作负载的行为是否符合 SLO。这些测试应自动执行，并集成到持续集成和部署管道中，以便在开发过程的早期阶段发现性能回归情况。

 要有效地测试扩展和性能，请投资购买正确的工具和基础设施。这包括可以生成真实用户流量的负载测试工具、用于识别瓶颈的性能分析工具以及用于跟踪关键指标的监控解决方案。重要的是，您应该验证测试环境在基础设施和环境条件方面是否与生产环境紧密匹配，以使您的测试结果尽可能准确。为了更轻松且可靠地复制和扩展类似于生产环境的设置，请使用基础设施即代码和基于容器的应用程序。

 扩展和性能测试是一个持续的过程，而不是一次性活动。实施全面的监控和警报来跟踪应用程序在生产环境中的性能，并使用这些数据来不断完善测试策略和优化工作。定期分析性能数据来识别新出现的问题，测试新的扩展策略，并实施优化以提高应用程序的效率和可靠性。当您采用迭代方法并不断从生产数据中学习时，可以验证应用程序是否能够适应不断变化的用户需求，并随着时间的推移保持韧性和最佳性能。

### 实施步骤
<a name="implementation-steps"></a>

1.  制定明确且可衡量的性能要求，例如响应时间、吞吐量和可扩展性目标。这些要求应基于工作负载的使用规律、用户预期和业务需求。

1.  选择并配置负载测试工具，该工具可以准确地模仿生产环境中的负载规律和用户行为。

1.  设置与生产环境（包括基础设施和环境条件）紧密匹配的测试环境，来提高测试结果的准确性。

1.  创建涵盖各种场景的测试套件，范围从平均使用规律到峰值负载、快速激增和持续的高负载。将测试集成到持续集成和部署管道中，以便在开发过程的早期阶段发现性能回归情况。

1.  开展负载测试来模拟真实的用户流量，并了解应用程序在不同负载条件下的行为。要对应用程序进行压力测试，请超出预期负载并观察其行为，例如响应时间降级、资源耗尽或系统故障，这有助于确定应用程序的突破点并为扩展策略提供信息。通过逐步增加负载来评估工作负载的可扩展性，并衡量性能影响，来确定扩展限制并规划未来的容量需求。

1.  实施全面的监控和警报，来跟踪性能指标，检测异常，并在超过阈值时启动扩展操作或通知。

1.  持续监控和分析性能数据，来确定需要改进的领域。对测试策略和优化工作进行迭代。

## 资源
<a name="resources"></a>

 **相关最佳实践：**
+  [REL01-BP04 监控和管理配额](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_manage_service_limits_monitor_manage_limits.html) 
+  [REL06-BP01 为工作负载监控全部组件（生成）](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_monitor_aws_resources_monitor_resources.html) 
+  [REL06-BP03 发送通知（实时处理和报警）](https://docs.aws.amazon.com/wellarchitected/latest/reliability-pillar/rel_monitor_aws_resources_notification_monitor.html) 

 **相关文档：**
+  [加载测试应用程序](https://docs.aws.amazon.com/prescriptive-guidance/latest/load-testing/welcome.html) 
+  [AWS 上的分布式负载测试](https://aws.amazon.com/solutions/implementations/distributed-load-testing-on-aws/) 
+  [应用程序性能监控](https://aws.amazon.com/what-is/application-performance-monitoring/) 
+  [Amazon EC2 Testing Policy](https://aws.amazon.com/ec2/testing/) 

 **相关示例：**
+  [Distributed Load Testing on AWS (GitHub)](https://github.com/aws-solutions/distributed-load-testing-on-aws) 

 **相关工具：**
+  [Amazon CodeGuru Profiler](https://docs.aws.amazon.com/codeguru/latest/profiler-ug/what-is-codeguru-profiler.html) 
+  [Amazon CloudWatch RUM](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-RUM.html) 
+  [Apache JMeter](https://jmeter.apache.org/) 
+  [K6](https://k6.io/) 
+  [Vegeta](https://github.com/tsenart/vegeta) 
+  [Hey](https://github.com/rakyll/hey) 
+  [ab](https://httpd.apache.org/docs/2.4/programs/ab.html) 
+  [wrk](https://github.com/wg/wrk) 
+ [AWS 上的分布式负载测试](https://aws.amazon.com/solutions/implementations/distributed-load-testing-on-aws/)