固态硬盘技术解析之垃圾回收和TRIM指令

http://www.beareyes.com.cn/2/lib/201207/06/20120706203_0.htm

这篇文章主要是解释了一下TRIM指令是为什么引入的,解决了什么问题。

如果OS需要删除文件的话,spin disk只需要标记,然后下次在这个位置直接in-place update即可,而SSD不行。如果SSD不支持TRIM指令的话,那么只有当下次OS做in-place update时候,SSD才知道某些page是被删除的,而TRIM指令可以显式地做到这点。

在机械硬盘系统中,系统可以直接请求新数据写入到旧数据存储的位置。机械硬盘可以直接覆盖旧数据。在固态硬盘中,境况有所不同。如果想让存储无用数据的块写入新数据,就需要先把整个块删除,才可以写入新的数据。固态硬盘并不具备直接覆盖旧数据的能力。

操作系统可以理解数据、结构以及数据存储的逻辑位置,但是却不能够理解存储设备的物理结构。任何一个存储系统,硬盘并不明文件的结构。硬盘只简单的知道在某一特定的扇区内写有多少字节的数据。机械硬盘和固态硬盘一样,当操作系统请求相应的逻辑地址的数据时,它们会把物理地址中的数据发送给系统。

当系统删除某个文件时候,它只是简单的在逻辑数据表内把存储要删除的数据的位置标记为可用而已。使用机械硬盘的系统根本就不需要向存储设备发送任何有关文件删除的消息,因为在将来,系统可以随时把新数据直接覆盖到无用的数据上。固态硬盘的情况就不同,当系统准备把新数据要写入那个位置的时候,固态硬盘才意识到原来这写数据已经被删除了!(无用数据。)当然,固态硬盘也可能再相同的时间内实施了垃圾回收操作,但是受到固态硬盘的结构以及其他条件的影响。

在新一代操作系统中,例如Windows 7/Windows Server 2008 R2/Linux 2.6.33/FreeBSD 8.2/Open Solaris/Mac OS X Lion,它们都加入对Trim指令的支持。这可以让操作系统在删除逻辑表中删除逻辑扇区地址的同时通知固态硬盘某些数据已经无用了。TRIM的先进性在于它可以让固态硬盘在进行垃圾回收的时候跳过移动无用数据的过程,从而不再用重新写入这些无用的数据,达到节省时间的目的。这也会减少闪存删除数据的次数,从而在写入过程中实现高性能。固态硬盘也不需要立即删除或者“垃圾回收”这些TRIM指令告知的位置了,它只是先标记这些位置的数据为“无用”即可。

支持TRIM的系统,在用户写入数据时并没有不同。但是当用户删除文件C的时候,因为系统支持了TRIM指令,固态硬盘立刻就把数据标记为“无用”,从而为接下来的垃圾回收做准备。原来存放文件C的空间,固态硬盘把其看做是可用空间。“动态预留空间”意味着固态硬盘在执行垃圾回收的过程中拥有更多的可用空间,从而整体提高性能。

在第三列中,用户写入新的文件E。尽管现在固态硬盘与不支持TRIM的硬盘闲置空间相同。区别就在于:TRIM支持的固态硬盘知道哪些数据是无用的,在垃圾回收的时候,这些无用数据可以被看成是空闲空间,从而避免把无用数据移动到其他块中。

下面是不支持TRIM指令SSD的工作过程

Pasted-Image-20231225105217.png

可以看到当向上面复写E的时候,SSD才会知道C需要删除(而不是在OS删除C的时候)。所以在此之前如果发生GC的话,C还是需要被移动的。虽然C对OS来说已经是无用的,可是SSD设备本身却不知道。如果支持TRIM指令的话,OS就可以标记C删除,并且通知SSD设备C已经删除,这样每次GC就就不用在移动C,减少数据写入量。

Pasted-Image-20231225104948.png

这将会产生三大优点:

  1. 降低写入放大。更少的数据被重写,更多的空闲空间为垃圾回收所利用。更多的空间可用也意味着不需要重新写入更多的数据。
  2. 更高的吞吐量。支持了TRIM指令,就意味着在垃圾回收阶段需要移动的数据表少,固态硬盘性能就会提升。固态硬盘吞吐量的瓶颈在于闪存。固态硬盘的最快写入速度就是闪存所能支持的最快写入速度。在执行垃圾回收过程中,由于涉及到数据的移动和写入,固态硬盘不得不要停止一些主控的数据传输。这也是为什么固态硬盘知道无用数据的优点所在,至少在垃圾回收阶段,它这些数据不在需要移动,从而节省带宽。
  3. 改善耐用性。由于不在需要重新写入无用数据,这样可以减少固态硬盘的实际写入次数。

注意:目前TRIM并不能正常工作在RAID环境中。这是因为目前RAID驱动一般都不支持TRIM。当更多的RAID厂商开始支持RAID TRIM,我们期待TRIM无乱在RAID还是正常环境下都能够为用户带来益处。