数据重组与写入合并
你或许记得,SSD能够获得高性能是因为采用了多个闪存芯片并行处理的缘故。这种方式对于较大的文件很有效率,因为较大的文件更容易采用分割/并行传输的方式读取和写入。
在这里,我们模拟一个128KB文件的并行写入情况。它被分割成了64KB的两个部分,然后同时写入到不同的区块中:
假如我们现在读取这个文件,那么也是从这些不同的区块中同时读取,非常高效。
请记住,我们前面讲过的却是小文件的随机读写性能。在PC上,小文件的读写是经常发生的,并且由于I/O操作的高延迟而成为一个难以解决的问题。下面,我
们就来看看在这个超微型的SSD上,写入4KB的数据会发生什么。因为4KB是最小可写入尺寸,也就是说,这个尺寸已经不能再被分割,因此它只能通过一条
通道写入。
实际上,INTEL和其他的SSD厂商已经预先猜测到这样的情况,所以在他们的产品中,小文件并不是直接写入的,而是多个小文件组合成较大的文件后,再执行分割/并行写入。
这样的处理方式并不会提高小文件随机写入的性能,因为这一切实际是被较大文件的持续写入给代替了。真正对性能产生影响的时候是在对小文件进行覆盖/重写的时候。
大文件的覆盖/重写很简单,多个区块同时被清理。
在小文件的覆盖/重写中,就不是那么简单了,在整个区块中,只有某个页面的数据需要刷新,其它页面中的数据保持不变。而且,这样的区块还不止一个。
唉,对这些分散的区块进行处理又会是个耗时的过程。如果此时再发生写入的情况,那么就会是对每个区块都进行读取/修改/写入的漫长过程。
当操作系统不支持TRIM技术的时候,对每个区块的写入操作都会有读取/修改/写入的过程,而且整个过程还有写入放大因子的不利影响。
这就是写入合并方式的缺点。
INTEL的控制器会尽力克服这样的情况,因此它的随机写入性能仍然很好。三星的控制器就没有针对这种情况处理的机制(算法)了。
现在你可以明白对整盘执行持续写入会修复碎片区块带来的不利影响了,这样的操作可以把零碎的小文件串联成一个或几个大型的“连续文件”。这同时也解释了为
什么固态硬盘的性能会随着时间下降的问题。你不用担心一定要向SSD中写入连续的大文件,实际上,你对SSD操作的文件有大有小,有连续也有分散,最后你
的操作都会被控制器进行合并然后再真正写入到SSD上。
写入寿命
还有个因素影响着SSD的性能:写入均衡。
每个MLC NAND闪存单元可写入的次数大约为1万次,超过这个次数,写入的数据就会变得不那么可靠。当然也可以使用SLC
NAND闪存单元,它们可以提供10万次的写入,但价格会立马上升到2倍。对于目前消费级别的市场来说,还是使用MLC NAND闪存单元更合适一些。
1万次的写入次数并不多,不过SSD厂商都宣称自己的产品使用寿命为1~10年。最重要的是,全部SSD厂商都宣称自己的产品比传统的机械式硬盘更可靠。
唯一的办法是赋予SSD非常聪明的算法,以及基于大量调查收集的事实:台式机用户并不总是在硬盘上进行非常大量的写入操作。
想想你现在用的硬盘吧,你多久把它们全部塞满、删除,然后重新塞满一次?INTEL估计,即便你每天向硬盘中写入20GB的数据,X25-M还可以使用至少5年的时间。实际上,20GB的写入量大大高于你日常使用中的情况。
在我的个人电脑中,操作系统和其他的一些程序占用了不到100GB的空间(基于过去两周的统计结果),然后就是每天大约7GB写入的各种数据,让我们看看下面这些数据:
|
SSD空间占用 |
| 总空间 |
256GB |
| 格式化后空间 |
238.15GB |
| 剩余空间 |
185.55GB |
| 备用空间 |
17.85GB |
如果我不再安装其他的程序,只是保持系统目前的样子,我的硬盘空间还剩余203.4GB可以用于每天7GB的写入。这意味着,大约29天后(假设SSD中
的写入分配是完美的),我会把这个SSD填满。再假设我会用7天来备份这个SSD上的所有数据和程序。那么就是说,大约36天的时间,我会用掉这1万次写
入寿命中的一次。简单的乘法算一下,就知道大约是36万天后这个SSD会挂掉。假设控制器对写入操作是完美的均衡操作,那么就是986年。实际
上,NAND闪存中的数据最多只可以保存10年左右。
这是假定了一个具有完美写入均衡算法的SSD,但正如你猜到的那样——这是不完全可能的。
写入放大因子决定了,写入的虽然是7GB的内容,但真正写入的超过了7GB的SSD区块容量。请记住,对整个区块的写入是读取/修改/写入的过程。最坏的
情况下,我只写入了4KB的文件,控制器读取了512KB的整个区块,修改其中4KB的内容,然后再写入512KB的区块,并清理掉旧的512KB区块。
虽然我只使用了262,144个区块中的一个进行写入,却同时影响到其他262,143个区块的写入寿命。
当然可以对写入均衡进行深入优化以确保每个区块都得到平均的写入,不过却是以牺牲性能为代价的。
备用空间
INTEL 80GB版本的X25-M具有85,899,345,920个字节的存储空间(80×1024^3)。
硬盘制造商却将80GB认为是800亿字节,因为他们使用了1GB=10亿字节的定义。因此,SSD厂商也使用相同的定义。现在,800亿字节其实等于74.5GB,这就是在你的固态硬盘上能够使用的空间。
操作系统只能使用800亿个字节,实际具有85,899,345,920个字节
固态硬盘实际有多少空间?80GB。操作系统让你使用多少空间?74.5GB,多出来的5.5GB哪里去了?控制器将它们作为备用空间。
INTEL的控制器是动态的,它使用剩余空间作为后备空间,直到你的文件膨胀占用更多的剩余空间。它只将非用户空间的7.5%作为自己临时的“写入均衡”(实际就是动态的备用空间),所以可以获得更好的性能。
其它的控制器也许不是动态的,但它们也可以在固态硬盘接近塞满时提供较小的性能损失。为什么INTEL如此费力获得较高的性能表现,即便这样的技术只是短暂使用?都是因为TRIM指令。
TRIM
TRIM是Windows
7中引入的专门针对SSD的新指令,这个指令很有趣,它实际上是让SSD的清理操作具有优先级的概念。在前面的那个极端例子中,当写入时只有很少的几个区
块可用时,才会将那些只有部分数据的区块清理并合并写入,操作过程中甚至动用了备用空间。当具有TRIM指令时,操作系统只是从LBA表中清理掉相关的信
息,并不执行真正的清理操作。TRIM指令告诉SSD控制器,可以排序并“规划”这些无用区块的清理工作,并将这些区块的地址信息添加到“替换区块池”
中。
一个使用中的SSD会使用备用空间来“中转”数据,大多数情况下,这个比例是7%左右。下面的图来自IBM苏黎世研究实验室:
- Write Amplification - 写入放大因子
- Spare Area - 备用空间比例
- Separate data placement - 单一数据存储
写入放大因子与备用空间比例的关系
请注意,当增大备用空间比例时,写入放大因子随之下降。为了使写入放大因子等于1,我们的备用空间需要保持在10%~30%之间,具体取决于硬盘上有多少数据是静态的。
还记得我们刚刚说过的替换区块池?下面这张图其实是假设我们有多个替换区块池,并加入了动态数据进行对比(静态数据例如安装上的程序、生成的文档等等;动态数据例如交换文件、其它随机写入等等)。如果固态硬盘只使用了单块的替换区块池,那么对备用空间的要求也越来越高。
- Mixed data placement - 混合数据存储
写入放大因子与备用空间比例的关系
我们可以看到,备用空间在30%左右时,写入放大因子甚至下降到1.0了,这是最理想的情况。
不过请记住,现在的消费级固态硬盘仅有6~7%左右的备用空间,甚至比我们在例子中的最小值10%还要小。相比之下,INTEL企业级的固态硬盘——X25-E系列,具有更多的备用空间,大约是20%左右。
TRIM指令可以帮助控制器达到类似X25-E那样较多备用空间的好处。固态硬盘上未使用的空间现在都已经被TRIM指令接管了,作为“替换区块池”使用。就像IBM的研究揭示的那样,这可以根据你的文件性质(动态或静态)大大提高固态硬盘的性能。
性能退化
更多的备用空间可以提供更好的随机读写性能,不过桌面台式机的随机工作量还没有大到能够使更多的备用空间产生明显好处的地步。而且,目前对SSD的评测都
没有测试使用中的状态,只是新盘跑跑分而已。这使得越来越多的用户只将目光盯紧SSD的价格,想从SSD产品中挑出每GB价格最低的型号。
使用TRIM指令可以把使用过的SSD性能恢复一部分,不过取决于你使用的SSD型号:
| 使用后性能下降百分比(相比新盘) |
4KB随机写入 |
2MB持续写入 |
PCMark Vantage HDD得分 |
| Intel X25-E 64GB (SLC) |
-26.1% |
+5.4% |
-9.7% |
| Intel X25-M G1 160GB (MLC) |
-35.5% |
+3.8% |
-16.7% |
| Intel X25-M G2 160GB (MLC) |
+0.7% |
+2.2% |
-15.3% |
| OCZ Agility 128GB (Indilinx MLC) |
-44.8% |
-15.0% |
+4.4% |
| OCZ Summit 256GB (Samsung MLC) |
-72.4% |
+3.0% |
-23.6% |
| OCZ Vertex EX 128GB (Indilinx SLC) |
-60.5% |
-20.8% |
+0.8% |
| OCZ Vertex Turbo 128GB (Indilinx MLC) |
-44.0% |
-15.4% |
+4.5% |
| Patriot Torqx 128GB (Indilinx MLC) |
-44.6% |
-15.6% |
+3.5% |
根据不同的情况,所有三种控制器都可以从TRIM指令中获得好处,不过随机写入性能仍然出现下降,最糟糕的是三星的RBB控制器,几乎丧失了70%的性能,三星看来更需要TRIM。
INTEL从G1到G2取得了一些显著的改善,测试的固态硬盘几乎没有丧失随机写入性能。这是因为INTEL对固件进行了微调并具有两倍大的缓存:更大的
缓存使得控制器可以更好地跟踪、组织、管理和执行清理。单纯从性能上来说,G2完全具备挑战企业级X25-E的能力。不过,X25-E的寿命更长。
Indilinx控制器的性能差距也很明显,持续写入测试下降明显,但它们却是在PCMark Vantage
HDD测试中唯一没有出现性能下降的产品。其实,PCMark
Vantage总分的差距更小一些。这可能意味着在现实世界中,Indilinx从TRIM指令中并没有得到多少的好处。这可能是由于Indilinx使
用了静态的LBA映射方案,并且只在额外的空间中保留了单一的6.25%的备用空间的缘故。
三星和INTEL在TRIM指令上获得了很大的好处。三星的表现从难堪到可以接受(这并不是指它的价格),INTEL的表现从领先到更优秀。是的,更优秀。 |
|