缓存替换算法有很多种,FIFO是最简单的,LRU是最常用的,最优缓存替换算法则是命中率最佳的。因为我们无法预知数据的未来访问模式,通常最优替换算法是无法实现的。然而数据恢复则是例外:在备份的过程中,我们已经知道数据恢复的顺序。既然如此,何不通过最优缓存替换算法进一步改善命中率。
数据去重原型系统destor里面已经实现了LRU缓存,并且工作得还不错,尽管如此,我仍然想看看最优替换算法能获得怎样的效果。
备份的过程中,我记录下container的访问顺序,称之为种子文件,每个种子代表访问一个container。种子文件会作为最优替换算法的输入。
滑动窗口是一段固定长度的种子,替换算法只参考窗口内的未来决定替换谁。每处理完一个种子,滑动窗口移动一格。

此算法可认为是近似最优缓存替换算法,当窗口的大小等于整个种子文件时,进化为最优缓存替换算法。窗口的大小时算法的一个可调参数。


这是linux源码和vmdk的实验结果,窗口大小是1000,纵坐标是实际读取的container数量。近似最优替换算法比LRU整体要更好,优势逐渐扩大。在后期作业中,节约比例超过10%。
数据去重原型系统destor里面已经实现了LRU缓存,并且工作得还不错,尽管如此,我仍然想看看最优替换算法能获得怎样的效果。
1.种子文件
备份的过程中,我记录下container的访问顺序,称之为种子文件,每个种子代表访问一个container。种子文件会作为最优替换算法的输入。
2.滑动窗口
如果我们一次性读取整个种子文件,就可以看到恢复作业的整个未来,据此执行替换,我们就实现了最优缓存替换算法。然而种子文件可能很大,一次性分析需要较多内存和时间,因此引入“滑动窗口”概念。滑动窗口是一段固定长度的种子,替换算法只参考窗口内的未来决定替换谁。每处理完一个种子,滑动窗口移动一格。

此算法可认为是近似最优缓存替换算法,当窗口的大小等于整个种子文件时,进化为最优缓存替换算法。窗口的大小时算法的一个可调参数。
3.与LRU相比
- 相同的内存,可以获得更高命中率;
- 相同的命中率,使用更少的内存。
4.实验


这是linux源码和vmdk的实验结果,窗口大小是1000,纵坐标是实际读取的container数量。近似最优替换算法比LRU整体要更好,优势逐渐扩大。在后期作业中,节约比例超过10%。