企业级 NVMe 部署注意事项

Enterprise Class NVMe Deployment Considerations


最近,我在帮助一个客户解决性能优化问题时,发现了一种我从未遇到过的 NVMe 现象,尽管我已经担任首席技术官和首席数据官数十年。当我深入研究这种现象时,我了解到它在 NVMe 圈子里算是一个公开的秘密。然而,它的影响非常重大,所以我认为应该花一些时间在这篇文章中详细介绍它们。

这种现象与 NVMe 写放大和磁盘容量有关。正因如此,即使是经过良好设计且经过独立验证的 SSD 性能基准测试,最终也可能具有误导性,并可能导致企业架构团队对看似正常的负载的性能瓶颈进行调试。

问题的核心在于可用的不同类型的 SSD。它们并不完全相同。因此,在决定部署哪种 SSD 时,必须仔细考虑给定负载的使用情况和重要性。看似经济的决定很容易导致服务中断。

关于 NVMe SSD 的相关信息

SSD 可以通过串行高级技术附件 (SATA) 线缆或 PCI Express (PCIe) 接口连接到主板。NVMe 代表非易失性内存高速接口,这意味着数据在系统重启之间不会被删除。NVMe SSD 定义了所有数据都通过主板上的 PCIe 传输的事实。NVMe 驱动器比 SATA 驱动器更快。

NVMe SSD 的两个关键组件是 SSD 控制器和用于存储数据的 NAND 闪存。需要注意的是,NAND 闪存具有有限的寿命。单元在一定数量的写入后会磨损,并且驱动器会表现出自然发生的错误率。

SSD 控制器允许对 NAND 闪存进行多通道(并行)访问,从而能够快速访问大量数据。然而,每个 NAND 闪存芯片都有独特的原始位错误率 (RBER)。SSD 控制器负责纠正这些自然发生的 RBER。这意味着 SSD 控制器使用多种技术来确保从主机接收到的数据在写入或从 NAND 存储中读回时都经过完整性检查。MinIO 使用的软件机制(如位腐烂保护和擦除编码)进一步确保数据保护即使在硬件故障的情况下也能使用。

所有 NAND 闪存存储随时间的推移都会降低其可靠存储位的能力。NAND 闪存的重复编程和擦除 (P/E) 周期会导致存储单元出现坏块,迫使 SSD 控制器将坏块从流通中移除。当检测到坏块时,SSD 控制器负责用 NVMe 上可用的“备用块”替换这些坏块,这被称为超额配置 (OP)。所有 NVMe SSD 都有一部分 NAND 闪存单元是保留的(OP 的),并将被用作需要替换坏块时使用。

RBER 的自然发生现象进一步加剧了 NVMe 处理写入的方式。虽然磁性硬盘驱动器 (HDD) 将数据写入到空白区域,但 NVMe 首先擦除现有数据,然后再将新数据写入芯片。这意味着对全新的 NVMe 驱动器的写入可以在没有任何控制器功能减慢速度的情况下发生。但是,如果数据已经存在于一个块中,那么必须擦除旧数据才能重写新数据。

NVMe 驱动器只支持块重写。一个块包含多个页面。上述问题被称为写放大 (WA) 问题。写放大系数使 NVMe 驱动器的可预测性能极具挑战性。

简单来说,修改 NVMe 驱动器上的数据会比在空驱动器上简单写入产生更多的后台读写活动。这种现象也称为读写修改算法。

为了解决性能问题,驱动器制造商使用垃圾回收练习和驱动器容量超额配置的组合,以帮助保持 NAND 块空闲并可用于后续写入活动。操作系统也引入了“trim”功能来帮助提高空闲块的可用性。

我们建议我们的 NVMe 用户更加熟悉 NVMe SSD 上的磨损均衡、顺序写入和随机写入的概念,以便进一步了解写放大主题。

写放大的现实示例

大多数用于 AI/ML 用例的分析工作负载要求从数据存储库中随机获取数据,以便访问机器学习模型。基于 S3 的对象存储是现代组织访问机器学习数据的最常见方式。大多数现代企业使用 S3 访问存储在混合云环境中的数据,以运行复杂的查询并推动智能发展。

最近,我被叫来处理一个成熟的部署,该部署开始遇到性能问题。客户已经在 NVMe 上运行 MinIO 两年了,并且没有对配置进行任何重大更改。我们花了不少时间才确定根本原因(前面提到的写放大),并且涉及了硬件和软件合作伙伴。

我们发现这些问题只有在客户达到最大驱动器容量后才开始显现出来。在那个时候,他们开始遇到服务中断。服务中断可能以多种形式出现,例如分析查询超时或 Web 访问无法在合理的时间范围内完成。

具体来说,容量使用率接近或超过 80% 的 NVMe 驱动器被证明是罪魁祸首。在很多情况下,企业架构团队会删除数据以尝试管理可用空间。在手动磁盘使用管理后,某些服务开始超时。

我们发现驱动器性能(与任何特定硬件供应商无关)从每秒多个 GB 下降到只有每秒几百 MB。

在将 MinIO 完全从等式中移除并通过简单命令(如“dd”)重现问题后,我们能够确定,如果在生产部署中没有仔细考虑和遵循容量分析,那么 NVMe 驱动器上的写放大会对数据部署产生非常重大的影响。

确认我们的发现

在这一点上,我们开始联系我们所有的 NVMe 合作伙伴,以更详细地讨论这个问题。他们都知道这个问题的总体情况,并且非常愿意与我们分享数据并带我们了解问题。然后,我们与其他拥有适当部署时间的 NVMe MinIO 客户进行了交谈。他们也看到了相关的性能问题,并报告了频率增加 - 但不知道原因。

结论

以下是我们与 HW 合作伙伴一起的建议

  • 购买利用 25% 或更多超额配置的企业级驱动器。大多数企业级 NVMe 硬件制造商为此目的提供了一类特殊的驱动器。如果你正在运行关键任务工作负载,不要试图在短期内节省资金,购买合适的设备。
  • 如果你的工作负载是一次写入多次读取,你应该没问题。但是,尽量不要达到 90% 以上的驱动器利用率。在这一点上,很多事情都会让你感到痛苦,包括底层操作系统、硬件和应用程序性能。
  • 如果你的工作负载需要随机写入,请尝试利用大多数现代操作系统提供的操作系统“Trim”功能,并确保你的硬件提供适当的超额配置和积极的垃圾回收。
  • 与 MinIO 联系,我们随时为您提供帮助。

我们希望你发现这篇文章很有启发性。我们通过发现过程获得了经验,也因此变得更加聪明。