闪存存储的性能与传统磁盘的差异,是众所周知的事情。但是,闪存颗粒在物理层面可靠性和稳定性的问题往往被有意或无意地忽视。那么,针对闪存存储的性能优势和持久性劣势应该采取什么样的解决机制?当前文件系统设计与闪存存储结合存在哪些问题?同时闪存存储在不同的文件系统中具备哪些应用模式和特点 ?这些问题一直困扰着关注闪存与文件系统应用的朋友。
作为DTCC本年度的白金赞助商之一,闪存领域领导性厂商Greenliant亚太营销副总裁李炫辉分析指出,在过去,闪存与文件系统这两个方面是不搭界的事情。因为闪存存储更关注物理介质以及集成电路与底层访问控制,文件系统更关注对上层的应用提供存储的功能和特性。但是,正如CPU多核技术带来操作系统和应用采用多线程/进程并发机制提升性能一样,闪存介质的出现也对文件系统应用有所影响和变化。因此,首先需要从了解闪存存储的底层特性、实现机制以及优劣势,扬长避短,利用现有文件系统和闪存优化的文件系统,充分发挥闪存存储的优点,一步一步地解决现在面临的问题。
你所知道的闪存特性和架构是什么样子?
在回答这个问题之前,我们必须搞清楚一个常识问题:现在谈论闪存和固态硬盘的概念实际上不太一样,凡是使用Flash Memory的都叫闪存,实际上后者只是一个封装的状态,固态硬盘可以封装Flash Memory也可以是非Flash Memory,目前大部分闪存厂商采用的都是Flash Memory的固态盘, 一般都把固态盘叫闪存,闪存也叫固态盘,所以也统称闪存。
除了闪存以外,还有其它多种快速存储技术,如DRAM ,NVRAM, MRAM and Spin-Torque(自旋力矩磁阻式随机存取内存), Carbon Nanotube( 碳纳米管 ), Phase Change Memory(相变内存), Memristor ( 忆阻器 )等等。
决定快速存储大规模应用的主要因素是量产规模、稳定性以及经济性,有量产规模才能提供可能,有了量产规模才能对闪存稳定性和性能进行验证, 再就是经济性如何体现,这些因素决定了快速存储大规模应用。当前,闪存主要用于IO性能加速环境,如数据库加速、虚拟化、延时敏感型应用、Server SAN或SDS、大数据处理等等方面,也是从2010年左右,闪存才开始大规模应用。
那么闪存物理特性的优劣表现在哪些方面呢?
从闪存物理性来看,闪存谈论最多的就是SLC,MLC,它们分别是Single-Level Cell 单层单元和Multi-Level Cell多层单元的缩写,Cell就是一个物理单元,有固定隔离栅和浮动隔离栅,进行计数时候,是电子打到浮动隔离栅产生电位,电位变化形成数据00、01、11、10等,当进行操作,就是要电子进行击穿,在进行改变的时候,将电子通过引槽流出Cell,并产生变化。
闪存为什么有擦写次数限制呢?当进行数据擦写,电子流出时候,物理隔离栅就会变薄,变薄到一定程度就没有绝缘的机制了,电子进入就会漏掉,那么就会坏掉,就出现闪存擦写次数的问题。
当前NAND Flash面临的挑战主要是耐久性、数据保持性、读写干扰、制造工艺缺陷,耐久性受制于闪存颗粒的擦写次数,同时数据保持性是指闪存将数据存在一个Cell中,仍然存在电子泄漏和电子辐射造成数据丢失情况。读写干扰是指对一个Cell进行读写操作时对临近的Cell也会产生干扰。制造工艺也存在不同的品质。另外,SLC比MLC品质要好,Cell都一样,但前者只有两个状态位,后者有4个状态位,那么后者读写数据的擦写次数要增加,寿命自然会缩短。
当前SSD主要使用NAND Flash,属于非易失性存储介质,成本比较低。物理特性不容易改变,那么如何优化显得很重要。
有一个情况需要指出,对于半导体厂商而言,在不断降低制程,密度越来越高,工艺控制难度增加,造成NAND Flash可靠性随制造工艺减小而降低,如擦写次数降低,大容量闪存里面就更容易出现错误。这也就是当前闪存厂商开始更专注 3D NAND 制程工艺的原因。
明白了闪存的物理特性之后,你们清楚闪存与磁盘到底存在哪些区别呢?
闪存的性能与磁盘系统的对比毋庸置疑,前者是电子驱动,后者是机械驱动,闪存的性能是磁盘的几十倍到上百倍,但是在可靠性和稳定性层面,闪存和磁盘却有很大的差异,例如磁盘性能随时间变化不会有变动,15000转硬盘十年以后还是15000转,而闪存存储则随时间和数据擦写量增长存在波动和衰减;闪存在擦写次数方面有限制,但磁盘没有限制;在MTBF方面磁盘可以到200万小时,而闪存则与擦写次数密切相关。当前阻碍闪存大规模应用于企业级应用的主要问题不是性能,而是闪存设备的可靠性,如何在闪存产品的生命周期内保证山村的可靠和性能无衰减是关键。
如何提升闪存可靠性和保障性能无衰减,则需要在闪存设备的架构设计方面下功夫。闪存控制器是闪存设备的核心,是联系主机和NAND Flash的桥梁,闪存控制器的管理功能包括了: Error-correcting code (ECC校验)、RAID保护机制、Wear leveling(磨损平衡)、Bad block mapping(坏块管理)、Read/write disturb management(读写干扰管理)、Garbage collection(垃圾收集)等。
与此同时,闪存控制器也有其它定制化功能,如加密、安全擦除或自毁、压缩或去重方面。
由于NAND Flash的工艺不能保证NAND的Memory Array在其生命周期中的可靠性,因此在NAND的生产中及使用过程中会产生坏块。为了检测数据的可靠性,在应用NAND Flash的系统中一般都会采用一定的坏区管理策略,而管理坏区的前提是能比较可靠的进行坏区检测。
NAND ECC校验机制比较复杂,由行校验、列校验 组合而成,当出现多位错误时候,可以通过ECC 校验恢复。常用的ECC算法有Hamming、Reed-Solomon码、BCH、LDPC等,和使用颗粒类型相关。SLC一般采用Hamming校验,MLC一般采用Reed-Solomon码或BCH可以实现多位纠错,LDPC一般针对3D NAND校验。
常见的闪存卡ECC模块设计,采用集中式ECC引擎设计,即在板卡的闪存控制器中集成1个或2个ECC引擎处理ECC校验。当数据写入NAND Flash时,会由ECC引擎生成ECC校验码,然后和数据一起写入后端的闪存颗粒。当读取时候,系统从颗粒里面读出数据和ECC校验码,如果验证一致就送出数据,如果发现数据和ECC校验码不一致,则需要通过ECC校验获得正确数据,然后写回后送出数据。这种架构设计比较简单,成本比较低,但是我们知道,当Flash设备随着使用时间和数据量的增长,坏块会逐渐增加,会产生大量的ECC Error,这时候由于ECC引擎成为系统瓶颈,设备性能和可靠性会大幅度下降,对应用性能和数据安全带来影响。
如何消除性能衰减和可靠性下降的问题,这就需要在架构设计方面进行创新。Greenliant在闪存设备架构上实现了分布式ECC 设计架构, 在每一个NAND Package中都封装一个闪存控制器里面。这样就避免了前面所讲的性能衰减和可靠性下降的问题。同时为了防止闪存颗粒故障造成数据丢失,在架构上还实现了板载硬件RAID的功能。
还有一个需要注意的区别:闪存与磁盘系统的物理地址映射有很大不同。
在磁盘里面逻辑块地址LBA和物理块地址PBA是一一对应的,磁盘只要写的是这个LBA那么磁盘就一直会访问这个地址,那么就存在热点;对于闪存盘来说,由于存在擦写次数的限制,则会通过磨损平衡算法,尽可能让每个块擦写次数相同增加闪存设备的寿命,因此同一个LBA在不同的时间会指向不同的物理地址,因此文件系统需要闪存的这种特性做优化。
磨损平衡如何改变逻辑块地址和物理地址对应?磨损平衡分为动态和静态磨损平衡以及全局磨损平衡。动态磨损平衡写一个文件时候,永远写在一个空白块,空白块写完之后再写回到之前的那些数据被删除块上,这样循环地写。但是当一个文件写到闪存上就不很少被访问,而其他块被写了几十上百次,在这种情况下块与块的擦写次数就不再一致,动态磨损平衡算法就失效了,因此我们又采用静态磨损平衡算法,就是当一个块擦写次数和临近块次数超过一定阀值时我们就作一个数据存储交换,这样保证擦写平衡。这样有利于改善闪存耐久性,会优化闪存的性能。另外我们在颗粒级别会有全局磨损平衡算法,这样进一步提升设备的可靠性。
可见,闪存可靠性通过闪存算法、控制器管理可以来优化。那么如何采用闪存存储优化系统性能?
业界目前采用闪存存储优化系统性能的方式主要包括三种:一是所有数据都放闪存存储;二是混合模式一部分热数据放闪存存储;三是缓存架构如缓存热数据在闪存存储,如分层存储将冷热数据进行存储分层。
这三种方式,都需要文件系统支持,由文件系统提供底层设备访问。从几个文件系统特点来展开分析,首先Linux Storage Stack Diagram version 3.17方面。
从这个图中,我们可以看到从文件系统到底层设备,路径很长,可见,文件系统是一个比较复杂的东西。这么长的访问路径会影响到闪存性能和延时优势的发挥。针对这个问题,2012年英特尔提出NVMe标准,可以缩短闪存设备的访问路径,提升访问堆栈性能,更能发挥闪存高IO性能和低延时优势。
而对于高并发的应用而言,基于PCIe的NVMe协议更有明显优势。对于采用AHCI协议的设备来说,每个PCIe卡的ssd访问都需要通过Core 0来管理,Core0成为该设备的控制核,这样的控制机制就会降低性能和访问的可靠性,但NVMe协议支持每个CPU Core采用独立的链路,可以提高并发性能。
Linux文件系统是基于日志的文件系统,利用闪存提高Linux的文件系统性能可以采用以下几种方式:1. 将Journal日志放置到闪存上,2. 对数据安全不要求的情况下可以禁用Journal,3.由于闪存不存在磁盘存储的巡道和IO合并的需要,也可以禁用系统针对磁盘优化的merge/rotational等参数提高性能,4. Linux最新的Btrfs文件系统基于闪存特性做了访问优化,也可以考虑采用Btrfs文件系统。
ZFS文件系统是也是一个非常有特色的文件系统,当前一些商业化存储系统就是基于ZFS文件系统。ZFS文件系统载在设计时就考虑了通过闪存进行性能加速的方法。ZFS使用日志机制,ZFS intent log (ZIL) 处理同步写,ZIL处理同步写越快,系统性能越好。将闪存作为ZFS日志设备,可以大幅提升同步写性能。ZFS的ARC(Adjustable Replacement Cache)读缓存淘汰算法可以优化系统的读性能,而SSD可以作为二级缓存L2ARC设备提供更大的缓存空间,缓存命中是最大限度能提高性能的。但是
当前比较热门的Ceph文件系统,相对于底层的文件系统而言,Ceph文件系统更像是在底层文件系统之上的文件服务,在这里我们就不做过多介绍,但是Ceph文件系统也大量采用闪存进行性能加速。
针对闪存特性和文件系统应用的分析之后,那么当前闪存存在哪些问题呢?
问题之一在于,大多数操作系统和应用的存储设计均是针对磁盘访问特性进行优化的。由于传统磁盘的机械设计,需要通过磁头的旋转进行寻道和数据IO操作,限制了磁盘的性能,因此操作系统和应用的底层算法大部分都是针对如何减少IO操作和寻道时间所设计的。
另外,磁盘存储架构下为了提高IO性能采用了缓存设计,从而又增加了复杂的数据保护的处理机制。
还有就是,应用的并发度也限制了利用了闪存。
当前有些研究机构通过透明地绕过文件系统使用非易失性存储器,在高并发的压力下将闪存设备的性能提升7倍以上。
来自SNIA最新的技术思路, 利用NVMe标准访问协议,针对闪存设备特性来设计存储访问机制。例如利用基于闪存设备的对象存储结构,让应用直接访问底层闪存设备;再有通过闪存优化的文件系统,提供上层的文件访问;对于一些应用提供核心层的闪存优化的块访问机制等等。
另外,出于成本的考虑,有些客户将闪存设备作为磁盘的缓存,通过将SSD作为传统磁盘的读写缓存以加速IO性能,这种使用方式其实会加速设备磨损,因为利用LFU,LRU,MRU等缓存算法,会带来大量的碎片IO操作,造成读也是写的情况,加速了SSD设备的磨损。
李炫辉根据业界趋势包括Greenliant的发展情况,对闪存做了一个很有意思的展望,他指出,未来闪存随着经济性越来越好,可靠性设计的逐步完善,那么面向NVMe闪存设备的访问机制将会成为闪存应用的现实,针对NVMe闪存设备会做成一体化的架构。(阿明)