TRIM 是否避免了 mdadm RAID 1 对 SSD 的性能影响?

TRIM 是否避免了 mdadm RAID 1 对 SSD 的性能影响?

其他问题中已经提到,Red Hat 建议不要在 SSD 上使用 mdadm RAID 1。

Red Hat 还警告称,不建议在 SSD 上使用软件 RAID 级别 1、4、5 和 6。在这些 RAID 级别的初始化阶段,某些 RAID 管理实用程序(如 mdadm)会写入存储设备上的所有块,以确保校验和正常运行。这将导致 SSD 的性能迅速下降。

我理解这背后的原因。然而,我怀疑这是在修剪,它是专门为 mdadm RAID 1 设计的。这样可以避免这个问题吗?如果我对 TRIM 的理解是正确的,那么我相信它确实如此,但我不确定,所以我问了。

不过,TRIM 可能不适合我。我需要这个用于生产系统,而 mdtrim 看起来最多只能算是实验性的。更重要的是,我需要强加密和研究已经表明 TRIM 会突出显示驱动器中哪些部分正在使用,从而泄露过多信息。有没有办法避免性能问题,同时仍能实现强加密?我想知道是否可以进行部分 TRIM,释放一些块以提高性能,但不要释放太多,以免泄露太多信息。

我看到的一个建议是只使用每个磁盘的 80% 左右,这样在 mdadm 进行初始检查后,仍然有少量块未使用。但这些块不是会在后续使用磁盘时首先使用吗?它们仍然会很快被用完,然后我就没什么好处了,对吧?

答案1

当然,您可以使用 mdtrim 进行部分修剪(参见--reserve选项),以始终保留一些未修剪的可用空间。或者,您可以简单地使用 dd(1) 在加密的 FS 上创建一些大文件来占用一些空间,这些空间将永远不会被修剪(也不会被您使用)。我猜修剪除约 30% 的未使用空间之外的所有空间将为您带来很多性能优势,而不会对安全性造成太大影响。

您可以(如您所建议的)进行过度配置,而不是修剪(在全新或 ATA 安全擦除的 SSD 上),创建仅具有 80% 空间的分区,然后使用它。它不会“很快用完,然后您就没事了”。原因如下:

假设(为简单起见)您的磁盘有 10000 个扇区 (LBA)。当您对磁盘进行分区时,只使用其中的一半(同样为简单起见),您将只使用 LBA 0-4999,而 LBA 5000-9999 永远不会被触及。现在,驱动器中的磨损固件有两种方法可以知道哪些扇区未使用 - 您的操作系统通过 TRIM 指定的扇区和正在重写的扇区。因此,如果您第一次写入 LBA 100,它将被使用(例如在物理块 123 上)。当您第二次写入 LBA 100 时,SSD 会将其写入新位置(例如,物理块 124),然后将 LBA 100 的旧版本(即物理块 123)标记为未使用(TRIMed),因此稍后当 SSD 空闲时它可以执行垃圾收集并且(如果该擦除块中的所有其他物理块也未使用),擦除整个擦除块(这比物理写入块大得多 - 例如 512KB 对 4KB)

因此,通过将使用的 LBA 范围减少到一半,您就增加了驱动器可以使用的过度配置物理扇区的数量。它们不会被“用完”,但您需要有足够的物理扇区,以便在可用空间用完之前,它们上的碎片(同一擦除块中部分使用和部分未使用的物理块)会消失(否则,SSD 固件需要在擦除整个擦除块之前将使用的块复制到其他位置,从而导致写入放大、性能低下和 SSD 寿命缩短)

TRIM 命令仍然有用,因为它通过在需要再次写入之前标记未使用的扇区来加快该过程(并且不会丢失太多空间)(从而避免额外的写入并延长 SSD 的寿命)。

答案2

为了补充过时的答案,我最近用SSD替换了RAID1上发生故障的HDD,从我进行的实验和研究中,我发现了以下情况:

  • Linux md 自 ~2.6.39 起将 TRIM 命令传递给组成驱动器,但前提是所有驱动器都支持 TRIM 命令。
    • 对于我的 HDD+SSD RAID1,我必须失败并移除 HDD,执行 TRIM,然后执行--re-addHDD。
  • 可以使用在热块设备上完成 TRIM fstrim,然后 Linux md 会将其转发到 SSD。
  • 初始 RAID1 恢复将写入整个 SSD。
  • mdtrim 脚本仍处于实验阶段,多年来一直未更新。
  • 通过对过度写入的块使用 TRIM,可以在 SSD 固件眼中释放空间并提高性能、减少写入放大等。

相关内容