压力测试

压力测试的需求

在编写与其他进程/组件交互的有状态系统时,可能会引入一些 bug,而这些 bug 在系统处于负载状态之前可能不会出现。这些 bug 是由不正确的假设、差一错误或细微的计时问题引起的。这些错误很难提前检测到,因为它们是由系统层之间复杂的有状态交互造成的。

压力测试通过为系统同时生成大型工作负载来揭示这些交互中的错误。如果工作负载产生意外错误,开发者可以从根本上修复此问题,然后编写涵盖该特定交互的测试。

我们的基础架构还有一个用于运行压力测试的专用构建器 core.x64-stress。此构建器将每次压力测试最多运行 22 小时。

客户端库

Rust 压力测试库

我们提供了一个用于编写压力测试的 Rust 客户端库。如需查看使用该库编写测试的指南,请点击此处

概念

开发者可以编写压力测试来创建环境,并生成可在该环境中无限期运行随机工作负载的参与者。

执行者

执行者负责在环境中执行操作。操作者应执行对环境造成压力的操作。它可以通过以下两种方式之一来实现此目的:

  • 与被测系统(工作负载生成)交互。

  • 故意破坏被测系统(故障模拟)。

Actor Runner

Actor Runner 是 Actor 的薄封装容器,负责无限期地运行 actor。运行程序由环境为每个操作者创建,并在单独的线程上运行。运行程序反复指示其操作者执行单个操作并返回结果。

环境

环境的责任是:

  • 存储测试所需的全局状态。

  • 提供测试的退出条件。

  • 提供在整个测试期间运行的执行者。

  • 当执行方请求时,重置全局状态。

压力测试只会创建一个在整个测试期间持续存在的环境。测试编写者必须定义一个环境并将其提供给压力测试框架。

环境可以存储存在时间比被测系统的每个实例更长的全局对象。例如,如果在由 VMO 支持的块设备上运行文件系统测试,请将该 VMO 存储在环境中,这样一来,即使操作者使块设备崩溃,VMO 也仍然保持不变,并可用于重置状态。

环境为框架提供了多个运行程序,每个运行程序都包含一个可执行操作的执行者。

重置时,环境必须更新全局状态和每个操作方的连接。