Facebook闪存失效大规模研究引发的深度思考

6月29日,由绿芯科技主办、阿明自媒体协办的Greenliant 2015闪存热点沙龙活动在北京举行,特别针对“闪存与应用对可靠性到底存在什么需求” 这个核心话题,展开了讨论。

 
现场邀请到来自Greenliant亚太营销副总裁李炫辉,他就《Facebook闪存失效大规模研究》论文展开一系列现场讨论的话题。《大话存储1&2》作者张冬也将带来他对该论文的独家分享。同时,本次沙龙还邀请到来自达沃时代雷迎春博士、乐生活与爱IT微信号作者也是SDS技术专家Peter Ye,以及人人网李蓓、美图杨尚刚等互联网用户和专注存储领域的专业编辑记者。
 
大家从技术层面来探讨卡耐基梅隆大学《Facebook闪存失效大规模研究》论文中提出造成闪存失效的几种原因和现象,来论述我们如何避免和消除这些潜在风险。从而提升业界对于闪存存储介质的技术认知,启发大家对于闪存技术的进一步探讨与研究。
 
Facebook闪存失效大规模研究论文提到了哪些关键点?
 
在此之前,已经有不少业界朋友发布了对该论文的看法,也有媒体发布了Facebook闪存失效大规模研究论文的观点文章,从中我们也可以发现几个关键因素影响,工作环境的温度、总线供电情况、系统级别的写入疲劳、SSD存储单元生命周期、稀疏的非连续性数据布局、存储空间占用情况,以及不可预知的其他方面。
 
不过,Greenliant亚太营销副总裁李炫辉在分析中认为,“A Large-Scale Study of Flash Memory Failures in the Field《Facebook闪存失效大规模研究》的论文题目,立足点非常好,它是在一个完整的闪存产品生命周期里面,并且在一个真实生产环境里面,去研究和发现闪存的可靠性对于现代软件以及数据中心的影响。因为很多设备厂商可能只看自己设备的情况,但是对于下游厂商如何使用自己的设备应用的情况和问题,了解不多。而且从整个生命周期去理解这个事情,是非常有意义的。”
 
实际上,在这之前,我们非常缺乏一个对于闪存规模化使用的系统性研究报告。Facebook这篇论文的研究方法也比较客观,研究时间长度跨度近4年左右。在几万台服务器上安装了数据采集的脚本,自动化采集数据。并且把所有数据又做了完整分析,在里面也讲到把数据采集到Hadoop平台上,再去生成等等。就是说时间跨度足够长、数据量足够大,所以很有代表性。 
 
在一个运行现代程序和系统软件的真实数据中心中,在闪存的整个生命周期了解闪存的可靠性特点是非常重要的。
 
需要指出的是,这个论文第一次展示了闪存SSD可靠性的大规模研究。“他们在 Facebook数据中心通过近四年和数百万次的操作小时进行数据收集来了解闪存SSD失败的性质和趋势。”
 
研究方向针对主要几个SSD的特性,一是从闪存芯片来看数据读写数量;二是数据如何与SSD地址空间映射;三是被闪存控制器复制、擦除以及丢弃的数据数量; 四是闪存板温度以及总线供电。
 
Facebook为什么能做到这样的研究?因为Facebook使用了非常多的PCIe SSD,应用到了各个业务平台之上,在这个论文中,就针对其中的6个平台进行了研究。
 
在论文中也提到了一个观点,并且这个观点在整个业界都是认可的。就是随着Flash密度的增加,在芯片层面的可靠性是降低的。大家都在谈闪存颗粒越来越便宜了,比如说20纳米只有25纳米80%的价格,16纳米大概只有20纳米70%的价格,越来越便宜了。但问题便宜是便宜了,但是可靠性会下降。这就是为什么你会看到尽管成本很高,大部分企业级产品仍然选用高制程工艺的闪存颗粒,并非低制程的工艺。
 
为什么颗粒厂商都开始注重3D NAND?原因在于 3D NAND在平面上可以采取更高制程,回到35纳米甚至40纳米的制程上,通过多层结构增加容量,提高单个晶圆产出率、降低成本。
 
加州理工在2012年专门做了研究,增加闪存密度也带来了芯片级的可靠性降低,就是制程缩小带来的可靠性下降。
    
早期在72纳米的情况下,MLC的可擦除次数可以达到1万次。比如说到了35纳米,可擦写掉到几千次了。并且这里面还有bit error rate的变化,就是擦写过程中会出现错误的比例。
 
当前,业界提到了一个现象,“SSD将于两年内突破HDD的容量/价格临界点”,这个现象也是大家所注意的。那么闪存又便宜了,是不是闪存卡、SSD盘就便宜了?不是的,消费类的产品可能会便宜,但是企业级方面会慢一些。
 
你可能不知道的Facebook论文中几个重要发现!
 
从Facebook论文探讨中,有几个重要发现需要指出:
 
 
一是SSD失败并不是单纯地随闪存芯片磨损增加。它们历经几个明显的时期,与失败如何出现和随后如何被检测到相一致。
 
二是读干扰错误并不普遍。但写一般会有影响的,因为写是要重新加电,要把电激发到cell,但读不是,读是电位感应。
 
三是跨SSD物理地址空间的稀疏逻辑数据布局(如不连续数据),需要通过大量的存 储在SSD内部DRAM缓存的metadata来跟踪逻辑地址翻译,会极大地影响SSD 失败率。“如果说你的数据布局和物理的区域布局非常分散,就是说本来我在逻辑上是连续的数值,但是在物理上是分散布局,这对损害值会大。这和我们磁盘是完全不一样的,磁盘是说我一个逻辑上连续的文件最好是分散的布局。”
 
四是高温会带来高的失败率,通过截流SSD操作看来可以极大地减少高温带来的可靠性负面影响,会带来潜在的性能下降。对此,李炫辉指出,“闪存并不是温度越低性能越高,实际上温度越低由于电子驱动性能会下降因此还需要合适的工作温度,50到55摄氏度是比较好的工作环境。既比较流畅,又没有那么高的激发态会出现电子流失。如果说太高了,可能电子流失会比较多一点。如果太低了,对于电子操作性能会下降了,所以说还不能太低。”,不过对于这个问题,“所谓限流,直接对供电进行限制,相对来讲就是降低散热,降低散热实际上就变相地降低温度了。通过限流可以降低温度、提高可靠性,但问题是这样又影响到了性能,实际上这是一个矛盾体。这个问题就需要在板卡的设计过程中,怎么去这个给分摊掉,防止出现热点。热点就是真正的热点了,就是温度高点,一个地方的温度高会造成整个系统温度高。这就是之所以用分布式架构的原因,防止出现集中式的热点。”
 
五是由于SSD控制器的优化以及系统软件的缓存机制,操作系统写到闪存SSD的数量 并不能精确地反映闪存Cell上的擦写数量。
 
基于这样的发现,业界同仁希望在真实工作负载以及真实系统中有所新发现,然后需要了解各种不同因素对闪存可靠性的影响,包括系统软件、应用以及SSD控制器;更需要设计更加可靠的闪存架构和系统;同时为今后闪存可靠性研究改善评估方法。
 
稳定性测试带来什么启示?
 
不过,在闪存层面,可靠性大家探讨比较多,但稳定性几乎很少有人探讨,原因在于使用磁盘时,一个15000转的磁盘,性能是200 IOPS,用上十年还是200个IOPS。但是闪存就完全不一样了,实际上闪存颗粒在使用过程中会越写越慢,由于bad Block问题,实际的性能会随着使用时间和频率逐渐下降,出现性能衰减的问题。常理来说,板卡厂商要有一些数据来帮助用户了解这个方面的情况,当然需要做一系列的测试、评估。
 
对于稳定性方面,一个产品应该在整个生命周期里面所定标准应该是99.9%的时间里面性能不低于90%。李炫辉介绍说,对于稳定性,Greenliant有一组测试数据,使用闪存卡一直在做测试擦写,全盘擦写了差不多18000次,性能衰减基本上控制良好,像写的性能衰减值只有3-4%,读的性能衰减稍大一点,接近7-8%。这样的性能表现是在5年的闪存生命周期最后一段时间里面,意味着如果人的寿命是100岁,他已经99岁、100岁了,他的承受能力和20岁时基本上是一样。作为闪存专业厂商,这就是做产品化必须考虑的,这样的跑卡测试一直在进行着。
 
 
由于闪存设备在长期擦写情况下,坏块会逐渐 增多,故障率上升,由此会带来潜在的性能大幅下降。
 
Greenliant对产品进行长期擦写以及性能测试 。在疲劳测试环境中,每天全盘擦写50次, 超过18000次擦写后,性能衰减不超过10%。
 
DWPD是每天全盘擦写的缩写(Disk Write Per Day),10 DWPD就是每天全盘擦写10次,为什么会有这样的数据呢?因为我们知道闪存颗粒有擦写次数的限制,如3000次,我们通过架构设计、磨损平衡算法以及配置冗余的颗粒,来延长闪存卡的寿命,通过全盘擦写这个数值,就可以推算出闪存卡的使用寿命。每天擦写次数越高,其实对闪存卡的寿命影响就越大,因为闪存还有一个特点,就是它需要有一个relax时间,叫放松时间。原因是什么呢?因为闪存是电子器件,当进行数据操作的时候,实际上是要释放电子调整电位,当电子隧道突然打通之后,电子泄漏到规定的阀值马上就关闭隧道,实际上里面的电子仍然处于不稳的抖动状态,需要一个放松时间。这个放松时间越长,有利于闪存持久性。这就好像我们搬东西,一小时搬50块砖和五天搬50块砖的感觉是不一样的。
    
Greenliant测试在55度的恒温环境下,每天50次擦写, 并且现在还再继续跑,已经跑了一年。最终计划要把这几块卡全部跑到最后不能用, 到底可以到什么程度。Greenliant当时设计目标是每天10次全盘擦写,寿命可以用不少于5年。实际上已经测到了,10DWPD是保守值,但Greenliant想看实际值究竟能撑到多少?
 
做闪存卡设计的时候,GreenLiant每做一次具有软件功能的固件firmware的升级,就要把整个板卡的测试跑一遍。从开发完新的firmware到这个新的firmware能正式通过至少一个月。原因是什么呢?闪存的Firmware升级,可能会对设备运行带来不确定因素。如新的算法带来组件发热量或功耗的升高,底层设备访问的机制变化与其它代码和接口的兼容性等等,可能会影响板卡的稳定性。并且对于一些BUG修改,也许会带来一些新的BUG,所以要把整个卡的都要跑一遍。例如以前其它厂商闪存产品曾经出现的意外掉电容量丢失,错误的指令造成数据丢失等等,都是由于测试不完整造成。
 
因此,Greenliant每一次Firmware的更新,从高温耐受到整个的功能性能测试都要跑一遍,并且同时在异地两个实验室同时做测试,只有两个实验室均通过测试后,才会发布新的Firmware版本。
 
因此,对于一个专业闪存厂商来说,闪存的可靠性设计,实际上必须要将整个的设计和生产流程考虑进去。
 
为什么分布式ECC可以带来更好的稳定性与可靠性?
 
稳定性测试只是启示我们对于闪存卡稳定性和可靠性的验证还是有所不同,如何做到闪存卡架构上更好的稳定性与可靠性,不得不提到散热问题,这也是Facebook论文研究最为关注的第四个方面。
 
如何消除性能衰减和可靠性下降的问题,这就需要在架构设计方面进行创新。Greenliant在闪存设备架构上实现了分布式ECC 设计架构, 在每一个NAND Package中都封装一个闪存控制器里面。这样就避免了前面所讲的性能衰减和可靠性下降的问题。同时为了防止闪存颗粒故障造成数据丢失,在架构上还实现了板载硬件RAID的功能。
 
当然,目前大家都明白了:散热对稳定性和可靠性影响很大。过热的话会造成系统不稳定,现在闪存卡都采用FPGA,FPGA在高温情况下可能会算出错误的值,系统就会出问题。Greenliant采用分布式的架构,因为在整个闪存卡控制里面主要存在几个高性能计算的环境,一是ECC校验,ECC校验是计算密集型的;二是XOR RAID也是高计算型的。过去的情况下,一般来讲在一个控制器里面,一个ECC校验码处理整个板卡芯片上的ECC请求,一个XOR芯片处理整个板卡上的所有RAID的请求。这就意味着这两个芯片是计算量非常高的芯片,就会产生过热,高密集计算过程中会过热,这就可能产生稳定性问题。
 
Greenliant的思路就是:把ECC引擎封装在颗粒里面做分布式ECC,一个板卡上可能做40个ECC的引擎,这样把计算给分开了。原来是1个,现在是40个了。XOR的RAID根据分组是8个芯片,也把计算量分开了,就意味着总发热量不变,分摊多了就更低,散热面更大,所以性能更稳定。并且闪存卡散热不能靠风扇,要靠热传导,最多在控制器上加一个散热片,而里面的闪存颗粒全是靠热传导出来。如果能降低每一个颗粒的发热量,那么实际上就使系统会更加稳定、更低,可靠性就更高。这就是为什么测完之后Greenliant数值稳定性会很高,这是这个分布式ECC架构带来的好处。
 
怎么理解闪存中最关键的底层东西,比如Cell?
 
在谈论了这么对针对《Facebook闪存失效大规模研究》论文的话题,相信大家对SSD包括闪存的技术架构和特点有了很多了解了,不过,这还不够深入。比如你了解闪存中最关键的Cell吗?你对闪存中最底层的东西有多少了解呢?
 
在日常对于闪存的讨论中,经常会提到Cell,Cell是什么,怎么串起来的?这些都是一些常识问题,其底层到底什么样子?《大话存储1&2》作者冬瓜哥(张冬)给出了深入浅出的诠释。
 
一个Cell就是一个晶体管,现在叫晶体管不太合适,叫半导体长效应管。这就是两个电极,给个电压,这是控制芯片,给了电压就会产生电场。一旦通电的话,本来是绝缘的,加电压之后就打通了,电子就流动起来。通电开关打通之后,这就是晶体管。所有的数字电路都是拿开关去堆起来的,包括加法器、计数器等等堆成一个CPU。
 
但是这个东西让Flash用作存储了,是把中间这个地方加了一个floating Gate浮动栅的东西,内部是能储电的电容。DDRAM也是这么干的,但是里面的电容外面是没有绝缘体的,充电马上就漏掉了,漏得非常快,所以要不断刷新。但是Flash充进去能够保存一部分电,而且能保存一段时间。不过,其外面也是一个绝缘体,意味着充电时间就长,所以Flash性能不如DDARM。
     
这是一个Cell,储存一个bite,怎么把Cell连起来呢?把正负极串联,把控制器并联,有32768个列。为什么72768?就是除以8之后是4K,这就是一个Page。
    
32768列,然后一行一个Page,具体多少行每个厂商设定也不一样。比如一个Block设定512k,那么里有多少行。
    
要读写Page的话,需要把Block里面所有其他的Page控制极都加一个电压。正负级会打通, 开关串联起来,如果把其他开关都打通,然后加一个信号,在另一边考察信号能不能从上面透下来,如果透不下来证明里面是断开的。这就证明里面存了电,或者说不存电。
    
其里面是很复杂的,里面存了电。给里面加正电压,导通性增强了,如果加负电压,导通性就降低,绝缘性就更强了。
    
其实把所有打通之后,还要比拟器,需要在旁边有预充电的比较电压,再加一个基准电压,基准电压跟比较电压一样值,看你这边漏电的速度有多快。如果多少纳秒以后,基本不漏电证明里面是断开的。导通性基本不导通的,绝缘性增强了,证明里面是有电的。
    
如果比较的时候发现漏电很快,证明这里面没有电。没有电也会漏电,这个开关都是漏电的,所以功耗大,而漏电占了很大一部分。
 
如何读写?写是充电,往Cell里面充,充电是代表0,没电代表1。正常是充电表示1,这里为什么是充电代表0呢?因为有SenseAMP放大器,放大器的逻辑就是对充了电反而输出高电压是1,所以最后是不稳定了。问题是不能同时对Cell放电又充电,不能写1又写0,如果对它进行放电的话,这一块就是要加一个高电压。比如说起码要20伏的压差,当然实际上不会这么高,在这里只是举个例子。这里起码要加40伏,40减10等于30,那只能充电,但不能同时充满电。
 
NAND Flash最大的罪魁祸首是不能同时充满电,但是DDARM可以对每个Cell同时充满电,可以对每个Cell里面根据一大堆电路充满电,正因为如此电路面积变大了。Flash比DDR密度要高,不用每个Cell都充电,这就是拿价钱、拿密度来换性能。
    
再就是写放大,正因为不能同时写,所以每次都写到擦好的Block,每次只写0就可以了,1已经写好了。
 
如果出现写放大没有办法,把整个Block读出来擦成1再写回去,这样的性能就非常差了。
 
对于用户采购闪存的最佳建议?
 
闪存是由核心的颗粒组成,电子总会有问题的时候。诚然,它和磁盘不一样,闪存随着使用时间延长,性能出现下降。好颗粒更需要好的架构。但是,我们在了解完由《Facebook闪存失效大规模研究》论文引发的多个方面思考后,是否对采购SSD或闪存卡存在疑虑了呢?
 
当然不是。
 
美光相关人士在出差途中也参与了微群技术会——闪存夏日清凉聊活动,他指出了几个方面的比较理性和积极的认知。这里阿明将他非常精辟入理的观点分享给各位:
 
一是,SSD使用上大致分消费级应用和企业级应用两种应用场景。消费级应用的特点:a.不会满盘使用; b.不会随时随刻使用; c.几乎大部分操作都是读操作、顺序地址操作。
 
企业级应用的特点:a.满盘使用; b.要求随时随刻都在读写; c.读写比例有要求,很多系统要求更高的随机地址性能。
 
二是,针对这两种应用场景,消费级SSD更多关注于FOB性能,即新开封状态,或出厂状态  (FOB) fresh out of box;企业级SSD更多关注于稳态性能Steady state。
 
三是,关于稳态性能测试,大家可以搜索SNIA,有一套成熟可靠和稳定的测试方法。
 
四是,所有的SSD都有冗余即OP的存在(over provisioning),只不过有多有少,因为基于NAND结构的容量是1024*1024*1024=1GB,而厂商的SSD标称容量1G基于1000*1000*1000,所以,就算是消费级的SSD,也至少有1024*1024*1024-1000*1000*1000,即~7%的OP。
 
五是,再来讨论温度,SSD厂商一般在SSD内部都有temp senser,SMART信息中也有温度监控,温度高了一般做法是SSD自主降速。
 
六是,个人认为,由于NAND晶体构造,bit错误更多的是浮栅层的charge loss或charge gain,更低的温度让charge更难自主在能级中跃迁。所以,温度越低,基于NAND的出错的概率越低。 
 
Greenliant李炫辉也补充了一点,闪存可靠性问题对于客户、行业以及产业有着重大的影响 ,业界厂商都有相对应的应对措施。但对于要采购SSD或闪存卡的用户来说,性能、可靠性和成本都显得很重要,这三者却很难同时获得,客户需要根据应用的特点,根据最重要的特性选取最合适的产品。(阿明)