我禁用了 TRIM 选项,并用随机文件填充了我的 SSD,这样就不会有可用空间了。但是,当我从 bin 中删除这些文件并下载其他内容时,我这样做没有任何问题。也许我错了,但不应该有错误,因为由于禁用了 TRIM,SSD 中的整个空间仍然被占用?
答案1
总结:SSD 的物理块比逻辑块多,并且所有现代 SSD 固件在更新逻辑块的内容时都使用写时复制语义。
您误解了 SSD 固件的工作原理。
SSD 固件区分逻辑存储块,以及身体的存储块。操作系统只能看到逻辑块,而看不到物理块,并且每个逻辑块在任何给定时间点都恰好映射到零个或一个物理块。在正常运行的 SSD 上,物理块总是比逻辑块多(通常在全新 SSD 上至少多 10%)。
在内部,固件会跟踪哪些逻辑块正在使用,以及这些逻辑块映射到哪些物理块。当操作系统第一次写入逻辑块时,固件会选择一个未使用的物理块来存储数据,然后固件会记录新的块映射。但是,当操作系统重写逻辑块,固件不会就地更改物理块,而是选择一个新的未使用的物理块,在那里写入更新的数据,更新块映射,然后将旧的物理块添加到需要清理的物理块的内部列表中。
这种特殊处理在此称为“磨损均衡”,或更一般地称为“写入时复制”。这样做是为了防止闪存的单个物理块磨损过快,因为闪存存储是写入受限的(每次写入时,单个闪存单元实际上都会损坏一点点)。
大多数现代 SSD 都更进一步,跟踪每个物理块的写入次数,然后在需要写入数据时选择写入次数最少的空闲物理块。但是,这种改进的方法有一个主要限制:固件无法知道逻辑块不再使用,这意味着被删除文件的物理块不会在固件中“释放”,直到映射到它的逻辑块再次被写入,因此原本是重写的理想候选块可能实际上很长时间都不会被重复使用。您也不能通过在删除每个文件之前擦除其内容来解决这个问题,因为这只会让另一个物理块处于未使用状态,这并不能真正解决问题。
这就是 ATATRIM
命令的作用所在(以及其他存储协议中的等效命令)。它为操作系统提供了一种方式来告诉 SSD 固件“嘿,我没有在这里存储任何数据,您可以继续重复使用这个块。”但值得注意的是:
TRIM
(以及所有其他等效项)主要是建议性的。固件实际上不必对物理块做任何事情,尽管在大多数情况下逻辑被修剪的块将读回为全零、全一或(不太常见)一些固定的字节模式。- 由于以下几个原因,即使它得到支持,
TRIM
通常不是作为操作系统释放文件系统块的一部分调用(无论是删除文件还是出于其他原因)。特别是,较旧的 ATA SSD 不支持排队TRIM
命令(这使得这种内联使用可怕地这会对性能产生不利影响),并且某些设备即使在排队时也可能强制操作同步(也就是说,仍然必须等待它完成后才能处理任何其他命令),这几乎同样糟糕。 TRIM
不保证物理介质上的数据会被删除。根据 SSD 的不同,存储在相应物理块中的任何数据可能会保留一段不确定的时间,最长为写入设备导致该物理块被重写所需的时间。但是,如果不拆开并重新布线 SSD 或将其更新为使用自定义固件,则通常无法恢复已修剪区域中的数据。
答案2
不。
如果禁用 TRIM,驱动器将根据需要擦除未使用的空间。它只是不会在后台执行此操作。这通常会使写入速度变慢。
答案3
看来您误解了 TRIM 的工作原理。
计算机可以随时随地将数据写入 SSD。该区域无需事先进行 TRIM 处理。重写完全没问题,就像旋转硬盘一样。
TRIM 的作用是提前通知 SSD 某个区域不再包含有用数据,并且存储在那里的任何数据都无需维护。这样 SSD 就可以在方便的时候将其擦除。这反过来会将该磁盘空间释放到可用磁盘空间池,从而为磨损均衡机制提供更多空间来重新排列数据。
即使没有 TRIM,SSD 也完全可以正常运行 - 只不过由于磨损均衡效率低下,速度更慢,寿命更短。
答案4
Trim 不是操作 SSD 所必需的,但它可以提高性能和寿命。
首先介绍一下 SSD 的基本知识。首先要了解的是,台式机/笔记本电脑/服务器中使用的几乎所有 SSD 都是设计为直接替代磁盘的。
不幸的是,闪存虽然与磁盘相比速度非常快,但却具有两个不良特性。
- 写入和擦除的块大小不同,擦除块大小相当大。擦除块大小(我听说是几兆字节,但现在可能更大)比磁盘接口(512 字节)和文件系统(4096 字节)通常使用的块大小大得多。
- 擦除一个块会对其造成轻微损坏,这种损坏会随着时间的推移而累积,直到该块变得无法使用。
为了解决这些问题,SSD 内部的控制器将主机看到的逻辑块与闪存的物理块分开,闪存的原始容量将始终比驱动器的逻辑大小稍大,以便为控制器提供一些工作空间。
每次主机写入逻辑块时,控制器都会分配一个物理块并写入数据。如果逻辑块之前已分配给物理块,则旧关联将被破坏,旧物理块将成为垃圾。
如前所述,一个擦除块代表多个读/写块。其中一些读/写块可能是空白的,准备接收新数据,其中一些块可能代表驱动器上的逻辑数据,而另一些块则代表垃圾。
但这会产生一个问题,如果我们仅在其所有组成块都是垃圾时才擦除擦除块,则控制器可能会耗尽闪存空间,因为很大一部分块会积累大量垃圾。
为了避免这种情况,控制器必须执行“垃圾收集”,将逻辑块从包含垃圾的擦除块复制到干净的擦除块。然后可以擦除原始擦除块,从而减少闪存阵列中垃圾的总体比例。
这种垃圾收集是 SSD 控制器操作中必要但不是特别理想的部分,它占用了原本可以用来满足用户请求的带宽,并导致“写入放大”,即底层闪存看到的写入次数(以及因此的擦除次数)大于逻辑接口上的写入次数。
另一个问题是,驱动器上的某些数据通常非常静态,某些逻辑位置会保留数年甚至数十年。如果这些数据保留在相同的物理位置,那么这些位置就不会磨损,而经常更改的位置会遭遇高于平均水平的磨损率。因此,现代 SSD 控制器会不时移动高度静态的数据。
那么这与文件系统如何交互呢?传统上,当您删除文件系统上的文件时,文件系统只会在其自己的数据结构中将块标记为空闲,而不会通知驱动器。结果是驱动器上有大量块,就文件系统而言是“垃圾”,但就控制器而言却是有效数据。
正如您所发现的,这不会阻止您删除文件并写入新文件。当您下载新文件时,逻辑块会被覆盖,覆盖逻辑块的行为会释放旧的物理块,以便对其进行垃圾回收。
然而,包含有效数据的逻辑块比例越大,控制器就必须越积极地进行垃圾收集,以确保物理块仍然可用于新写入,并且驱动器必须移动的静态数据越多,以实现磨损平衡。因此,如果驱动器的控制器认为几乎每个逻辑块都包含有效数据,则控制器的工作难度最大。
这正是 TRIM 发挥作用的地方,TRIM 允许文件系统告诉驱动器一个逻辑块现在是空闲的。因此分配给用户数据的物理块的比例会下降,控制器可以更轻松地完成工作。