在各种固态硬盘的检测软件打开的时候,大家经常会看到一个词:TRIM。那么,这个TRIM对固态硬盘来说是什么意思呢?
什么是SSD的TRIM?
你有没有注意到,当你进入Windows10的磁盘优化时,显示的已经是“XXX正在被修剪”,,而不是过去机械硬盘的整理碎片了。
这个“修剪”,就是所谓的SSD TRIM的直译。SSD修剪是一个过程,有助于随着时间的推移继续保持固态硬盘的性能。Trim的工作原理是定期擦除不再使用的数据块。TRIM后的数据并不总是直接删除,因为需要一个复杂的过程来确定何时删除。而定期TRMI,不仅可以释放硬盘空间,还可以帮助SSD性能更好,寿命更长。
简单,是吗?然而,实际发生的事情要复杂得多——请继续阅读以了解!
至于其中的原理,我们就慢慢讲来。
根源在于固态硬盘的工作原理
要理解为什么SSD在你按下按钮时不会删除文件,我们需要快速了解一下它们的工作原理。
下图是一个比较老的SATA SSD拆开外壳后的样子,但即使是最新的M.2接口的NVME固态硬盘(再下图),在组成的组件方面也没有太大的不同。
左边的controller就是主控芯片,是一个管理所有指令、数据流、加密和其他算法的处理器。它上面是少量的DRAM缓存(低端的SSD没有),作为一个指令和数据缓存,并在驱动器上存储了一个数据位置表。
右边的两排芯片,就是NAND颗粒了。这些是存储所有数据的芯片。
在这些芯片的深处有数十亿个微小元件,称为“电荷捕获浮栅金属氧化物半导体场效应晶体管”。由于这个名字又长又难念,所以通常被称为电荷陷阱闪存(CTF),是当今SSD中最常用的存储数据的最小单元。
每个CTF作为一个单独的存储单元,被称为存储器或位单元,有三条电通路(字符选择行,字行,接地选择行)连接到它。CTF被分组在一起,首先作为一个长列(字符串,下图中的string),包含32到128个单元格。
字符串(图中的string)中的单元格共享一个共同的轨迹(比特位行,图中的bit line),用于读取存储在其中的数据。那些彼此在同一行(图中的page部分,称为“页”)上的都连接到另一个共同轨迹 (图中的word line,字行)。字符串选择行(string select line)部分和地线选择行(Ground select line)与字行一起使用,以确定是否进行读、写或擦除处理。
由字符串string和页page组成的数组,构成了所谓的块(block)。页和块的大小差异很大,前者小到4 kB,后者大到512 kB,这在很大程度上取决于NAND颗粒的制造商和型号。
而一个NAND闪存颗粒芯片将包含数千个块,而SSD本身可能包含多个NAND芯片。这些庞大而复杂的栅格轨迹和晶体管构成了每一个SSD。
当然,从原理上讲,优盘也是这样的。
页和块很重要,因为在这种结构中,所有的存储单元都共享相同的衬底——所有晶体管都建立在半导体材料的薄片封装上。
而SSD的NAND颗粒写入和擦除就出现了很奇怪的现象。
要从任何单元清除数据,需要使用高负电压,迫使存储在CFT中的任何电子流入衬底。
但从电子学的角度来讲,就形成了一个非常奇怪的现象:NAND颗粒写入非常快,因为它们写入时是按“页”为单位进行电子写入。但擦除进程会擦除数据“块”中的每个单元格(也就是该块的每个页和“字符串”),而不是其中一个。
另一个奇怪之处是,在所有存储单元都被擦干净之前,无法用新数据对存储单元进行写入。换句话说,SSD从不像传统硬盘那样直接将新数据覆盖写入旧数据。擦除必须在块这个级别进行,而写入则在页这个级别进行,这意味着对SSD进行写入比擦除要快得多。
而写入和擦除的过程每次都会损坏记忆单元,磨损晶体管内部存储电荷的层。为了提高NAND颗粒的寿命,管理它们的主控芯片,最理想的工作调度,就是循环遍历所有的块,直到每个块都使用过一次(一次写循环),然后再回到开始,重新安排每个单元写入或者擦除。
写得快,擦得慢,任何一种写入删除操作都会损坏自己——这就是NAND有颗粒寿命的原因。
而SLC、MLC、TLC、QLC,实际上就是组成每个单元的“cell”的大小不同,依次递增。所以每次擦写颗粒时,越是3D NAND化程度越高的颗粒,其实每次被擦除的块的尺寸也就越大,颗粒的寿命减少也就更快。这也是为啥以前人们为啥追求SLC和MLC这种低密度颗粒的固态硬盘的原因。
而现在TLC和QLC的普及,就在于现在的主控能够尽量接近最理想的工作调度,避免一切非必要的短期重复存储单元擦写,而是尽量均匀安排所有颗粒中的存储单元擦写负荷均衡,从而提高了SSD的实际使用寿命。
删除与垃圾回收操作:TRIM的意义来了
现在,让我们回过头来了解SSD的TRIM的意义了。
我们举个例子,一个SSD,它有4KB的页和256KB的块的规格,所以每个块有64个页。如果你想删除一个占用SSD上3056KB空间的文件,该怎么办?
该文件将占用764页,其中有11个完整的块,还有一个块被占用64页中的60个页。如何删除这个文件而不影响最后4页的晶体管寿命呢且不误删数据?因为它们可能包含其他文件的数据。
再简化一点,反映在下图,就是ABD页的数据打算删除,而CE页的数据打算保留。
解决这个问题,就以垃圾回收形式出现。被操作系统删除的文件和文件夹会被标记为不再需要,当发出删除命令时,存储在SSD的DRAM缓存(或者NAND颗粒自身的模拟SLC单元,如果SSD是无缓方案的话)中的表会被更新以反映这一点。
当NAND的固件和主控启动垃圾回收过程时,标记为需要清除的数据就会被清除。这涉及读取一个数据块,将需要保留的页复制到缓存中,然后写入一个完全空的数据块。然后删除前一个页以及标记为删除的页。
因此,此时,C和E中的数据会被拷贝到一个新的块里,那个块也会被标注为可继续进行更多写入,然后随着QPR等页面被陆续写入,块也满了,实现了数据块的不浪费写入。
而要删除ABD页的块,此时就被通知可以擦掉了,直接清空整个块。
显然,固态硬盘的垃圾回收机制对SSD的使用寿命及其整体性能都有好处。
而TRIM的意义此时就出现了:让垃圾回收变得更好(有时这两个术语会互换使用)。
这是因为如果没有TRIM,垃圾收集将不断移动所有页,压缩部分填充的块,以保持新擦除的块可用于编程——但这意味着不需要的页也将被移动,浪费时间并增加内存单元的磨损。因为TRIM明显地指出哪些页现在是垃圾,所以可以在垃圾收集期间不去管它们,并根据需要删除它们。
在发送TRIM命令之后,数据不会立即被擦除——它要么在驱动器空闲时在后台进行,要么在下一次向块写入数据时操作。使用哪种方法取决于固件和主控方案。一般来说,消费级固态硬盘方案喜欢在系统空闲时处理擦除,而企业级SSD通常在写入时处理擦除操作。
而消费级SSD“在空闲时进行TRIM”,其实对大多数人来说,就是WIN10里的磁盘优化程序默默地在后台执行“优化”,优化颗粒的存储和擦写可用性和顺序。
在某种程度上,这个过程对于SSD就像磁盘碎片整理传统机械硬盘一样,但它不是同一件事。
TRIM和碎片整理是一样的吗?
SSD的TRIM操作和机械硬盘碎片整理不是一回事。碎片整理是通过重新安排磁盘上的数据,使其以连续的方式存储在同样的扇区和磁道上。这种物理上的连续和相邻的数据放置,就可以减少读取和写入数据所需的磁头移动距离和时间量,提高机械硬盘的效率。
而TRIM用于保持SSD随时间推移的性能。固态硬盘颗粒有有限的写入周期,而在WIN7以前的操作系统里,没有TRIM机制,删除SSD上的数据后,所占用的空间不会立即恢复使用。这也是早期固态硬盘为何“越用越卡”(包括安卓手机的存储),然后土办法就是定期备份数据后执行“快速格式化”的原因。
而在有TRIM机制的操作系统(win7 SP2后和WINN10、WIN11)和现在的SSD固件中,会将该空间标记为“无效”,直到执行TRIM过程才会覆盖该空间。这个过程有助于防止驱动器变得碎片化和变慢。TRIM是由Windows自动发出的,当你永久删除一个文件时(即从回收站中删除它),TRIM命令被添加到一个队列中,并在SSD准备就绪时进行处理——什么时候准备就绪?当系统空闲时,或者你直接选择“优化”SSD时。
不过,这个TRIM队列有一个最大长度,如果它被填满了,其中一些TRIM请求将被丢弃。默认情况下,Windows计划定期重新发出TRIM命令(称之为re-TRIM)。这也是为啥WIN10和以后的系统,默认磁盘管理会将定期“优化”SSD写入到系统的计划任务中去的原因。
因为TRIM可以在垃圾回收机制启动时,指出哪些页现在是垃圾,可以在垃圾收集期间不去管它们,而把需要移动的页放到不用删除的块里,再根据需要删除垃圾页所在的块。
如果你的操作系统或SSD配置不支持TRIM,垃圾收集仍然会进行,但这个过程没有那么有效。旧数据最终会被删除,因为SSD最终会在某个时间点覆盖所有不需要的页。
对于使用Windows 7, TRIM仅支持SATA SSD;对于NVMe SSD,TRIM命令仅在Windows 8、10和11中可用。
另外,用SSD组成RAID系统通常不支持TRIM。
来源“钛师父”