什么是存储测试?类型 Concepts & 例子

⚡ 智能摘要

存储测试验证应用程序是否将其数据写入正确的目录,并拥有足够的磁盘空间以避免意外终止,同时测量底层存储在实际负载下的响应速度。

  • 💾 也被称为: 存储性能测试,因为速度和正确放置同样重要。
  • ⚠️ 为什么它的事项: 存储速度慢会导致响应时间慢、查询运行时间长,以及应用程序可用性降低。
  • 🧩 三种类型: 应用测试、应用模拟和基准测试,各自都有其自身的活动。
  • 📏 核心指标: IOPS、延迟、吞吐量和队列深度,总是应该放在一起考虑,而不是单独考虑。
  • 🧪 运行原理: 确定目标,确定数据集大小,选择合理的读/写组合,然后逐步增加负载。
  • 🛠️ 工具: 合成 I/O 生成器可以生成文件复制命令永远无法生成的可重复数字。
  • 🚫 常见错误: 监控错误的服务器,跳过ping 缓存清除和忽略处理器利用率。

存储测试教程,涵盖类型、概念和常见错误

什么是存储测试?

存储测试 是一种软件测试类型,用于验证被测软件应用程序是否将相关数据存储到适当的目录中,以及是否有足够的空间来防止因磁盘空间不足而导致的意外终止。它也被称为 存储性能测试.

这项技术属于该学科的非功能性范畴:与其他形式的 非功能性测试它没有说明某个功能是否能产生正确的答案,而是说明了随着数据量和 I/O 压力的增长,系统是否还能继续产生答案。

为什么要进行存储测试?

存储是大多数应用程序访问的最慢层,因此存储方面的弱点会反映到其他所有方面。以下四个原因表明,专门的存储测试周期是必要的。

  • 存储速度慢意味着响应时间慢、查询运行时间长以及应用程序可用性低。
  • 存储速度慢会增加服务器基础设施维护的负担。
  • 在部署之前,找出系统的实际存储极限很有帮助。
  • 了解硬件设备更换或升级时系统的反应很有帮助。

下图将存储测试置于该背景下——应用程序、文件系统和物理设备都位于同一路径上,路径上的任何延迟都会影响用户。

存储测试概览,展示了应用程序如何通过文件系统将数据写入存储设备。

存储测试的类型

采用了三种方法,它们的主要区别在于工作负载与实际应用程序的相似程度。

  • 应用测试: 在类似生产环境的条件下,使用示例查询进行应用程序测试。
  • 应用模拟: 使用与目标应用程序行为类似的标准软件进行测试。
  • 标杆: 使用标准基准测试软件进行测试,该软件可以生成合成的、可重复的工作负载。

第一种方法给出了最真实的结果,但可移植性最差;第三种方法给出的数据可以在不同设备和供应商之间进行比较,但对于应用程序本身的运行情况却鲜有说明。

通用测试 Concepts 参与存储测试

这三种类型分别对应着不同的活动,总结如下。

存储测试的类型 常见存储测试活动示例
应用测试 比较 OLTP 响应时间
比较批处理运行时间
比较持续流媒体速率
应用模拟 测试数据库的峰值存储 IOPS
测试数据流环境的峰值存储吞吐量
测试消息传递或其他单线程应用程序的存储延迟
标杆测试 测试数据损坏

存储测试的关键指标

存储结果以少量数字的形式呈现。单独解读其中任何一个数字都极易得出错误结论,因为它们之间存在相互影响的关系。

米制 它测量什么 在最关键的地方
IOPS 每秒完成的读写操作次数,与数据大小无关。 事务型数据库和小规模随机写入
延迟 从开始到完成一次 I/O 操作所需的时间 消息传递和单线程应用程序路径
生产能力 每秒传输的数据量,通常以 MB/s 为单位。 批量运行、备份和流式工作负载
队列深度 同时发出的待处理请求数量 任何必须反映真实并发性的运行

队列深度尤其值得关注。一次只发出一个请求虽然能准确计算出单次请求的延迟,但会人为地降低 IOPS 和吞吐量,这就是为什么设备在测试中看起来很慢,而在生产环境中却很快,反之亦然的原因。

如何执行存储测试

存储测试的可靠性取决于其运行条件。以下步骤可确保结果可重复。

  • 步骤 1)明确目标。 确定此次运行的目的是验证数据库就绪情况、寻找吞吐量上限,还是比较两台设备。每个目标都对应不同的工作负载,混用不同的目标会产生无法参考的数据。
  • 步骤 2)根据实际情况确定数据集的大小。 工作集小到足以放入缓存,这衡量的是缓存容量,而不是存储空间。数据量应与生产数据量相匹配,或者至少远大于缓存容量。
  • 步骤 3)选择读/写混合模式。 在同一设备上,随机访问和顺序访问的行为截然不同,70/30 读写混合模式和只写突发模式也是如此。混合模式应取自生产监控数据,而非默认值。
  • 步骤 4)设置队列深度和线程数。 这些参数控制到达设备的并发量,因此请将它们与每个结果一起记录下来——没有记录这些参数的数字是无法重现的。
  • 步骤 5)清除缓存并进行预热。 在运行之间删除服务器和设备缓存,然后丢弃第一个时间间隔,以便比较稳定状态的数字而不是首次接触时的数字。
  • 步骤 6)运行足够长的时间。 短时间运行会掩盖固态硬盘写入缓冲区耗尽后出现的写入悬崖现象。而长时间运行则会将其暴露出来。
  • 步骤 7)监控整个堆栈。 捕获处理器利用率、内存和网络以及存储计数器,以免将其他地方的瓶颈误判为存储限制。
  • 步骤 8)重复并比较。 多次运行相同的配置并保留日志;只有与存储的基线相比,才能看出不同构建版本之间的性能差异。

由于任何负载驱动测量都适用相同的规范,因此这些测量通常会一起计划。 性能测试 并且安排在发布候选版本冻结之前。

存储测试工具

工具分为两类,大多数团队都需要这两类工具。

  • 合成I/O生成器。 实用程序,例如 FIOIometer 和 sysbench 会发出精确描述的工作负载——块大小、读/写混合、队列深度和持续时间都已声明,因此可以在另一台设备上完全重复运行。
  • 应用层加载工具。 例如司机 JMeter 对应用程序本身进行测试,以便存储看到真实用户创建的相同访问模式,包括合成工具无法重现的查询计划和索引行为。

Opera测试系统计数器完善了整个系统概览。无论负载是由什么工具产生的,存储数据都必须与处理器、内存和网络计数器一起读取——多种存储测试技术,包括 基准测试 和 容量测试需要依靠这种全栈视图来正确解释结果。

执行存储测试时的错误

大部分无效存储结果 trac回到少数可避免的错误。

  • 监控错误的服务器性能,因此这些数字描述的并非正在测试的机器。
  • 未先清除服务器缓存就比较存储设备,这样衡量的是内存而不是磁盘。
  • 测试期间忘记监控处理器利用率,这会将处理器瓶颈隐藏在存储性能下降的表象之下。
  • 使用文件复制命令测试存储性能,这些命令是单线程的、缓存辅助的且不可重复的。

常见问题

容量测试 存储测试会随着应用程序数据量的增长而增加,并观察其性能是否下降。存储测试针对的是底层设备,测量数据的写入和读取速度。

应用程序写入的每个位置:数据目录、日志和临时文件夹、上传目标和归档路径。每个位置都需要检查文件是否写入正确位置,以及可用空间是否正确显示。

指标保持不变,但增加了预置 IOPS 限制、突发流量补偿和噪声邻居。运行时间应足够长,直至突发流量补偿耗尽,否则测量值反映的是临时允许值而非稳定状态值。

机器学习模型会建立正常的 IOPS 和延迟曲线基线,并在超出阈值之前标记出偏离正常值的运行情况。这些模型还能预测容量增长,从而在生产环境中提前预测磁盘耗尽的情况,而不是等到问题出现才发现。

GitHub 副驾驶 能够快速生成作业文件、缓存清除包装器和结果解析脚本。测试人员仍然需要提供块大小、队列深度和持续时间,因为这些数据来自生产监控,而不是模板。

这是一个有效的测试用例,并非意外。应用程序应该发出警告,优雅地降级并记录该情况,而不是终止运行。从磁盘空间不足的状态中恢复属于…… 恢复测试.

通常情况下,它们的缓存状态、队列深度或运行长度会有所不同。设备状态也很重要——刚格式化的固态硬盘写入速度比已经多次写入的固态硬盘要快。

性能测试人员通常会运行测试,基础设施或数据库管理员则提供设备配置和生产环境访问模式。只有当双方都认可工作负载的真实性时,测试结果才具有说服力。

总结一下这篇文章: