作者简介
袁戎,Memblaze SSD研发总监。想要和袁戎还有全世界的大牛讨论SSD及存储相关技术?加nanoarch为微信好友,拉你进ssdfans微信群
昨日SSDFAN群中有人问掉电处理怎么做,也有人说掉电保护不重要,费这个钱干嘛。我认为这个是分场景的,某些场景确实不重要,希望读者看完本文后能搞清楚可能遇到什么问题,需要用什么级别的SSD。本文不涉及具体算法。
先从SSD的数据模型开讲吧。
一般SSD写在盘上的数据分两种:用户数据;元数据。
用户数据很好理解,就是来自host的数据,这些数据往往已经回了ACK给host, 暂时放在系统缓存里(缓存通常是片内SRAM或者片外DDR,缓存是必然存在的,不管是不是DRAM-Less的主控)
元数据通常就是FTL数据,典型的情况,会在写用户数据的时候,同步写下对应的FTL mapping, 采取何种形式是各个厂家FW的核心内容。
这两种数据通常不会混在同一个block上,假设主控内部是单线程的,通常会先写用户数据,再写元数据。假设主控内部有多线程,那么这两个stream很多时候会是完全独立的。
最终在见下图:
写干净了的case, Meta和User是sync的状态, User 的mapping在他楼上的Meta中有体现。
Meta |
Meta |
Meta |
Meta |
Meta |
|
User |
User |
User |
User |
User |
很常见的情况会是Meta没写完,User多几笔,此时上电恢复时需要扫描User绿区,找出他的Mapping,更新到FTL里面
Meta |
Meta |
Meta |
|||
User |
User |
User |
User |
User |
User |
还有比较少见的情况,User没写完,Meta多了,上电恢复时需要抛弃一部分FTL的更新。
Meta |
Meta |
Meta |
Meta |
Meta |
Meta |
user |
User |
User |
有SLC cache的情况会更复杂,这里不需要展开讲,原理差不多。
上电恢复都是扫描-恢复元数据,再确认/扫描用户数据的过程。
那么在异常掉电的情况会发生什么用户想象不到的事情呢?
先看看典型的Client SSD吧, 自然是便宜是硬道理,电容什么的,省省吧。反正如上图所示,FTL总是能恢复的,盘是能继续工作的,一般不出bug是不会死的。
然而,however,
-
Cache中的最新的数据丢了,没商量。虽然掉电前你告诉host ACK了,但是cache肯定保不住。
-
在上图User<Meta的情况下,不好意思,最后的用户数据也丢了
-
在上图User>Meta的情况下,你丢多少数据是需要看运气的。
-
最后一个page写到一半掉电,读不出来是常见现象。
-
Meta |
Meta |
Meta |
|||
User |
User |
User |
User |
User |
User |
-
还有更恐怖的现象,一般厂商不会告诉你,program upper page的时候会造成lower page corruption ,这两个page 在一个cell上,调电压时掉电大概率一起坏。
Meta |
Meta |
Meta |
|||
User 1 |
User 2 |
User 3 |
User 4 |
User 5 |
User 6 |
在FTL中处理LPC,根据FW设计不同有变化,一个好的设计应该以coherency为第一要务,不能出现silent error – 比如上图User 345是好的,但是2被6带坏了。假如FTL接受345的新数据 ,后续对User 2的读必须告诉host数据错误,不能回User2 LBA的老数据。
另外一种方式就是FTL丢弃User2开始的所有用户数据,但是这样损失非常大。
从数据保护的角度看,消费级盘异常掉电损失数据是无法避免的,哪怕是前文所述完全sync的状态
Meta |
Meta |
Meta |
Meta |
Meta |
|
User |
User |
User |
User |
User |
FW感知道经过了一个正常掉电的sync and save; 然而依然有风险存在,FW永远没法得知在这个正常掉电handler结束后,host是否有曾再发一笔简单的4k写留存在cache里。
说了这么多,感觉没电容的消费级SSD没法用了对吧。其实不至于。
消费级最大的用途就是笔记本,存放系统,文件系统,OS通常都有比较完善的log, 可以把数据sync起来,通常host会找到他最后的可信数据,然后丢弃那些文件系统操作到一半的数据。
另外当前的超极本,大部分都设计成了一体机,不希望出现拔出电池或者拔出硬盘的情况,就是为了从系统层面避免异常掉电的发生。
说个题外话,如果你注意到了近几年智能手机都设计成不能换电池,其实原因也是一样的。
单独买SSD在主机上用,还是注意避免异常掉电为好,在数据写完后,多采取安全卸载以确保数据完整落到盘上。
如果你打算随便拿个消费级SSD放到企业级上使用,请务必在有异常掉电风险时,上电后做超过SSD 1/4容量的多盘一致性交叉验证,因为你不知道FW自己的coherency维护到底靠不靠谱,出现silent error在企业级应用是致命的,甚至超过挂盘对业务的影响。
风险自担!
再看企业级掉电保护的做法。
简单的说很简单,在足量电容的保护下,
-
正在写的数据写完,避免flash损坏
-
cache里ACK过的数据也要写完
-
coherent的元数据写下去
复杂的说里面的实现很复杂,有电容电量递减的风险需避免,有为了省电cancel掉很多操作,有最后时刻发生flash error的处理。
一个好的掉电保护设计能够避免出现flash的各种不可预知的风险,保证ACK过的数据都能落盘,
带掉电保护的SSD虽然价格贵不少,适用各种场景:
需要进行盘的热插拔的且数据关键的应用,比如大规模数据中心需要换盘,比如军用需要及时拔盘带走
需要数据一致性强要求的,有原子性要求的
土豪当然也可以用来做系统盘
最终选择还是取决于用户的实际应用了。