123012013137_叶邦宪_林铭炜_自适应的高性能闪存缓冲区替换算法解析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
福建师范大学
毕业论文
题目:自适应的高性能闪存缓冲区替换算法姓名:叶邦宪
学院:软件学院
专业:软件工程
学号:123012013127
指导教师:林铭炜
自适应的高性能闪存缓冲区替换算法
软件学院软件工程专业
123012013127 叶邦宪指导教师:林铭炜
【摘要】闪存具有存取速度快、抗震性强以及功耗低等优势,已广泛运用于嵌入式系统和消费电子设备,因此闪存可能在未来成为取代机械硬盘的存储介质。
但是目前由于闪存的读写不一致特性,针对硬盘开发的缓冲区替换算法无法直接应用于闪存,所以研发最适合闪存的缓冲区替换算法势在必行。
本文根据基于概率和替换代价的原理,提出了一种基于预期的闪存缓冲区替换算法--AH-PBR算法。
该算法采用了冷热探测机制、基于预期管理的概率替换机制和ARC硬盘缓冲区替换机制,使得本算法具有较好的性能。
在通过对AH-PBR算法和国内外目前的闪存缓冲区替换算法进行对比测试,从命中率、物理读操作、物理写操作几个方面进行对比,并且附上了不同情境下的各个算法的性能,确保能全方位的展示AH-PBR算法的优势与劣势。
相信本文能为以后更好更深入的研究闪存缓冲区替换算法提供独到的思路。
【关键词】闪存数据库,缓冲区替换算法,传统机械硬盘
目录
1. 引言 (1)
1.1 研究背景与意义 (1)
1.2 本文研究内容 (1)
1.3 本文结构 (2)
2. 相关工作 (3)
2.1 经典的替换区置换算法 (3)
2.2 面向缓存的数据库缓存区置换算法 (4)
3. AH-PBR算法详述 (7)
3.1 算法由来与结构 (7)
3.2 算法思路 (8)
3.3 算法设计 (9)
3.4 AD-LRU算法与AH-PBR算法实例分析 (11)
3.5 本章小结 (12)
4. 实验设计与结果 (13)
4.1 实验目的、实验环境和测试方案 (13)
4.2 命中率 (15)
4.3 物理读操作 (16)
4.4 物理写操作 (17)
5. 结束语 (19)
致谢 (20)
参考文献 (21)
1. 引言
1.1 研究背景与意义
在计算机应用方兴未艾的当下,计算机在各个领域有着独到的应用,解放了人类的思想,使人们有更多时间去思考和创造。
对于计算机而言,存储介质[1]就好像人类的大脑,十分重要,因此存储器的性能直接关系到整个计算机的性能。
目前市面上的较为普及的存储设备主要分为两种,机械式硬盘和闪存(电可擦除可编程只读存储器的变种)。
表1-1 闪存固态盘与传统磁盘的对比参数
存储介质闪存固态硬盘传统磁盘
内部组成NANDFlash、控制IC 马达、碟片、磁盘、转轴外观尺寸(cm)60-67 65-68
重量(g)48-90 98-115 读写功耗(w)0.13-1.0 2.4-2.5 使用中抗震度(G/ms)>1000/0.5 250-275/2
未使用中抗震度(G/ms)1500-2000/1 800-900/1 使用中噪音(dB)0 2.9
平均延迟(ms)0.2-0.4 8.33 持续传输速度(MB/s)110 32-56
机械式硬盘具有较大的存储容量和相对低廉的价格,使得在选择大容量存储装置时多选择机械式硬盘,但是机械式硬盘因为涉及到机械活动,在随机寻找的时候需要移动磁头寻找目标所以难以快速找到。
因此,在不需要频繁移动磁头的顺序读写过程中,机械式硬盘更优秀,但是随机读取需要不停的调整磁头的顺序,随机读取的性能往往不如人意。
闪存具有防震、噪音小、省电、代价不一致[2]、能耗低、快速的读写性能[3]、体积小、断电防丢失[4]等特征,可以弥补硬盘的缺点。
NAND型闪存采用双层浮栅MOS组成,因为一个片内的原极是连接在一起的,每次擦除需原极加电压擦除,所以擦除需要整片擦除或分块擦除,因此因为整区删除的原因闪存的擦除的IO开销数量远远大于硬盘,这就是为何闪存读写删除操作的代价不一致的原因。
随着物理材料学和电子工艺的发展,闪存的造价越来越低,存储容量和存储速度越来越快,闪存比传统磁盘有着更加广泛的应用前景,从这个趋势来看,基于闪存的存储器将比硬盘存储器发展的更快且占据更大的市场。
因为闪存存储具有非易失性,在突然丧失能源提供后也能稳定的存储数据,因此可以与磁盘一样稳定存储数据。
由于传统数据库系统中的各类数据结构和逻辑算法都是针对磁盘开发的,没有根据闪存的擦除代价比读写IO开销更大的特征来设计,所以无法挖掘出闪存的全部潜能,甚至在一些极端情况下甚至表现出比磁盘更差的性能,因此全新的针对闪存的特征开发的算法有着较高的价值。
1.2 本文研究内容
根据闪存数据库[5]的读写代价不对称的特点和NAND型闪存整区擦除的特性,如何研究出在保证整体性能不变的情况下,提高命中率,降低物理读操作和物理写操作的数量是一件具有意义的事。
在研究目前国内外的缓冲区置换算法的时候,发现无论AD-LRU还是CCF-LRU还是FOR算法,都是基于当前的数据环境来设定数据页的权重,有点用数据页的频度和热度,有的用热区和冷区分开来防止不同的数据页,这些做法都是通过尽量长的使冷脏页驻留缓冲区来减少写操作代价,是有利于提升命中效率。
但是本文也应该注意到一个关键性的问题,那就是脏页过长时间驻留缓冲区其实是减少了热数据页的
空间,这样又反过来降低了命中率,而且会引起连锁的读写操作。
因此基于这个问题,本文设计了全新的自适应的高性能闪存缓冲区替换算法--AH-PBR算法(Adaptive High Performance Flash Buffer Replaceme nt Algorithm),这个算法采用冷热探测机制、基于预期管理的概率替换机制和ARC硬盘缓冲区替换机制来更好的平衡冷脏页在缓冲区带来的益处和坏处,保证收益能大于代价,使得能尽量少的进行读写物理操作。
AH-PBR算法的替换思路很大一部分来源于适用于硬盘的ARC算法,因为硬盘不会出现读写代价不对称的状况,适用于硬盘的ARC算法将缓冲区分做了冷区和热区,分别用于放置只使用过一次的数据页和多次使用的数据页,但是并没有对数据页进行标注究竟何是冷还是热,是脏还是干净。
因此始终替换最近最不常使用(LRU)端的数据页,这样就无法通过优先驱逐干净页获得更好的I/O性能,所以适用于硬盘的ARC算法在硬盘能获取较高的I/O性能但是在闪存环境下并不能获取较高的I/O性能的原因由来。
AH-PBR算法采用冷数据判断机制,缓冲区里面的数据页分为冷干净页,热干净页,冷脏页,热脏页。
因为在闪存缓冲区内由于电压擦除和加压的过程时耗不一样,所以有着读和写不是一个数量级,因此进行读操作还是写操作对于闪存来讲就很关键。
又因为本文的替换算法是始终替换最不常使用(LRU)端的数据页。
因此在干净页中,替换冷干净页的代价比替换热干净页的代价来的高;在脏页中,替换冷脏页的代价比替换热脏页的的代价来的高。
AH-PBR算法将缓冲区分为冷区T1和热区T2,用于存放只访问过一次的数据页和存放访问过多次的数据页,冷区和热区的大小是动态调整的并且始终满足两者的大小不大于缓冲区大小。
与此同时,传统的数据链旁边,AH-PBR算法新建了两条指针链并设置最近最常使用(MRU)端和最不常使用(LRU)端,分别是T1冷区指针链和T2热区指针链,这两条指针链分别用于存储T1中的冷干净页和T2中的冷热干净页的数据页地址和页号。
因为这类的指针链只是存储相关的数据页地址和页号,并不占多少的存储空间。
当有新的干净页进入时,链接到该指针链的最近最常使用(MRU)端,如果有数据需要从这个区域移除,那么在链表中找到并移除该指针。
在AD-LRU算法中,采用了FC指针,用于指向下个可能需要操作的数据页,但是因为算法的过程中,无法预测下个或者若干个数据页的性质,是冷还是热,是干净还是脏。
FC指针指向冷区冷干净页中最靠近最不常使用(LRU)端的冷干净页,那么每一次更新都需要遍历读取冷区中的数据页,直到找到一个新的最靠近最不常使用(LRU)端的冷干净页。
如果使用指针链,FC就不需要进行遍历,直接指向T1冷区指针链的最靠近最不常使用(LRU)端,可以直接读取。
如果冷区大小为1000个数据页,在大量数据读写操作后,可以明显预见到,冷区中干净页被驱逐,大量的脏页保留下来,如果在此中只有一个冷干净页,那么最好的情况是在查询端,最差情况是需要遍历10000个数据页最后才查到。
但是查询T1冷区指针链,只有唯一一个,意味着只要查询一次就好了。
另外,通过统计两条指针链的长度,就可以了解到T1中的干净页数量和T2中的干净页数量。
因此,指针链来代替传统的FC指针在数据大量运算的情况下,不仅有更好的查询效率,还能得知缓冲区的干净页数量。
AH-PBR算法基于概率替换T2热区指针链中的冷干净页和冷脏页,其次是热干净页。
当T2热区指针链为空时再从T2的最不常使用(LRU)端开始从后往前遍历读取热干净页。
这样既加快了干净页的读取速度,也避免了AD-ARC算法中的冷区全为冷脏页的情况。
1.3 本文结构
本篇论文分为五个章节。
第一章节介绍了闪存的为何比硬盘更加优异的原因并给出了研究闪存的意义,以及本文的研究方向。
第二章节介绍了目前国内外比较常见的集中缓冲区替换算法,并且给出了详细的图文介绍。
第三章节提出了新型自适应的高性能闪存数据库缓冲区置换算法,并通过图文结合的形式介绍自适应的高性能闪存数据库缓冲区置换算法的思路。
第四章节介绍了实验所用的系统和测试数据详情,并且就物理读操作,物理写操作,命中率三个方面对不同的算法进行测试对比,并解释其中的一些现象的原因。
第五章节主要针对研究过程中的得失进行总结,并探讨了以后的研究方向。
2. 相关工作
2.1 经典的替换区置换算法
目前,有关于闪存数据库的研究方向有闪存存储管理、闪存数据库索引、闪存数据库缓冲区替换算法、闪存数据库管理和闪存事物处理。
其中闪存数据库缓冲区替换算法是一个比较好的突破口。
国外的面向闪存数据库缓冲区替换算法主要有:LRU 、CF-LRU 、LRU-WSR 、CCF-LRU 和AD-LRU 算法,其中LRU [6]
算法是最具有代表性的闪存缓冲区置换算法,因为其他算法都是基于LRU 算法进行改进研究出来的。
国内也有大量的闪存数据库置换算法的研究,这些算法都是主要考虑到闪存读写不对称、替换页的代价不同等特性充分考虑缓冲区页的访问频度,用开销较小的读操作代替开销较大的写操作,减少拖靶的现象发生,这些算法包括:基于代价概率的闪存缓冲区算法、ICAR 算法和基于替换概率的闪存缓冲区替换算法。
LRU 算法根据数据页在链表的位置,采用了最近最少使用策略[7],目前的算法基本上都是采用了LRU 算法或者类LRU 算法。
LRU 算法有很多形式,最普遍的形式是链表结构,每个数据页有自己独特的专有frame_id 、指向MRU 端的LRUElement->Morement 指针和指向LRU 端的LRUElement->Lessment 指针。
通过LRUElement->Lessment 和LRUElement->Morement 相互指向,来链接数据页,并把最少使用的数据页作为LRU 端,最多使用的数据页放置在MRU 端。
当一个数据页P1需要操作的时候,首先从LRU 端开始逐个查询对比直到到MRU 端,如果遍历过程中找到了,那么就将P1放入MRU 端。
如果没有找到且缓冲区未满,那么就将P1读入MRU 端,如果没找到且缓冲区已满,那么采用替换策略。
LRU 算法替换原则是将最少使用的页驱逐出缓冲区,将新的数据页移入MRU 端。
因为没有获取数据访问的频度特征和脏页容易堆积在LRU 端,替换这些脏页容易产生大量的读写操作,带来不必要的性能恶化。
LRU
MRU
LRU
MRU
LRU
MRU 图 2-1 LRU 算法实例
图2-1是LRU 算法在不同情况下的操作流程。
本文以五个数据页为例,没有数据读入的静止状态如图
2-1(a),通过颜色和语言标识可以看出P1,P2,P5是脏页,其他是干净页,当一个P2的读标识达到系统后,算法会首先检查链表中是否含有P2,当发现有的时候,将P2左右的数据页相互连接然后将P2移到MRU 端如图2-1(b)。
当一个P6的读操作达到系统,算法会首先检查链表中是否含有P2,当发现没有的时候,则要从存储器中将P6的元素放入缓冲区,此时缓冲区容量已经达到上限,无法再增加新的数据页,则将现处于链表尾部的数据页P1移除缓冲区,如图2-1(c)所示。
2.2 面向缓存的数据库缓存区置换算法
在闪存设备还未普及的时候,大多数缓冲区替换算法是为硬盘设计的,在读写一致的情况下,提高数据页的命中率,减少拖靶的情况的发生。
但是闪存缓冲区内由于电压擦除和加压的过程时耗不一样,所以有着读和写不是一个数量级,对于已写过的数据页操作而且会引发代价更高的擦除操作,所以更是提高了算法的代价。
由此,区分读操作和写操作成为了优化LRU 算法的关键,而传统LRU 算法直接删除LRU 端的数据页,没有考虑到读写不同的代价,因此降低数据页的命中率和加大性能开销。
CF-LRU [8]的基本思想是尽可能的减少脏页的驱逐操作,尽可能减少替换的代价[9],改为对干净页的驱逐操作,使得脏页在闪存中比干净页停留更长的时间.
LRU MRU
LRU MRU CCF 链ML 链
LRU MRU
LRU MRU CCF 链ML 链
LRU MRU
LRU MRU CCF 链
ML 链图 2-2 CF-LRU 算法实例
图2-2是CF-LRU 算法在不同情况下的操作流程。
本文以五个数据页为例,没有数据读入的静止状态如图2-2(a),通过颜色和语言标识可以看出P1,P2,P5是脏页,其他是干净页,W 冷区和整体比例为0.6,一共3个干净优点替换区域和两个工作区域。
当一个P2的读标识达到系统后,算法会首先检查链表中是
否含有P2,当发现有的时候,将P2左右的数据页相互连接然后将P2移到MRU端,如图2-2(b)所示。
当一个P6的读操作达到系统,算法会首先检查链表中是否含有P2,当发现没有的时候,则要从存储器中将P6的元素放入缓冲区,此时缓冲区容量已经达到上限,无法再增加新的数据页,则将现处于干净优先替换区域链表尾部的数据页P1移除缓冲区,如图2-2(c)所示.
LRU-WSR[10]替换算法为了减少因为脏页的驱逐而引起的性能的额外开销。
因为CF-LRU算法虽然优先删除了干净页,但是并没有区分不同的干净页的替换代价,无法直观的用逻辑证明替换不同的干净页有着不一样的效果,所以LRU-WSR算法采用了冷探测技术,通过每个数据页都设置了一个冷标志位以此判断该数据页被访问的频度,当为冷时,该标志位为1;当为热时,该标志位为0,将缓冲区里面的数据页分为冷干净页,热干净页,冷脏页,热脏页。
如果一个页的冷标志位为0,则延迟把该脏页回写到内存,并且把其设置为冷页移至MRU位置,在重新从LRU端找干净页或者冷脏页。
LRU MRU
LRU MRU
P3
LRU MRU
图2-3 LRU-WSR算法实例
图2-3是LRU-WSR算法在不同情况下的操作流程。
本文以五个数据页为例,没有数据读入的静止状态如图2-3(a),通过颜色和语言标识可以看出P1,P2,P5是脏页,其他是干净页。
当一个P2的读标识达到系统后,算法会首先检查链表中是否含有P2,当发现有的时候,将P2左右的数据页相互连接然后将P2移到MRU端,如图2-3(b)所示。
当一个P6的读操作达到系统,算法会首先检查链表中是否含有P2,当发现没有的时候,则要从存储器中将P6的元素放入缓冲区,此时缓冲区容量已经达到上限,无法再增加新的数据页,然后发现LRU端的P1数据页是热脏页则将其设置为冷脏页并移至MRU位置并再次调用
LRU-WAR算法,此时LRU位置P3为冷脏页则替换该页并把P6页放入链表的MRU位置,如图图2-3(c)所示。
CFLRU算法和LRU-WSR两个算法为了减少脏页被驱逐而导致的额外的IO开销而优先驱逐干净页,但是由于热干净页会由于无法识别而被替换,会导致整体性能下降。
针对以上缺陷从而有人提出了
CCF-LRU算法思想。
CCF-LRU算法的数据结构包括两个链表,是冷区CCL链表,一个是热区ML链表。
ML链表内含有热干净页和脏页,CCL链表含有冷干净页和冷脏页。
因为CCF链表相比有访问几率更少,所以将其优先替换,当CCL为空才按照LRU-WSR策略替换ML链表中的数据页的方式来调整数据页的
替换。
优点是:获取了干净页和脏的访问频度。
缺陷是:无法探测热干净页,在进行页的替换时,CCF 链表相比于ML 链表被访问的机会更小,所以优先选择CCF 链表,当大量的数据读写后,CCL 链表因为优先驱逐的关系而变为空。
这时当新的干净的数据页进入其中,在极端情况下该页可能在下次的操作过程中就被驱逐。
LRU MRU
LRU MRU CCF 链ML 链
LRU MRU
LRU MRU CCF 链
ML 链
LRU MRU
LRU MRU CCF 链ML 链
图 2-4 CCF-LRU 算法实例
图2-4是CCF-LRU [11]算法在不同情况下的操作流程。
本文以五个数据页为例,没有数据读入的静止状态如图2-4(a),通过颜色和语言标识可以看出P1、P2是干净页,P3是冷脏页,P4、P5是热脏页。
当一个P2的读标识达到系统后,算法会首先检查链表中是否含有P2,当发现有的时候,将P2左右的数据页相互连接然后将P2移到MRU 端并把冷标记位设置为热标记,如图2-4(b)所示。
当一个P6的读操作达到系统,算法会首先检查链表中是否含有P2,当发现没有的时候,则要从存储器中将P6的元素放入缓冲区,此时缓冲区容量已经达到上限,无法再增加新的数据页,此时CCF-LRU 算法会检测CCL 链表的LRU 位置的P1数据页发现是干净页则将替换,然后将P6页移到CCL 链表的MRU 位置,如图2-4(c)所示。
3. AH-PBR算法详述
3.1 算法由来与结构
当缓冲区需要读入一个数据页的时候,AH-PBR算法根据下面的步骤进行系统操作,如图3-1:(1)当前缓冲区是否存在操作目标;
(2)如果当前的缓存区存在操作目标,那么就将其移到MRU端;
(3)如果当前目标不存在,且有空余区域,那么将目标读入缓冲区;没有空余区域那么在缓冲
区内部寻找最不可能命中的数据页将其替换;
(4)若替换页为只读页,则直接移动缓冲区中的请求页;若替换页为读页则需将数据页写回外
存然后读取;
图3-1 缓冲区指令逻辑
其中,步骤一和步骤二查询目标数据页是否在缓冲区内,采取了反向遍历链表的原则,因此前两步寻找缓冲区中已知的数据页可通过O(1)代价完成。
步骤三和步骤四是缓冲区替换算法的核心,每一个次冷区驱逐页要么是驱逐冷区的干净页,要么驱逐冷区脏页,干净页已经被列为了干净页栈每次驱逐从栈的LRU 端开始驱逐就好了,脏页则从尾部开始驱逐,所以无需遍历,因此本算法的时间复杂度为O(1)。
AH-PBR算法是一个集思广益的算法,在LRU、CF-LRU、LRU-WSR、CCF-LRU和ADLRU算法等闪存算法汲取精华,根据基于替换概率的缓冲区替换算法和硬盘中使用的ARC算法结合起来,通过对于缓冲区大小,干净页在链表中的存量情况和读写开销的比例进行概率替换,大体上解决了干净页刚刚进入缓冲区就被驱逐的情况。
图3-2是AH-PBR算法的研究过程。
图 3-2 AH-PBR 算法研究过程
AH-PBR 算法的核心理念就是在硬盘ARC 算法的页面换位的基础上,对于数据页的替换的理念做出来创新,在传统的基于系统读写操作的时间消耗来做替换,还是对于数据的权重来做替换,还是对于冷热标志来做替换,都只是基于目前的数据缓冲区的情况来做出反应,这缺乏对于未来的预期,在未来数据读入发生改变的时候,那么在修改读写替换的概率会导致命中率下降。
AH-PBR 算法将缓冲区分为冷区T1和热区T2,用于存放只访问过一次的数据页和存放访问过多次的数据页,冷区和热区的大小是动态调整的并且始终满足两者的大小不大于缓冲区大小。
与此同时,传统的数据链旁边,AH-PBR 算法新建了两条指针链并设置最近最常使用(MRU )端和最不常使用(LRU )端,分别是T1冷区指针链和T2热区指针链,这两条指针链分别用于存储T1中的冷干净页和T2中的冷热干净页的数据页地址和页号,如图3-3所示。
LRU
MRU
LRU
MRU
P1P2
P3
P4
P5
P6
P3
P5
P6P7(已被移除)
P8(已被移除)
图 3-3 AH-PBR 算法数据结构
3.2 算法思路
一个算法的优异性体现在命中率、物理读操作、物理写操作三方面。
提高高命中率能有效的减少读写操作,擦除操作,减少了时间消耗,但是另一方面如果单纯为了提高命中率而牺牲掉读写操作,使得读写操作数量大幅提升,影响到了闪存的有效寿命,那么难以称之为合格的面向闪存缓冲区替换算法;如果单纯是为了加快系统运行速度,节约时间,牺牲掉了命中率和读写操作,那么这个算法难以称为是好的算法。
因此,在算法设计的时候,就要顾虑到这三个方面,着眼于提高整体的I/O 性能而非单方面的提高。
在之前的算法介绍中,有一些现有的算法如(CF-LRU 算法和LRU-WSR 算法)都没有考虑到数据页的访问的频率,没有区分数据的冷热性,难得提高整体的I/O 性能。
另外有一些算法(CCF-LRU 算法和AD-LRU 算法)尽管考虑到了数据的冷热性,但是依旧难以避免两个问题。
问题一,AD-LRU 算法在冷区总是优先替换冷干净页,当数据大量读取后,很可能冷区被冷脏页给占满,新的冷干净页刚刚进来就被替换出去。
问题二,当系统运行一段时间后,冷热区的容量趋于一个稳定的比例,这样无法突出冷热区自动调整的优越性。
本文提出的高性能的自适应缓冲区替换算法能相对有效的解决上述问题。
本文通过下文将高性能的自适应缓冲区替换算法的要点罗列出来:
AH-PBR 算法采用冷数据判断机制,缓冲区里面的数据页分为冷干净页,热干净页,冷脏页,热脏页。
因为在闪存缓冲区内,有着读写不对称性,读操作和写操作不是一个数量级,因此读的时间开销远远大于写的时间开销。
又因为本文的替换算法是始终替换最不常使用(LRU )端的数据页。
本文给每个数据页都设置了一个冷标志位,当为冷时,该标志位为1;当为热时,该标志位为0;通过不同的数据类型,本文将整个缓冲区规划为四大部分:T1为冷区,主要放置只访问过一次的数据页和很久没访问过的数据页。
T2为热区,其中的数据页大多是近期访问过的。
B1为冷虚区,用于放置替换T1时用的页号。
B2为热虚区,用于放置替换T2时用的页号。
B1和B2不储存真实的数据页,只是储存页号和地址,这样相当将缓冲区容量扩大一倍,但是总体而言利大于弊。
首次进入缓冲区的Page 进入冷区的MRU (Most Recently Used )端,当缓冲区的页被命中后将该命中页移至热区MRU 端。
当有新的干净页进入时,链接到该指针链的最。