当前位置:文档之家› SSD固态硬盘的优缺点、选择要点及注意事项

SSD固态硬盘的优缺点、选择要点及注意事项

SSD固态硬盘的优缺点、选择要点及注意事项/thread-1461925-1-1.html2010-7-7 SSD固态硬盘,在较长时间的使用后,出现了读写性能下降的问题,我们现在要以我们的方式来看看如何解决这个问题,并告诉你面对市场上琳琅满目的SSD产品,应该如何选择呢。

在较早前我们在对INTEL X25-M进行的评测中我们发现,当时的主流级SSD或多或少都有些性能方面的问题,而X25-M并没有这样的问题。

而且,后来还发现,随着时间的推移,SSD的性能会出现下降的现象,而我们测试过的基于34nm MLC NAND闪存的INTEL SSD基本没有这样的现象,它们似乎对时间并不敏感。

INTEL的X25-M系列固态硬盘开启了一个新的时代,随后三星和Indilinx推出了它们的SSD控制器,性能更高,而且没有性能上的波动,我们当然要测试这些产品。

实际上,不论是普通的机械式硬盘还是基于闪存颗粒的固态硬盘,平滑的性能曲线并不足够,一个良好的固态硬盘还必须保证有较高的读写速率。

OCZ V ertex系列基于Indilinx控制器,是更大众化的选择。

性能的下降实际上来自于NAND闪存的工作原理。

你可以最少只写入4KB的数据,但是一个数据区块是128KB(或者512KB),所以当你删除数据时它们并没有真正的被删除,除非是这个区块又重新写入新的数据。

此时,会遇到一个讨厌的情况:读取-修改-写入。

也就是说,当你实际只写入4KB数据的时候,控制器(也叫主控芯片)会先读入整个区块的内容(512KB),修改其中4KB的部分,然后再整个区块写入,而不是通常认为的仅仅是简单的写入4KB的数据。

很明显的,写入512KB,而不是仅写入4KB的操作,大大拖慢了系统的速度。

我们在测试中模拟了这种最坏的情况,性能下降的幅度有些很轻微,有些很严重。

这就是我们今天这篇文章将要做的:对市场上基于Indilinx、Intel以及三星控制器的SSD 产品进行测评,以找出它们中的最强者。

不过,事情总是变化很快。

请看下面的比较图表,在运行了TRIM指令(或类似的程序等)之后,这样的差别已经大大缩小了。

看来,我们需要制订新的测试方法了。

闪存基础知识:内存的速度非常快,读写均在纳秒时间内完成。

不过内存的最大缺点是易失性,一旦掉电,其中的所有数据都会丢失(这个时间非常快,不超过一秒)。

另一方面,常用的磁性存储(例如硬盘),速度很慢,基于物理结构,有读写的操作。

目前最快的消费级硬盘读取数据的时间是7毫秒,而速度最快的CPU读取同样的数据只需要十万分之一的时间。

我们把数据存储在硬盘上的唯一原因就是因为它们便宜,而且是非易失性,即便掉电,所有的数据都还在硬盘上。

NAND闪存为我们提供了结合两者优点的选择,它们实际上是非易失性(虽然也有数据遗失的问题,不过是在十年以后),而且速度较快(数据的读写是微妙级,而不是毫秒级)。

通过对一个N沟道MOSFET插入电子充电极,就可以构造出一个基本的NAND闪存单元。

这样的闪存单元无须电力维持也可以很好地保持其中存储的数据信息。

一个闪存单元可以保存一比特(bit)的数据,当成千上万个单元同时集成进一片芯片中时,就可以保存成千上万个比特的数据了,再大的规模就是上GB存储量的NAND闪存颗粒了这些闪存单元有规律地按行和列排列,一组闪存单元称之为一个闪存页面。

目前一个页面的大小是4KB。

NAND闪存不能按比特写入,只能按页面的大小写入——也就是4KB 大小。

尽管对页面进行写入很简单,不过擦除它们就要复杂些了。

受限于MOSFET的结构限制,对于NAND闪存中保存的数据,不能按单个闪存单元擦除,只能对整个“区块”进行擦除的操作。

通常一个区块包含128个页面,也就是说,如果要对某个页面中的数据进行重新写入,实际操作是首先擦除掉这个页面和相邻的127个页面中的数据,然后再将新的数据写入到这128个页面中。

请允许我重复一遍:改写一个页面4KB的数据实际执行的是擦除和改写512KB数据的操作。

更糟糕的是,对页面的写入操作将直接影响到它的寿命。

JEDEC规定的(multi-level cell,多层单元)式闪存颗粒的极限写入次数是1万次。

为了避免闪存单元快速损耗的问题,必须在控制器中采取非常灵活的管理方法。

一个设计良好的控制器必须将写入操作分散到尽可能多的区块去完成,必须避免对相同的区块执行一遍又一遍的写入操作。

还有个必须要面对的问题是,有些存储的数据会频繁的更新,而另一些几天、几周、几个月甚至几年都不会更新。

从你电脑的角度来说,并不需要知道控制器的这些操作细节,它只是向控制器发出写入数据的指令,对写入的数据进行分摊等复杂的操作任务必须由控制器自己独立去完成。

是不是非常难以处理?不过还好,还不是完全没有办法。

深入了解计算机的硬件技术是非常抽象的,在20年前,使用电脑需要你懂得汇编语言,后来的C、C++语言在程序员和硬件之间建立了一种抽象层,从而简化了开发过程,你可以以接近书面语言的形式更有效的控制和使用硬件。

你可以编写更简单(而且更容易管理)的高水平代码,然后使用编译器优化它。

同样的原则也适用于固态硬盘。

最小的可写闪存单元是页面,实际上控制器能够直接进行写入操作的区域比单独的一个页面大得多。

今天,我们在这里介绍一个逻辑页面的概念,是NAND闪存物理页面的抽象化概念。

SSD控制器最直接的写入方法就是对页面的直接写入,在这种情况下,逻辑页面的数量等于物理页面的数量。

不幸的是,这种方法有个很大的缺憾:跟踪开销。

假如你的逻辑页面大小是4KB,而你的SSD容量是80GB,那么逻辑页面的数量将高达20,000,000个(实际产品是20,971,520个)。

你需要一个速度很快的控制器(甚至是PC级别的处理能力),来对这么多的逻辑页面进行分类处理,这么多的逻辑页面,也需要更多更快的高速缓存/缓冲处理。

这种方法的好处却是非常高的4KB写入性能。

如果你的写入操作大多数都是4KB,这种方法将产生最佳的性能。

如果控制器达不到同时控制/分类这么多逻辑页面的能力,那么就只有增加逻辑页面的大小。

一个例子是将逻辑页面增加到一个“区块”(128×4KB)大小,这大大减少了控制器需要同时进行控制/分类的逻辑页面的数目。

仍然以上面的80GB SSD为例,此时的逻辑页面数目大致为163,840个,如此少的数目可以大大降低控制器的设计和制造难度,普通的嵌入式处理器即可胜任这样的任务。

这种方法的好处是非常高的大文件顺序写入性能。

如果你有很大的文件,那么较大的逻辑页面将是最佳的处理方式。

你会发现,目前使用的数码相机,其对2MB~12MB之间大小的图像文件具有最快的写入速度,就是这个原因(它们使用了较大的逻辑页面)。

遗憾的是,连续写入性能和小文件写入性能不能同时兼顾。

请记住,对文明用语C型NAND闪存的写入速率只是读取速率的1/3左右,而且在写入小文件时,这个差距会更大。

如果你编写了一个8KB的文件需要写入,那么控制器实际会写入512KB的内容(以上面的例子,这是最小的可写入文件尺寸)。

写入放大效应大大上升。

还记得OCZ基于Indilinx Barefoot(大脚)控制器的V ertex系列SSD?它们的逻辑页面就是512KB大小。

OCZ要求Indilinx提供新的更小逻辑页面的固件,Indilinx提供了,结果就是大大改善了4KB的写入性能。

清理机制与写入放大让我们以某个餐厅举例,假定这个餐厅一共有200张桌子,一天的客流量是1000人,那么客流量与餐桌的比例就是5:1。

在每个客人走后,餐厅都需要将使用过的餐桌、碗筷等物品清理干净,以备后来的客人使用。

这也就是SSD的清理机制。

请记住SSD的清理原理:可以按页面读取和写入,但必须一次性擦除整个区块。

如果一个区块充满了无效的数据(例如文件已在系统级别覆盖),那么这个区块必须被擦除,然后才能写入。

所有的SSD硬盘都有这样的机制,那就是清除无效的区块以备下次使用。

当SSD才投入使用时,清理机制(算法)并没有真正进入实时处理的状态,使用几天、几周、几个月后,清理算法才会实时在后台进行处理。

实际上写入的情况和此图非常相似。

有数据写入时,控制器会分配一个新的区块,有效的数据和新添加的数据会写入到新的区块,旧的区块进行清理,然后将旧区块的地址信息写入“空白区块池”。

控制器将已使用的区块地址从这个池中清掉,并且添加进来新的已清理区块地址,以备下次使用。

当有写入请求时,从“空闲区块池”中给这个请求分配一个新的区块,将新区块的地址信息加到“数据区块池”。

包含无效数据的区块被清理,然后将地址信息添加到“空闲区块池”。

平均写延迟,甚至随机写延迟,都非常低。

虽然平均写延迟很低,但是最大写延迟却很高(仍然比机械硬盘低),这是什么原因?我们一直在说固态硬盘的清理机制(算法)和区块数据写入重组,它极少对性能产生显著的影响(因此有超低的平均写入延迟),但是个别情况下,这样的操作处理却产生了较明显的影响。

而这正是写入放大产生的原因。

只有较少几个区块可用于写入的情况(很极端的例子)。

在这个例子中,清理机制(算法)只能在少数几个空白区块中进行操作,具有较多无效页面的区块被选中进行清理,当这些区块被清理,其地址信息加入到“空闲区块池”中后,原有的有效数据才会被拷贝到空闲区块中,接下来才轮到新进入的数据进行写入等操作。

在最右边,你会看到接受到写入请求和将数据实际写入对应的区块中间的操作周期。

当考虑到SSD进行的清理机制时,你会看到写入数据发生的延迟,这种现象被称为写入放大。

INTEL声称,它的SSD产品具有非常低的写入放大,不过1:1的写入放大因子在现实中不太可能。

写入放大因子是指SSD控制器实际写入区块的容量总和与实际文件大小的比值。

这个因子为1时是最为完美的,也就是说,你想写入16KB的文件,SSD实际写入了16KB的文件,但现实往往是残酷的,这样的完美因子目前还是非常难于实现的。

更高的写入放大因子意味着SSD更短的寿命和更低的性能。

因此,这是个很棘手的比例因子。

数据重组与写入合并你或许记得,SSD能够获得高性能是因为采用了多个闪存芯片并行处理的缘故。

这种方式对于较大的文件很有效率,因为较大的文件更容易采用分割/并行传输的方式读取和写入在这里,我们模拟一个128KB文件的并行写入情况。

它被分割成了64KB的两个部分,然后同时写入到不同的区块中:假如我们现在读取这个文件,那么也是从这些不同的区块中同时读取,非常高效。

请记住,我们前面讲过的却是小文件的随机读写性能。

在PC上,小文件的读写是经常发生的,并且由于I/O操作的高延迟而成为一个难以解决的问题。

下面,我们就来看看在这个超微型的SSD上,写入4KB的数据会发生什么。

相关主题