1、面向 SSD 寿命优化的访问序列折叠缓存替换算法 唐琪 王吉磊 柴云鹏 中国人民大学信息学院 摘 要: SSD 的写入寿命比较有限, 因此除命中率外, SSD 缓存设备的写入量成为评价缓存替换算法的另一个关键指标。如何使算法提高写入数据转化为缓存命中的效率, 从而延长 SSD 的使用寿命, 具有重要的研究意义。目前, 已有缓存替换算法的设计一般基于时间局部性, 即刚被访问的数据短期内被访问的概率较高, 因此需要频繁的数据更新和较高写入量来保证较高命中率;或是通过不低的开销屏蔽相对最差的部分数据来减少一定的写入量, 还缺少用低开销获得数据长期热度规律、有效提高缓存数据质量的算法。访问序列折叠的缓
2、存替换算法, 用比较低的开销定位拥有长期稳定热度的数据写入缓存, 明显提高 SSD 缓存数据质量, 保证命中率的同时减少了 SSD 的写入量, 。实验表明, 访问序列折叠算法相比 LRU 算法可在命中率损失低于 10%的情况下减少 90%的写入量, 与SieveStore、LARC 等写入优化缓存算法相比, 命中率相当时可将写入量减少一倍以上, 有效达到了通过缓存高质量数据, 减少 SSD 的写入量, 延长其使用寿命的目的。关键词: SSD; 缓存; 寿命; 访问序列折叠; 缓存替换; 作者简介:唐琪 (1997-) , 女, 内蒙古自治区呼伦贝尔市人, 目前为中国人民大学本科生, 主要研究领
3、域为存储系统和云计算。作者简介:王吉磊 (1992-) , 男, 浙江省平湖人, 2015 年获中国人民大学计算机系科学与技术专业学士学位, 目前清华大学研究生, 主要研究领域为存储系统与人工智能。作者简介:柴云鹏 (1983-) , 男, 天津市人, 2009 年于清华大学获工学博士学位, 中国人民大学信息学院副教授, 主要研究领域为存储系统和云计算。在TPDS、TC、MSST 等国际顶级期刊或会议发表论文多篇, 主持国家自然科学基金、北京市自然科学基金等项目。基金:国家自然科学基金重点项目A Folded Access Sequence-based Cache Replacement Al
4、gorithm of for Extending the Lifetime of SSDsTANG Qi WANG Jilei CHAI Yunpeng School of Information, Renmin University of China; Abstract: Because of the limited write endurance of SSDs, the write amount of SSD cache becomes another important critical metric to measure cache replacement algorithms ex
5、cept for the cache hit rates. Therefore, how to improve the overall quality of the cached data for longer lifetimes of SSDs, i.e., promoting the efficiency of transforming cache writes into cache hits, is very important for the cache replacement algorithms. At present, most of the existing cache rep
6、lacement algorithms reply on temporal locality, i.e., the recently accessed data usually has a high possibility to be requested soon with the result of requiring frequent data updates and a high write pressure for SSDs to ensure a high hit rate. Some improved algorithms prevent some least accessed d
7、ata to reduce write amounts through a high cost. A solution aiming at improving the overall quality of cached data based on the observed long-term law of data popularity with low overhead is required. This paper proposes a cache replacement algorithm called Folded Access Sequence (FAS) for the SSD r
8、ead cache. FAS is designed to identify the long-term hot data with only a low overhead, leading to higher quality of cached data in SSDs, high hit rates, reduced amounts of written data to SSDs, and longer SSD lifetimes. The experimental results show that FAS can reduce the SSD writes by 90% compare
9、d with the traditional LRU algorithm and the hit rate loss does not exceed 10%. Compared with the improved cache algorithms like Sieve Store and L2ARC, FASs write amount is reduced for more than 50% with similar hit rates. The results exhibit that our proposed FAS can effectively keep high-quality c
10、ached data, reduce the written amounts to SSDs, and extend the SSD lifetimes.Keyword: SSD; Cache; Lifetime; Folded Access Sequence; Cache Replacement; 1 引言长期以来, 硬盘因具有容量大、价格低、性能稳定的特点而成为最主流的存储介质, 新型的瓦记录磁盘进一步提升了磁盘的存储密度和性价比。随着大数据时代的到来, 对于存储的性能也提出了越来越高的要求。利用缓存机制来加速硬盘访问的性能也已成为一项愈加重要的技术。有企业直接将基于闪存芯片的固态硬盘 (
11、Solid State Drive, 简写为 SSD) 作为存储介质。但 SSD 的写操作的次数是有限制的, 如果针对某些单元进行过 10万次写操作 (SLC) , 甚至仅 500010000 次 (MLC)12, 后续这些单元的写入可能会失效, 即闪存的写入的耐久性有限。而且闪存芯片内部固有的写放大现象 (即由于擦除和读写操作单位的不匹配引发的额外的数据搬移操作) 也加剧了芯片磨损的速度, 实际写入大小很可能比用户写入的要大很多3。另一方面, 并非所有数据都会被经常访问, 甚至有些数据可能几乎不会被访问, SSD作为存储介质的高成本很难带来相匹配的收益。但是在缓存设备方面, SSD 相对于
12、DRAM 来说, 容量更大、成本更低、功耗更低, 且具有非易失性, 是新一代的缓存介质。将读能力优秀 SSD 作为磁盘读缓存缓存, 是一个加速效果非常明显的方案。将一些会被频繁访问的数据写入 SSD 缓存, 减少 CPU 进行磁盘 I/O 访问的次数, 以提高硬盘的性能4, 5, 6, 7。因此以硬盘作为存储介质, SSD 作为其缓存的存储模式是很多大数据存储系统较为理想的选择。但多数缓存算法需要频繁的缓存数据更新, 也会导致写入耐久性有限的 SSD 遇到使用寿命缩短的问题。目前主流的企业级 SSD 产品, 假设预期 5 年使用寿命, 每日只能写入 1.3810.05 倍自身容量的数据8, 这
13、对于需要频繁更新缓存数据保持高命中率的缓存来说, 是远远不够的。现有的传统缓存替换算法 (如 LRU) 多数基于时间局部性设计, 这类方法倾向于选择短期热门数据进行缓存, 因此在保证高命中率的同时往往需要频繁的数据更新, 会缩短 SSD 的使用寿命。也有一些改进算法能够减小一部分 SSD 缓存的写入量, 主要的方法随机地禁止一部分数据进入 SSD (如 L2ARC9) , 或者去掉部分时间局部性差的数据 (如 LARC10) 。这些方法只是在 LRU 等缓存短期热门数据的传统方法基础上, 减少一部分数据写入 SSD, 并没有在数据选择方法上做出本质上的调整, 从根本上改善 SSD 缓存中数据的
14、质量, 进而从根本上保持高命中率和减少写入量。本文提出的访问序列折叠 (Folded Access Sequence, 简写为 FAS) 算法能够通过很低的开销识别出长期稳定被访问的数据, 通过提高缓存数据的质量来同时减小 SSD 写入量和保持高命中率。具体来说, FAS 算法通过抽样统计的方法, 将较长时间内的的访问记录在若干个连续的时间窗口内, 并通过折叠窗口的方式, 统计对各个数据块的访问在多个窗口中出现的次数占总窗口数的比例, 将高于一定比值的数据筛选出来。这些数据在一定概率筛选的前提下仍然在多数时间窗口内出现, 说明这些数据是比较稳定的长期热门数据, 将其写入 FAS 的白名单中。在
15、白名单中的数据块再次访问时会被允许进入 SSD 读缓存, 反之不在白名单的数据不允许被缓存, 这样既避免了频繁的数据更新, 也能让高质量的长期热门数据较稳定地保持在 SSD 缓存中, 从而用较少的 SSD 写入就能达到较高的缓存命中率。通过一系列基于仿真系统的实验, 我们将 FAS 算法与一些典型的缓存算法进行比较。FAS 算法相对于传统 LRU 算法可减少 90%的写入量, 而命中率损失仅不到10%。与 Sieve Store11算法相比, 在命中率相当的情况下写入量可减少50%75%。在命中率在高于 L2ARC9算法的情况下, 写入量至少可以减少 50%, 在局部性较好的情况下, 写入量甚
16、至可以减少 90%。实验结果表明我们提出的访问序列折叠算法可有效地提高缓存数据质量, 减少 SSD 的写入量, 从而延长其使用寿命。本文的第二部分将介绍现有的相关研究, 第三部分将介绍访问序列折叠算法的原理, 第四部分将给出实验结果与分析, 最后在第五部分进行简要的总结。2 相关工作作为硬盘缓存部分的 SSD 的容量通常较小, 需要有高效的替换算法来保证系统的性能。从传统磁盘概念上讲, 缓存替换算法主要关注访问的命中率, 如 LRU (Least Recently Used) 、FIFO (First Input Fist Output) 、LFU (Least Frequently Used
17、) 、MQ (Multi Queue) 12等, 这些算法更倾向于缓存一些短期内访问量较高的数据, 当然无法保证缓存的是长期热门数据, 因此需要频繁地更新缓存数据。但对于写入耐久性有限的 SSD 缓存来说, 频繁的数据更新会导致 SSD 寿命缩短, 对于存储系统的可靠性和企业运维成本来说都是一项严峻的挑战。现有的几种针对 SSD 读缓存的寿命改进的缓存算法主要包括 Solaris ZFS 所使用的 L2ARC9算法、LARC10算法, 以及 Sieve Store11算法。这些算法虽然通过过滤掉部分数据来减少写入量, 但并没有提高缓存中的数据质量。下面将分别进行详细的分析:2.1 L2ARC
18、算法L2ARC9算法的全称是 Level 2 Adjustable Replacement Cache, 是 Solaris ZFS 中 SSD 读缓存所使用的缓存算法, 全称为。所使用的算法是周期性地将内存缓存队列末尾的一部分数据抽样进入 SSD 读缓存, 这些数据仍然属于短期热门数据, 但是即将被内存缓存淘汰, 所以提前转入容量更大的 SSD 缓存。抽样的选择方法可以控制和减少 SSD 的写入量。但在这个过程中, 只是完全随机的去掉部分数据, 并没有提高长期热门数据的比例。如图 1 所示, 三角形表示按照 LRU 等景点算法写入 SSD 读缓存的数据总和, 其中好、中、差表示数据的长期热度
19、的高低。L2ARC 算法由于是随机筛选数据, 因此对于好、中、差数据不做区分, 都有一部分进入 SSD 读缓存, 写入情况如图 1 所示。所以 L2ARC 并没有提高好数据的比例, 改善缓存数据的质量。Fig.1 The written block selection of SSD cache under L2ARC 图 1 L2ARC算法对写入 SSD 缓存数据的筛选 下载原图2.2 LARC 算法LARC10算法的全称是 Lazy Adaptive Replacement, 其主要思想是如果一个数据块在较短的时间内被连续练成访问, 则被允许进入 SSD 读缓存;否则不允许进入。这样可以选择
20、局部性最好的一部分数据进入 SSD, 减少 SSD 的写入量。LARC 主要针对的是数据的时间局部性特征, 即将局部热 (短期内具有高访问量) 的数据写入 SSD 缓存, 写入情况如图 2 所示。这样的筛选机制可以在一定程度上提高高数据的比例, 但连续两次较近访问只是好数据的一种特征, 既不是充分条件, 也不是必要条件, 会受不同应用的特征影响使其在命中率和写入量减少上的表现差距较大, 会遗漏很多长期热门数据, 也会将一些短期热门但热度衰变较快的数据写入 SSD 缓存。Fig.2 The written block selection of SSD cache under LARC.图 2 L
21、ARC 算法对写入 SSD 缓存数据的筛选 下载原图2.3 Sieve Store 算法Sieve Store11算法所采用的方式是设置数据块访问缓存缺失数阈值作为进入SSD 缓存的门槛, 即访问某数据块的缓存缺失数达到一定次数后运行进入 SSD缓存, 写入情况如图 3 所示。这样的机制只去掉了一部分最差的数据 (访问次数最少的数据) , 但中等和最好的数据在这个过程中没有区分, 还是有很大的SSD 写入量, 其中还是有很多较差数据。并且该方法为了记录每个数据块的访问情况, 元数据的开销很大, 甚至可能无法全部装入内存需要放到外设中, 导致其性能较低。Fig.3 The written blo
22、ck selection of SSD cache under Sieve Store.图 3 Sieve Store 算法对写入 SSD 缓存数据的筛选 下载原图我们希望对缓存算法做出的改进是以一种低开销的方式通过对缓存替换设置一定的筛选机制, 提高好数据的比例, 选择那些长期具有高访问频率、而非短期热门的数据写入缓存数据, 从而提高缓存中数据的平均质量。3 访问序列折叠在这部分中, 我们详细介绍我们所提出来访问序列折叠 (Folded Access Sequence, 简写为 FAS) 缓存替换算法。对于写入耐久性较差的 SSD 缓存来说, 为了在保证命中率的同时减少写入量, 最理想的情况
23、是找出长期稳定的热门数据来写入 SSD 缓存, 这样的数据热度能够保持较长时间, 即访问序列较长, 写入缓存后可以提高 SSD 内的数据质量, 不需要频繁更新缓存数据就可以使 SSD 缓存保持较高的命中率。但是为了找出这些长期热门的“好”数据, 需要长期跟踪访问记录来实现, 一般来说存储和计算的开销都比较大, 很难实际应用。但实际上, 我们并不需要所有数据的精确访问记录, 我们的目标只是将图 4 中访问序列很长的长期热门的“好”数据和其他低质量的数据区分开。因此我们可以采用较为模糊的方式来维护数据块的访问记录, 从而降低计算和存储的开销。Fig.4 Access sequence and di
24、stribution of data quality.图 4 不同质量的缓存数据对应的访问序列长度 下载原图具体来说, 我们所提出的访问序列折叠算法就是这样一个用较低开销找出长期热门数据的方法。最核心的思想是通过访问序列折叠来用较低开销准确识别长期热门数据 (3.1 部分) , 其次通过访问抽样方法来进一步减小算法开销 (3.2部分) , 并通过白名单机制来进行低频率的缓存数据更新, 延长 SSD 寿命。最后, 访问序列折叠算法的复杂度将在 3.4 部分进行分析。3.1 访问序列折叠思想长期热门数据的主要特征是访问序列较长, 因此会导致两个属性:一是访问总数较多, 二是访问分布持续的时间长,
25、在很多时间段上都会有访问。传统的 LFU等算法就是抓住第一个特征识别热门数据, 但是这样可能有一些短期热门的数据, 在短期内有较高的访问量, 与长期热门数据会混淆。因此我们所提出的访问序列折叠 (FAS) 算法就是利用长期热门数据的第二个特征。针对第二个特征的方法一般需要记录较长时间段内的访问记录, 开销远比 LFU这样针对第一个特征的方法要大。但是我们所提出的 FAS 算法具有较低的复杂度。FAS 算法不需要想 LFU 那样维护每个数据块的访问次数并进行实时排序, 而是从另一个角度来记录访问信息, 即记录最近访问的一些访问数据。如图 5 所示, FAS 算法维护一个队列记录最近访问的数据块的
26、 ID, 新来的访问直接写入队列的尾部, 而不需要进行高开销的排序操作。当整个队列满了之后, 会将其均分为几个时间窗口进行折叠, 并统计其中每个数据块在几个时间窗口内出现。例如图 1 中所示的数据块 a, 在 4 个时间窗口中的 3 个中出现, 说明a 的访问序列较长, 覆盖较多的时间窗口, a 是长期热门数据的可能性比较大。而数据块 d、e、f 等在 4 个时间窗口中只出现 1 次, 说明是长期热门数据的可能性比较小。相对于 LFU 等算法, FAS 算法不需要进行复杂的排序操作, 而访问序列折叠这样的复杂操作会间隔较长时间进行一次, 计算实时性要求也不高。存储空间则主要取决于记录访问数据块
27、 ID 的队列长度, 但并不需要很长的记录即可识别出长期热门数据。但是, FAS 算法针对长期热门数据的第二个特征, 更为准确, 可以有效减小 SSD 缓存的数据更新频率, 并维持较高的缓存命中率。Fig.5 Principle of the folded access sequence 图 5 访问序列折叠原理 下载原图3.2 访问抽样与抽样时间窗口折叠为了进一步减小访问序列折叠方法的开销, 数据块进入访问记录队列可以采用抽样的方法, 即所有访问以概率 p 进入队列。这种情况下, 可以理解为该队列包括若干个抽样时间窗口, 如图 6 所示。这样可以用更小的空间开销覆盖更长的时间段, 提高长期热
28、门数据识别的效果。而长期热门数据由于热度较高, 在一个时间窗口内会多次出现, 即使进行抽样操作, 也会有很大的概率被选中。Fig.6 Principle of the folded access sequence algorithm 图 6 访问序列折叠算法原理 下载原图如图 6 所示, 所有的缓存缺失, 都将以一定概率 p 进入抽样时间窗口中。假设共有 n 个分布在时间轴上的时间窗口, 每个时间窗口的长度相同, 可以记录 Lw个访问, 每两个连续时间窗口之间的间隔为 Ls 个访问, 即两个窗口之间的 Ls个访问没有进入抽样时间窗口的机会, 这样可以进一步延长所有抽样时间窗口覆盖的时间长度假设
29、, 某个访问正处于第 个抽样时间窗口, 那么它将以概率 p 进入窗口 i。以此类推, 对后续的访问进行相同操作直到窗口 i 填满即窗口中接纳进了 Lw 个访问, 跳过后续 Ls 个视为在间隙中的访问后, 开始下一个窗口的填充。当一组时间窗口 (假设为 n 个) 全部填满后, 对这 n 个窗口进行折叠, 即统计出现过的数据块在所有窗口中出现的次数。如果次数达到预先设置的阈值, 则视为符合长期热门数据的筛选条件, 进入后续的白名单, 即白名单中的数据都是被识别出来的长期热门数据。当后续访问命中白名单时, 该数据块可以写入SSD 缓存。这样既避免了频繁的数据更新, 大大减少了 SSD 缓存的写入量,
30、 又保证了缓存中的数据质量和命中率。总的来说, 虽然我们进行了抽样, 但由于长期热的好数据拥有高访问频率, 进入时间窗口的机会更大, 在连续多个窗口中重复出现的概率高。折叠窗口后便可将这些多次重复出现的长期热数据准确识别出来。而有些局部热数据, 尽管短期内访问频率高, 但由于每个时间窗口内的元素是不重复的, 排除了短期内的多次访问的干扰, 即差数据或局部热数据是很难在窗口折叠的过程中被筛选出来的。3.3 低频率数据更新我们将时间窗口折叠筛选出的好数据记录在一个长度有限的白名单中, 白名单队尾的元素将会被淘汰。当新的访问命中白名单时, 对应的数据将被写入 SSD缓存, 替换掉相对最差的数据。而
31、SSD 可以采用多种已有算法进行数据管理 (如 FIFO、LRU 等) , 在更新数据时, 淘汰掉队列尾部同等数量的数据即可。白名单的存在使得不需要产生额外的磁盘访问将数据加载到 SSD 缓存, 而是等待在下一次访问缺失时自然加载。值得注意的是, 白名单的长度是有限的, 满了之后需要进行替换, 用 LRU 算法进行管理。由于长期热门数据也会脱离活跃期, 这样可以逐渐从白名单中脱离。由于填满每个抽样时间窗口就需要较长时间, 且每次窗口折叠也不一定都能产生很多符合条件的数据, 整体上 SSD 缓存的数据更新并不频繁, 低频率的更新能够明显较少写入压力。与此同时, 访问序列折叠算法筛选出的数据有较大
32、概率为长期热的高访问频率数据, 所以能在低频率数据更新和低开销的前提下, 保证较高的数据平均热度和缓存命中率。3.4 复杂度分析访问序列折叠算法无论是从时间复杂度还是空间复杂度来讲都满足作为缓存算法负载低的要求。在时间复杂度方面, 对每一个访问, 额外的计算开销只是生成一个随机数并判断它是否小于等于给定的概率 p 值, 如果符合便将其放入当前时间抽样时间窗口的集合中。这个操作非常简单, 开销很低, 时间复杂度为 O (1) , 理论上不会对系统的读写速度产生额外影响。相对于 LFU 算法, 访问序列折叠方法在每次更新缓存队列时不需要进行排序操作, 因此能够降低这方面的计算复杂度。而算法的主要开
33、销是在周期性地进行时间窗口折叠时, 这个阶段需要统计 n 个集合中每个元素出现的总次数, 并只留下大于等于 M 的数据块, 时间复杂度为O (Lw*n) 。然而这个操作需要间隔很久才进行一次, 即等待抽样时间窗口填满, 并且没有明确的时间限制需要立即完成, 所以可以接受其相对较高的复杂度。在空间复杂度方面, 主要的空间复杂度时增加 n 个抽样时间窗口的集合, 集合中每个元素只需要记录访问数据块的编号, 整体占用空间很小。此外便是白名单的空间开销, 也同样只需要记录数据块的编号, 开销同样很小。例如对于 1TB 的数据, 每个块大小为 4KB, 需要的窗口个数为 , 设窗口长度和间隔长度为 1:
34、2 即 2Lw=Ls, 访问缺失进入窗口的概率 p 为 0.7, 每个块的地址为 4B, 则记录窗口中所有元素的地址只需要, 若只记录编号, 则开销更低。而白名单的空间开销视白名单长度而定, 则要更小, 空间复杂度为 O (White List Len) 。4 实验与结果4.1 实验环境设置我们基于 Erlang 语言实现了一个支持内存缓存和 SSD 缓存的仿真模拟系统, 用于评估访问序列折叠算法的性能, Erlang 语言的优势是便于并行计算来提高实验评价的速度。我们在系统中实现了多种具有代表性的缓存算法, 包括传统的 LRU 算法, 针对SSD 写入耐久性改进的算法 L2ARC 和 Sie
35、ve Store。算法对比是在同样的环境配置下, SSD Cache 的大小默认采用 Trace 覆盖容量的 20%, 使用 SSD 缓存的命中率以及 SSD 的写入量 (单位为 4KB 的数据块的个数) 两个考察指标, 来评估我们所提出的访问序列折叠 (FAS) 算法与已有算法的差异 (实验结果见 4.2 部分) 。最后, 我们通过调整访问序列折叠算法的参数来进一步评估该算法, 包括窗口长度、折叠比例、以及 SSD 缓存占 Trace 覆盖容量的比例等 (实验结果详见4.3 部分) 。用于测试的磁盘访问记录如表 1 所示, 其中 as2 来自 UC Berkeley 的 Auspex 文件服
36、务器13, metanodej 和 dslct 均来自在 Bigdata Bench14上运行 Hive, 其中 metanodej 为运行 join 操作时元数据节点上的 I/O 访问记录, dslct 为运行 select 操作时数据节点上的 I/O 访问记录, websearch 收集自搜索引擎15。Table 1 Real-world traces used for evaluations 表 1 实验所采用的实际应用中的 trace 下载原表 4.2 缓存算法比较实验结果与分析如图 710 所示, 我们将访问序列折叠 (FAS) 算法与 LRU 算法、L2ARC 算法和Sieve S
37、tore 算法进行比较。可以发现, LRU 算法由于没有对写入量进行限制, 命中率一般要好于改进型算法 L2ARC 和 Sieve Store;但从写入量上看, 改进型算法的写入量与 LRU 相比却是量级上的差距。FAS 与 LRU 在命中率上因不同的磁盘访问记录而异, 最多相差 17%, 但此时的写入量只有 LRU 算法的十分之一;命中率相差不足 10%时, 写入量是 LRU 的百分之一, 甚至在局部性比较好的访问记录 (如 metanodej) 下, 命中率相差不足 1%时, 写入量也减少到 LRU 的算法的十分之一, 可见 FAS 能够在保证一定写入量的同时有效的减少写入量。与改进型算法
38、 L2ARC 相比, 我们对 L2ARC 进行参数的调试之后发现, 若想保持写入量在一个较低的水平, 则需要大幅牺牲缓存命中率 (30%左右) , 图 710中的结果是其命中率与其他算法相当时, 写入量最低的结果。由于随机选择写入 SSD 的数据, 好数据的比例在 SSD 中并不占优势地位, 造成在局部性较好的访问记录中, 写入量下降不明显且命中率也不理想的情况, 而 FAS 算法在相同的环境配置下, 无论是从命中率还是写入量, 性能都优于 L2ARC。写入量基本保持在 L2ARC 的十分之一。对于数据读取更为随机的 websearch, 访问序列折叠算法的命中率略高于 L2ARC, 但写入量仍明显减小, 仅有其二分之一。Fig.7 Hit rates and SSD writes under trace as2 图 7 as2 下各算法的命中率及写入量 下载原图Fig.8 Hit rates and SSD add in under trace dslct 图 8 dslct 下各算法的命中率及写入量 下载原图