断电时 SSD 元数据损坏是如何发生的?我能将其最小化吗?

断电时 SSD 元数据损坏是如何发生的?我能将其最小化吗?

注意:这是有没有办法可以保护 SSD 不因断电而损坏?。我在那里得到了很好的信息,但它基本上集中在三个方面,“获得 UPS”、“获得更好的驱动器”或如何处理 Postgres 可靠性。

但我真正想知道的是,我是否可以采取任何措施来保护 SSD 免受元数据损坏,尤其是在旧写入时。回顾一下问题。这是启用了写入缓存的 Kingston 消费级 SSD 上的 ext4 文件系统,我们看到了以下问题:

  • 具有错误权限的文件
  • 已成为目录的文件(例如,toggle.wav 现在是一个包含文件的目录)
  • 已成为文件的目录(不确定内容..)
  • 含有乱码数据的文件

如果驱动器发生故障时或发生故障前不久正在写入数据,则问题较少。这确实是一个问题,但也是意料之中的事情,我可以用其他方式处理。

更大的令人惊讶和问题是,在磁盘上最近未写入的区域(即一周或更早之前)发生了元数据损坏。

我试图理解这种事情在磁盘/控制器级别是如何发生的。发生了什么?SSD 是否会定期“重新平衡”并移动块,即使我正在其他地方写入?像这样:

在此处输入图片描述

然后,在重写 D 时会出现断电。可能在块 1 上还留有一些碎片,在块 2 上也留有一些碎片。但我不知道它是否以这种方式工作。或者也许还有其他事情发生……?

总而言之 - 我想了解这种情况是如何发生的,以及我是否可以做些什么来在操作系统级别缓解该问题。

注意:“获得更好的 SSD”或“使用 UPS”在这里不是有效的答案 - 我们正在努力朝这个方向发展,但我必须面对现实,并利用我们现有的资源找到最佳结果。如果这些磁盘和 UPS 都没有解决方案,那么我想这就是答案。

参考:

SSD 驱动器的 ext3 分区上突然断电后的文件系统损坏是“预期行为”吗? 这与我们的类似,但不清楚他是否遇到了我们所遇到的问题。

编辑:我还读过有关 ext4 的问题,可能会出现断电问题。我们的系统已记录日志,但我不知道其他情况。

防止断电时 ext4/Linux 驱动器上的数据损坏

http://www.pointsoftware.ch/en/4-ext4-vs-ext3-filesystem-and-why-delayed-allocation-is-bad/

答案1

有关意外断电后如何发生元数据损坏的信息,请查看我的另一个回答在这里。

禁用缓存可以显著降低传输过程中数据丢失的可能性;但是,根据您的 SSD,静态数据仍然面临损坏的风险。此外,它要求大量的性能损失(禁用私有 DRAM 缓存后,我看到 500+ MB/s 的 SSD 写入速度仅为 5 MB/s)。

如果你不信任你的 SSD,唯一的“解决方案”(或者说变通方法)是使用端到端校验文件系统,如 ZFS 或 BTRFSRAID1/镜像设置:通过这种方式,任何最终的单设备(元)数据损坏都可以通过运行检查/清理从另一侧镜像恢复。

答案2

最好的办法是禁用磁盘上的写缓存,方法是告诉磁盘不要进行写缓存(查看 hdparm 和 smartctl 选项并希望磁盘遵守它们),并使操作系统不使用 sync 和 dirsync 等挂载选项缓冲写入。

答案3

您描述的元数据损坏是文件系统元数据,而不是(内部)SSD 元数据。SSD 通常不理解文件系统元数据,因此很可能不仅元数据,而且数据也会损坏 - 只是不那么明显。

有很多机制可以导致这种情况,以下是其中一些:

  • SSD 在 RAM 中存储大量数据,而这些数据(几乎所有消费级驱动器上的数据)在断电时都会丢失。有些驱动器几乎会随机丢弃数据,而另一些驱动器则试图提供一致的状态,丢失写入,但按时间顺序回滚写入。许多驱动器也会忽略刷新请求。根据驱动器固件的优劣,这可能不会导致实际损坏,因为文件系统可以处理在提交之前最近写入的某些数据丢失模式。这可能是您看到的损坏类型。
  • MLC(TLC 等)闪存芯片在一个单元中存储多于一位的信息,这些额外的位通常存储在不同的时间。断电可能会损坏单元的内容,进而可能损坏很久以前写入的旧数据,这些数据恰好已经存储在该单元中。这是静态数据损坏,没有文件系统可以处理这种情况。有些消费级驱动器“保证”不会发生这种损坏,但这种情况很少见。

相关内容