内容感知FTL

原文:Feng Chen et al. CAFTL: A Content-Aware Flash Translation Layer Enhancing the Lifespan of Flash Memory based Solid State Drives

SSD的寿命与三个参数有关:1.写负载;2.过量供应的容量;3.垃圾回收和损毁均衡的效率。写负载通常被认为是不可控的,而过量供应不可能无限制,所以大部分研究集中在垃圾回收和损毁均衡。CAFTL关注的是第一点。

 

图1和图2验证了重复数据的存在。图1中,15块磁盘的重复度为7.9~85.9%,其中第7块磁盘(NTFS)大部分重复数据是零块,如果能够删除占7.9~85.9%的重复数据,就可以获得大量额外空间,提升垃圾回收和损毁均衡的效率,间接延长SSD的寿命;图2中,11个写负载的重复度为5.8~28.1%,如果能够避免这些不必要的写操作,就可以直接延长SSD的寿命。

CAFTL采用与CAS(Content-Addressable Storage)相同的原理,但是仍存在以下挑战:1.有限资源,SSD的计算资源和内存容量都很有限;2.较少重复数据,与备份负载不同,常规文件系统负载的重复数据要少得多;3.缺乏语义信息,CAFTL工作在设备层,缺乏上层文件系统的语义信息;4.开销必须小,去重不能过分增加SSD的访问延迟。

CAFTL(Content-Aware Flash Translation Layer)将重复数据删除技术集成到设备一层,关键的数据结构是指纹索引(包括三种查找加速优化)和二级映射表,性能瓶颈则是指纹计算。


1.概述




CAFTL结合了在线去重和离线去重(定期扫描重复数据),图3是在线去重的示意图,fingerprint store是指纹索引表,mapping table是二级映射表。当SSD接收一个写请求:

  1. 数据先放在缓冲区;
  2. 为每个page计算指纹;
  3. 在指纹索引表中查找指纹;
  4. 查找成功,将该逻辑page映射到已有的物理页;
  5. 查找失败,照常写入数据。

指纹使用SHA-1摘要;SSD的读写单元是page,使用page作为去重单元非常自然;CAFTL最关键的步骤是3和4。

2.二级映射表


SSD已有的FTL不能有效维护n-to-1的映射关系。比如,垃圾回收需要移动一个合法page,那么必须遍历整个映射表来更新PBA;或者要删除一个page,如何才能判断该page的引用次数。这就是说,新设计的FTL必须能够:

  1. 根据PBA,快速定位LBA,并快速更新映射关系;
  2. 记录PBA的引用次数。



CAFTL采用了二级映射机制,图5对比了传统FTL和CAFTL。传统FTL以LBA为数组索引,维护LBA到PBA的1-to-1映射关系。CAFTL加入了VBA(Virtual Block Address),VBA实际上代表了一组映射到同一PBA的LBA。一级索引将LBA映射到PBA(唯一page)或者VBA(重复page),地址的第一个bit用于区分PBA和VBA;二级索引以VBA为数组索引,将VBA映射到PBA,每个entry都有两个域{PBA, reference},4字节reference精确记录了有多少个LBA指向该VBA,只有reference为0的page才能被回收。

这种二级索引,最大的优点是快速更新,当垃圾回收移动一个重复的page,只需更新二级索引中的一个entry即可,加速了垃圾回收。缺点是增加了索引的大小,并且定位重复page时,需要额外查找一次二级索引。

然而,这张表只解决了快速更新和引用次数的问题,并不能实现快速定位。因此,每个page的元数据区(实际上是专用的几个元数据page)里都记录了其反向映射的LBA或VBA和指纹。

3.指纹索引表


CAFTL的指纹索引表是放在内存的,因为SSD的内存通常很小,一般作为缓存使用,索引表不宜过大。通过分析负载,可以发现只有10~20%的page是存在重复的,大多数page都是唯一的。因此,应该只索引最可能发生重复的page。

CAFTL首先将哈希空间分为N份,称为segment,每个指纹都取N模分配到某个segment;每个segment都是一个bucket列表,每个bucket都是4KB page大小,由多个entry组成;每个entry是一个25字节的键值对,{fingerprint, (location, reference)},20字节的fingerprint是键,location是4字节的PBA或VBA,1字节的reference代表了该指纹的热度(这和二级索引的reference有所不同,超过255次被认为是一样的)。bucket内,entry都已经按键排序。

当SSD启动时,首先重建二级映射表(读取固化的二级映射表和日志),然后扫描映射表(获得reference)和page的元数据(获得fingerprint和location)重构指纹索引表。bucket的数量是有限的,重构过程中,指纹被不断插入bucket,当bucket用完后,根据reference来决定是否替换(reference并不是索引,这个替换是不是很漫长啊)。

索引过程:计算指纹所属segment,逐个二分查找每个bucket。当bucket数量很多时,搜索很慢。因此提出了三种优化技术:

  1. 范围检查,在执行二叉查找之前,先检查指纹是否在这个bucket范围之内;
  2. 基于热度重构,bucket列表中的指纹可以按照热度降序排序,使得热度高的指纹位于列表的前面;
  3. bucket级的二叉查找,可以用归并排序将segment内所有指纹排序,通过bucket级的二叉查找快速定位bucket。

4.加速计算指纹


SHA-1的计算很耗时,会对SSD的写响应延迟产生很大的影响。CAFTL有三种方法优化指纹的计算:

  1. 取样法。在传统文件系统负载,重复数据不像备份系统那么普遍,因此大部分指纹计算不必要的。CAFTL首先以32个page为单元,将写请求划分,比较单元内page的首四个字节,首四个字节最大的page为样品,计算样品的指纹并搜索指纹索引表,如果存在则继续计算其它page,如果不存在则不再计算其它page。取样方法类似Extreme Binning,基于Broder定理。
  2. 轻量级预哈希。CRC32比SHA-1快10倍,而且SSD本身就有ECC引擎计算校验和,因此可以在指纹索引表中增加CRC32校验信息。计算page的指纹之前,先计算CRC32,如果能在指纹索引中找到,继续计算SHA-1确认,否则放弃计算SHA-1。
  3. 动态切换。为了应付对性能要求比较极端的情况,CAFTL监控缓冲区的剩余容量,当所剩不多就禁止在线去重,反之就开启在线去重。

5.实验


CAFTL的实验没有正面测试去重对写请求延迟的影响,因为SSD是异步写,大部分写请求被缓存吸收,测不出实际的写请求延迟(选一些写密集的应用不就行了?)。所以通过测试读请求的延迟来侧面反映去重对写请求的影响,因为如果写请求处理过慢会充满缓冲区,读请求就被耽误了。

转载于:https://www.cnblogs.com/opennaive/p/3312779.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值