原文:Assuring Demanded Read Performance of Data Deduplication Storage with Backup Datasets.
这篇文章发表在MASCOTS 2012,它的作者2011年在HPCC发表了一篇CFL,提出CFL衡量去重系统的碎片程度,这篇文章可以看成是续集,基于CFL提出了一种碎片的解决方案。因为和我目前的研究点重叠,所以看了一遍。
去重系统的读性能很重要,不仅仅是因为恢复操作,更多的情况是需要归档。
在2011年的基础上,作者修正了CFL的定义。旧版的CFL忽略了内部碎片的影响,这在我前面的博文 《重复数据删除系统的碎片研究》就有提到,而且也没有考虑缓存的因素。修正后,CFL的定义如下:
这个定义旨在描述一个数据流的碎片情况。OCF的定义没有变,指的是最优情况下需要占用container的数量,也就是指不进行去重,这时占用的container是最少的(考虑内部碎片则未必);而CCF的定义发生了变化,旧定义没有考虑缓存,而现在是考虑有LRU缓存的情况下,实际需要从磁盘读取多少个container。一般来说CFL越接近1说明碎片越少,读性能越高,越接近0说明碎片越多,读性能越低。当数据流存在较多内部碎片时,CFL可能超过1,这时简单地把CFL当成1。
解决方案主要包括两部分:1.CFL监控器;2.选择去重组件。CFL监控器是一个开关,当发现数据流的碎片情况比较严重,就开启选择去重组件,只对空间局部性很好的块进行去重;当碎片情况缓解后,恢复传统去重。下图是系统的概况。
数据恢复的顺序和备份顺序是一样的,在备份的时候就可以知道数据流的CFL情况。设置CFL req为开关条件。每接受一个块都会重新计算当前CFL,OCF的计算方法是:
其中s m是数据块的长度,S cs是container的大小,即用数据总量除以container的大小。而CCF的计算方法是:
即判断这个块所属的container是否在缓存中,如果在缓存中,则CCF不变,否则CCF加一。缓存使用LRU替换策略。当CFL低于CFL req时,开启选择去重。
选择去重的目标是快速改善CFL水平,基本原理是只去重具有良好空间局部性的块。原理和 iDedup类似,但针对container存储做出了不同实现。其算法如下:
如果接受的数据块是唯一的,就写入container buffer,如果container buffer满了,就将container buffer写入磁盘。如果这个数据块是重复的,那么需要决策是否去重。如果这个数据块的container id等于temporary container的id,就先将数据块放入temporary container; 如果不等于,则判断temproray container当前的规模,如果大于预设的值p,就将整个tmp container去重,否则将tmp container写入container buffer;最后,将这个数据块放入空的tmp container,并更新tmp container的id。
作者的实验是用DiskSim仿真的,用了六个数据集,每个数据集有2~5个版本。谈谈我的看法吧。
这篇文章发表在MASCOTS 2012,它的作者2011年在HPCC发表了一篇CFL,提出CFL衡量去重系统的碎片程度,这篇文章可以看成是续集,基于CFL提出了一种碎片的解决方案。因为和我目前的研究点重叠,所以看了一遍。
去重系统的读性能很重要,不仅仅是因为恢复操作,更多的情况是需要归档。
1.新的CFL
在2011年的基础上,作者修正了CFL的定义。旧版的CFL忽略了内部碎片的影响,这在我前面的博文 《重复数据删除系统的碎片研究》就有提到,而且也没有考虑缓存的因素。修正后,CFL的定义如下:
这个定义旨在描述一个数据流的碎片情况。OCF的定义没有变,指的是最优情况下需要占用container的数量,也就是指不进行去重,这时占用的container是最少的(考虑内部碎片则未必);而CCF的定义发生了变化,旧定义没有考虑缓存,而现在是考虑有LRU缓存的情况下,实际需要从磁盘读取多少个container。一般来说CFL越接近1说明碎片越少,读性能越高,越接近0说明碎片越多,读性能越低。当数据流存在较多内部碎片时,CFL可能超过1,这时简单地把CFL当成1。
2.解决方案
解决方案主要包括两部分:1.CFL监控器;2.选择去重组件。CFL监控器是一个开关,当发现数据流的碎片情况比较严重,就开启选择去重组件,只对空间局部性很好的块进行去重;当碎片情况缓解后,恢复传统去重。下图是系统的概况。
2.1CFL监控器
数据恢复的顺序和备份顺序是一样的,在备份的时候就可以知道数据流的CFL情况。设置CFL req为开关条件。每接受一个块都会重新计算当前CFL,OCF的计算方法是:
,
其中s m是数据块的长度,S cs是container的大小,即用数据总量除以container的大小。而CCF的计算方法是:
,
即判断这个块所属的container是否在缓存中,如果在缓存中,则CCF不变,否则CCF加一。缓存使用LRU替换策略。当CFL低于CFL req时,开启选择去重。
2.2选择去重
选择去重的目标是快速改善CFL水平,基本原理是只去重具有良好空间局部性的块。原理和 iDedup类似,但针对container存储做出了不同实现。其算法如下:
如果接受的数据块是唯一的,就写入container buffer,如果container buffer满了,就将container buffer写入磁盘。如果这个数据块是重复的,那么需要决策是否去重。如果这个数据块的container id等于temporary container的id,就先将数据块放入temporary container; 如果不等于,则判断temproray container当前的规模,如果大于预设的值p,就将整个tmp container去重,否则将tmp container写入container buffer;最后,将这个数据块放入空的tmp container,并更新tmp container的id。
3.讨论
作者的实验是用DiskSim仿真的,用了六个数据集,每个数据集有2~5个版本。谈谈我的看法吧。
- 测试恢复性能,最好使用渐变的数据集,版本数量越多越好,这样才容易看出碎片的影响;
- 测试的结果,有一些莫名其妙的地方,曲线变化很奇怪,没有解释;
- 没有考虑操作系统本身的缓存影响,放大了内部碎片对性能的影响;
- 没有测试重删率的损失;
- 一些数据集的测试数据和其特点矛盾,难以解释;
- 感觉还可以做得更好。