`

一些flash memory/SSD的基础知识

阅读更多

本文出自:http://blog.csdn.net/historyasamirror/archive/2011/05/12/6416002.aspx

在前东家的时候,一直很想去尝试一下flash/SSD,可惜由于各种原因到今天也没有实现。SSD在今天越来越流行,业内的很多公司都开始尝试使用,甚至作为主要的存储媒介,从Research的角度讲,SSD更是一个重磅炸 弹,因为它颠覆了原有hard disk的一些基本假设,所以,理论上讲,原先基于hard disk的那些理论和实验都可以在SSD重新实现一回(这又能造就多少paper啊 ...)。
这两天有些空闲,找了几篇相关的论文科普了一遍,算是打些基础,希望将来有机会动手尝试。以下就是一些读书笔记,纯粹纸上谈兵。
PS:以下所提及的flash/SSD,都特指NAND flash,也是现在最常见的flash。

关于SSD的硬件原理不是这里讨论的重点(毕竟咱是软件开发人员)。唯一一点我觉着需要提及的是SSD不是hard disk这种机电式的硬件,而是电子芯片(microchip)。所以,使用hard disk最耗时间的seek time在SSD中基本上不存在。这个特性在后面会更详细的讨论。

在传统的计算机存储架构中,分了这样的几个层级:
    CPU cache
    main memory (RAM)
    hard disk
它们的IO性能自上而下递减,当然它们的造价也是自上而下的递减,但是,容量却是自上而下的递增。
在本文中,不考虑CPU cache,从main memory和hard disk 说起。这里挑选最重要的一个性能指标-latency,main memory的latency一般在100ns左右(实际中很多是几十ns),而hard disk读写一次的latency大概是10ms。(这里的100ns和10ms都不是精确数据,只表示大概的数量级,另外,hard disk的latency不考虑disk自带的buffer的影响)。
SSD一般认为是介于main memory与hard disk之间的一种存储介质:
    main memory (RAM)
    flash / SSD
    hard disk
它的latency大概是100us左右(这个值只是一般情况)。和main memory,hard disk比较:
    Disk = 100 * flash;
    flash = 1000 * memory;
    Disk = 100 * flash = 100 * 1000 memory;
所以,对于flash/SSD,一个最直观的概念,它比Disk要快上100倍。 当然,它也同样能够提供persistent storage。

有了这个直观的概念,我们再更详细的比较一下hard disk和SSD的差异:
读: 
随机读:
正如前面所述,hard disk会有一个非常讨厌的seek time,它一般需要几个ms,所以hard disk 的一次随机读被拖累到需要10ms;而SSD的random read的性能非常之棒,在100us左右。因此,在随机读的情况下,SSD要比hard disk快100倍。
顺序读:
顺序读的场景是一次读入连续的数据块,比如连续读1M的数据。这种情况两者的比较就麻烦了。hard disk的一次顺序读只需要消耗一次seek time,因此它的整体latency会大大降低;而对于SSD来说,它的顺序读和随机读是一样的,比如顺序读16K数据就相当于随机读2K*8次,和hard disk相比,优势就小多了。我手里有个数据,flash读取256KB的page,花费3.98ms,而hard disk也只需要12.85ms,差异远不到100倍。

写: 
写当然也包括了随机写和顺序写。对于hard disk来说,它的写行为和读是类似的,所以,hard disk的读和写的latency非常的接近,都是大概10ms+。
至于SSD,它的读和写就有很大差异了。首先,random write的latency要比random read的大一倍,比如random read的latency是100us的话,那么random write的latency就大概是200us了。这主要是由于SSD的硬件特性决定的。当然,虽然latency大了近一倍,但是和hard disk的random write相比,还是快很多的。
其次,顺序写的情况下,SSD也面临着和顺序读一样的问题,即它不会因为顺序的操作方式而获得额外的好处,因为,和hard disk相比,它的优势会缩小;
最后,也是最有意思的一点,over-write(覆盖写) 的情况。对于hard disk而言,覆盖写和普通的写没有区别;但是在SSD中,不存在严格意义的over-write,也就是说,SSD是不允许直接向一块已经写入数据的区域再写入数据。如果要达到over-write的效果,必须首先执行一次erase操作,将数据块的原有数据进行擦除,然后再写入新的数据。而一次erase操作,大概耗时1.5ms。这就完了吗?不,还有更惨的。比如over-write一个2K的数据,但是,一次erase操作所执行的区域(称为erase unit)可能是128K,所以,为了写入这个2K的数据,需要擦除128K的数据,再将这些数据和新的2K数据写回到SSD上。整个过程有可能导致这次write操作比在hard disk上执行还慢。

分析过后,我们可以归纳,SSD在random read的时候比hard disk快两个数量级,在执行顺序读写的时候也会比hard disk好一些,最恐怖的是出现了over-write,这种情况下SSD有可能比hard disk性能还差。

接下来,简单的回答一个有趣的问题:到底应该怎样使用SSD呢?

一种简单的做法,就是将SSD作为hard disk的替代品,抛弃hard disk,完全用SSD作为数据的持久化介质。这样做当然没什么问题,而且,基本上所有的SSD对外的接口都是block device - 和hard disk一样。所以,操作SSD和操作hard disk从操作系统上看来接口没区别。唯一可能要考虑的,就是SSD较高的出错率。这是个麻烦。

另外的更复杂的做法,就是将SSD当成memory和hard disk之间的一种新的介质,三者同时存在。这种情况下,或者将SSD作为memory的一个扩展的buffer pool,或者作为disk之外的一个persistent storage的扩展。应该选哪个呢?

文献【1】给出了答案。整个论证过程比较复杂,就不多说,直接看paper好了。简单来说,不同的系统用法不一样。File System中,文件往往是一块很大的字节流,对于文件的操作往往是将整个文件读入到内存中。一般在disk上要分配多个连续的block以存储一个文件。在这种情况下,更适合将flash当成是memory的扩展。因为当把文件都读入到flash(相当于内存)中进行操作时,一旦系统崩溃,flash中的正在修改的文件能够被写回到disk上。但是,对于Database system,flash更适用于做成disk的扩展。具体原因见paper吧。

【1】The five-minute rule twenty years later,and how flash memory changes the rules

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics