固态硬盘写入性能与空闲空间的关系
写这篇文章时我还没有购买过一个固态硬盘,但却还是想写些东西,因为最近用过多个 U 盘这样的闪存设备,所以有感而发。诚然,固态硬盘是相当于多个闪存芯片进行类似于 RAID0 磁盘阵列的构造,因此性能比 U 盘要快上太多,但是由于它仍是闪存芯片,所以闪存芯片的性能局限还是会影响到它。
首先,对 SSD 的写入与 U 盘不同的地方作个简介:闪存写入时都是以“块”为单位的。每个块根据闪存型号的不同而有所不同,但通常是 512KB 到 2MB 之间。写入一块内容时,要考虑此块是否有有效数据,以及是否已擦除。如果有有效数据,必须先复制出来,然后擦除,然后将老数据与新数据合并,如果能在块中容纳则全部写入,否则写入能容纳的部分,不能容纳的部分将与后一块的数据进行合并。由于在写入前会确认总空间是足够的,因此总有一个块中有足够的空闲空间。这个空闲与占用的空间是以“页”为单位标记的,一个块中有多个页。
由上述描述可见,有时候写入的数据不到一个块的大小,但实际发生的写入可能涉及多个块。这个效应叫“写放大”。为了减少这个效应,一则 SSD 需要区分空闲与不空闲的空间。这个在 Windows 7 和 Linux 2.6.33 内核中终于有了支持,使用的叫 TRIM 指令。二是 SSD 需要把含有部分数据的块集中到一起,这样让空闲的块都能是整块整块空闲的。这个工作叫做“垃圾回收”。
如果有 10 个块,每个块都有 80% 的数据,那么对它们进行垃圾回收需要写入几个块呢?答案当然是 8 个块。另一方面,如果 10 个块,前 8 个块有 100% 的数据,后 2 个块全空,那垃圾回收需要写入几个块呢?一个都不需要,因为空闲空间已经集中在一起了。可见,数据越连续(比如之前已经做过垃圾回收了,或者写入时都是大段大段写入的,每段数据都比一个块大许多),那么垃圾回收的速度就越快。否则就越慢。另一方面,如果是 10 个块,每个块都有 50% 的数据,那么垃圾回收需要写入几个块呢?5 个块。比 8 个块好些。
一般 SSD 会预留 7%~40% 不等(具体看厂商)的空间用于垃圾回收(这些空间是 SSD 标称容量之外的)。在系统运行时,后台也会默默地自动进行垃圾回收。总之,SSD 的性能方面和硬盘一样,会有一定的随机性。垃圾回收也像硬盘上的磁盘碎片整理一样,对提高性能有帮助。现在看来,SSD 使用时也不用过多担心空间问题,只是要了解到垃圾回收是需要时间的,在写入 10GB 数据的时候,可能有着 20GB 数据需要垃圾回收(比方刚刚删了好多小文件,影响到了 20GB 的块),就不会在写入慢的时候错怪我们的小固盘了。
参考资料:
http://article.pchome.net/content-1415517-11.html
http://bbs.pceva.com.cn/thread-9314-1-1.html
http://en.wikipedia.org/wiki/Write_amplification