我正在编写一个脚本,我对TRIM命令的内部工作有几个问题。 如果TRIM发出一个完全清空(清零)的块,垃圾回收器是否仍然删除块? 我希望能够在ssd上发布大块的TRIM,但是我担心这会导致对已经空的块的不必要的磨损。
另一方面,如果我不在文件系统以前使用的空块上发出TRIM(例如,文件中只包含零的部分),那么在向这些块写入有意义的数据时是否有任何开销? 换句话说,由于块已经处于“接地”状态,SSD是否“智能”足以不执行读 – 修改 – 写周期?
这个控制器是否依赖(我主要关心新的sandforce)?
贾斯汀·林恩的回答是完全正确的。 我只是想解决你的问题的另一部分。
由于NAND单元存储数据的方式,擦除(地)状态是一个而不是零。 所以一个零块在写入之前需要擦除,而一块块可以直接写入。
编辑:至于什么时候SSD需要写入一个块充满了什么发生的问题是很难回答。 即使块中没有需要擦除的数据,仍然可能存在需要擦除的元数据。 如果情况并非如此,并且块是完全可写的,则取决于SSD的GC实施。
另一种可能性是SSD足够聪明,当你写一个零填充的LBA时,它意识到不需要把数据写入NAND。 相反,它只是取消了LBA的映射,当被问及数据时它将返回零,作为未映射的LBA的默认值。 如果SandForce驱动器已经在做数据压缩和重复数据删除,那么我不会感到惊讶。 我不知道其他SSD是否这样做。
我意识到有很多可能,maybes,不知道我的答案,但没有一个SSD制造商必须遵循的一般规则,所以这是由个人决策者决定。 由于这些GCalgorithm的具体实现对于SSD性能如此重要,所以参与这些决策的人不能谈论它们。
那么,TRIM作为一个命令只是告诉SSD控制器该文件系统不再需要该块,并且当垃圾收集可用的闪存空间时,控制器可能不再担心该块。 否则SSD将不得不移动[现在删除]块,而垃圾收集。 TRIMing大块零不应该增加驱动器上的磨损,恰恰相反,在适当的TRIM实施的控制器上。 也就是说,确切的行为是依赖于控制器的,但是为了您的使用目的,我不担心TRIMing大的零块区域,如果有的话,您将节省固态硬盘,而不必复制零块地方选区。 我不是SATA协议的专家,但是从http://en.wikipedia.org/wiki/Write_amplification ,特别是http://en.wikipedia.org/wiki/Write_amplification#TRIM看来,这似乎是一个相当清晰的结论。