欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一些flash memory/SSD的基础知识 博客分类: Storage Flash读书CacheBlog

程序员文章站 2024-03-23 17:17:34
...

本文出自: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