重复数据删除系统的碎片研究

本文深入探讨了重删技术中碎片现象对恢复性能的影响,并详细分析了LRU缓存策略在面对不同类型的碎片时的表现。通过对内部碎片和外部碎片的区分,以及对Linux tar文件和虚拟机镜像数据集的实验,揭示了碎片对恢复性能的负面影响,以及在实际应用中如何优化缓存策略以提高恢复效率。
大部分重复数据删除研究集中在备份的指纹索引上,大家都认为这是最关键的问题。的确,不解决磁盘瓶颈问题,备份窗口过大将导致重删不实用。重删系统的恢复性能一直处于被忽略的状态,原因是相对备份,恢复是小概率时间,而且体系结构最重要的Amdahl定律讲的就是重视大概率事件。但是我们也要明白一点,备份就是为了恢复的,如果备份的工作做得很充足,到了关键时刻不能快速恢复,一切都是白费力气了。或者说,备份就是一个不断投入的过程,而一次恢复就是赎回成本的过程,我们总是在研究如何减少备份的投入,而忽视了如何赎回更多的成本:恢复的越快,赎回的成本就越高!

备份最关键的部分是指纹索引,恢复最关键的部分是数据块存储。重删的底层存储介质一般是磁盘,而重删天然地会打乱数据块的逻辑顺序,导致数据流不是连续存储,下面就来看看这种碎片对恢复性能的影响吧,以及传统的LRU缓存对恢复性能的效果。


1.碎片定义


借用文件系统的两个名词,但是意思并不一样。

内部碎片:同一个备份作业或者同一个文件内部的重复数据导致的碎片,比如vmdk文件,通常自身有20%的重复数据。“内部”的范围指通常的一次读操作的范围,如果每次读一个文件,则内部指文件内部;如果是恢复一个备份作业,则指作业内部。直觉上,LRU缓存对这种碎片有较好效果。

外部碎片:不同备份作业或者不同文件之间的重复数据导致的碎片,比如linux源码归档,两个版本的源码通常有很多重复数据。“外部”也由一次读操作的范围而定,如果读的单元为文件,则外部指文件之间;如读的单元为作业,则外部指作业之间。直觉上,LRU缓存对外部碎片无能为力。

我们还需要借用一个概念:Chunk Fragment Level(CFL)[1]。CFL=OCF/CCF,其中OCF值最佳情况需要使用的container数量,CCF为实际使用的container数量。当CFL=1代表没有碎片情况。需要说明的是,CFL只能衡量外部碎片,在使用时,OCF需要去掉内部重复数据。

2.实验方法


存储这一层我使用了Data Domain的设计,container是固定大小的、自描述的单元。备份开始后,数据块被不断添加到container buffer中,直到contianer满了,再一次性写入磁盘。这有几个好处:1.避免的磁盘的小写;2.保留了数据块的空间局部性。Data Domain利用这种设计,配合Bloom Filter,缓解了备份时的磁盘瓶颈问题。

实现时,我用一个大文件虚拟了DDFS,所有container都顺序放在DDFS中。因为在磁盘不是很满的情况(剩余容量>5%),linux文件系统基本不会有碎片,所以有理由认为这个大文件基本上是连续存放的。系统还有一个LRU缓存,当需要读一个数据块时,就将整个container一起读入内存,替换策略是LRU。

使用的数据集是115个linux版本的tar文件,以及8个版本的虚拟机镜像。这两种数据集代表了两种情况:linux tar只有外部碎片;虚拟机兼有内部碎片和外部碎片。

实验进行了四遍,去掉明显不合理的实验结果后取平均值。

3.linux tar


linux tar只有外部碎片,没有内部碎片。一个版本的内核源码本身没有什么重复数据,但是多个版本之间存在大量重复数据,而且数据的变化主要是更新(随机写,而不是append)。先来看看CFL。

如图所示,横坐标是作业id,黑色是CFL,蓝色是不使用缓存策略获得的恢复性能,两条曲线惊人匹配,不断下降,到最后只剩下10MB/s作业的吞吐率了。因此,这种数据集的症状是外部碎片越来越严重,早期作业和后期作业恢复性能差距明显。这幅图还反映了一个问题,后期作业占用的container数量越来越多,简单的垃圾回收(比如等到container中不存在任何有效数据块时,才回收)并不能有效回收空间,大多数情况是,后期作业倾向于覆盖所有的container。再来看看LRU缓存对恢复性能能起到什么作用。



图中cache-N表示,缓存大小为N个container,N=0表示没有缓存。可以看出当N很小时,性能还不如N=0,使用较大的缓存可以小幅度提升恢复性能。分析:因为数据块不存在时间局部性(无内部碎片),所以以数据块为单元的缓存的价值不高;最初的几个版本,尚有很好的空间局部性,所以预取的效果比较明显,而随着不断备份,外部碎片化严重后,以容器为单元的预取效果不佳,必须通过为预取设置更大缓存(来利用容器的时间局部性)才可获得性能提升,而且不明显。通过图可以发现,随着备份继续,大缓存的恢复性能会慢慢被cache-0超越(因为块的空间局部性越来越差,导致容器的时间局部性越来越差),必须使用更大的缓存来弥补预取的失效。这验证了LRU缓存对外部碎片无效的直觉。

4.虚拟机


虚拟机镜像既有内部碎片也有外部碎片,单独备份一个作业,大概有20%的重复数据,这导致了内部碎片;多个版本的vmdk之间也存在大量重复数据,而且既有append也有随机更新操作,因此产生外部碎片。先来看看CFL。



两条线的总体趋势还是比较匹配的,只是在job2到job3的时候,CFL没有变化,而恢复性能却提升了,原因可能是内部碎片增加了,而外部碎片没有变化。再来看看LRU缓存的效果。



这种数据集用预取和缓存可解决部分问题,但仍有优化的空间。症状是恢复性能不断下降,通过引入缓存,恢复性能得到改善,缩小早起作业和后期作业的性能差距,但是仍然有优化的空间。通过使用预取和缓存,有效地缩小了早期作业和晚期作业的性能差距,从无缓存的80MB/s下降到30-40MB/s。

5.Log-structure


还有一种数据集,只有内部碎片而没有外部碎片,比如log-structure数据。这种数据集直觉上不会存在严重的恢复问题,通过linux自身的缓存和上层的LRU缓存,恢复作业应该可以保持一个稳定的吞吐率。因此没有专门测试。

6.结论


碎片可以分为内部碎片和外部碎片,内部碎片通常不是大问题(linux缓存和上层缓存可以解决),但是外部碎片是普遍存在,并且会深刻影响恢复性能。LRU缓存不能起作用的本质原因,是后期作业是稀疏地分布在各个container的,如果为了读取一个数据块,就预取整个container,往往得不偿失。

7.引用


[1] Y. Nam, etc. Chunk Fragmentation Level: An Effective Indicator for Read Performance
Degradation in Deduplication Storage. In HPCC’2011.

8.扩展阅读


[1] Deduplication and Restore Performance.   http://www.aboutrestore.com/2008/08/08/deduplication-and-restore-performance/

[2] Defragmentation, Rehydration, and Deduplication.  http://www.aboutrestore.com/2009/06/24/defragmentation-rehydration-and-deduplication/

[3] The Rehydration Myth.  http://www.backupcentral.com/mr-backup-blog-mainmenu-47/13-mr-backup-blog/247-rehydration-myth.html/

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值