贾德明,朱明胜,古 妍
(山东鲸鲨信息技术有限公司,山东 泰安 271000)
随着5G、云计算、大数据、物联网等信息技术的发展,数据呈爆炸式增长,对存储系统的海量数据存储能力提出了高性能、多样化的访问要求[1]。针对数据访问局部热点的特性,通常将高频访问的数据缓存在高速存储介质上,以加快数据读写速度[2]。缓存控制策略是缓存系统的核心,决定了缓存空间利用的有效性[3]。传统的缓存策略都是基于访问时间或访问频率进行设计[4-5]。提高缓存命中率可以提高应用程序的运行速度,这是提高缓存性能的关键[4]。基于访问时间仅考虑了时间局部性,忽略历史上的高频访问数据;基于访问频率仅考虑高频访问数据,忽略最近访问的数据可能成为访问热点[6]。两种策略均不能有效满足现有热点数据缓存需求。
缓存数据生命周期控制的核心是根据对数据价值的精准判断,然后根据数据价值将数据分配到对应的、性能合适的存储设备上[7]。据研究结果表明,存储系统中的数据70%~80%是静止不动的,数据写入后很少被访问。经常访问的热点数据占20%~30%[8]。其中间歇性热点数据的假性降温表现,可能会从高速缓存介质中移除,一旦被移除,数据块可能因为缓存中暂时性高频访问数据而很难再次迁入缓存层,而导致后面访问持续性延迟过高,影响上层应用运行效率。
在较为复杂的数据访问场景中,传统基于访问时间和基于访问频次的策略对于热点数据的预测略显不足,如图1所示。
图1 访问频次访问时间示意图
假设存在缓存块D1、D2、D3,基于最近访问时间排序,优先级为D2,D3,D1;基于访问频率排序,优先级为D1,D2,D3;在基于最近访问时间的策略中,D1 将被淘汰,但D1会频繁访问数据,只是最近一段时间没有被访问,因此D3 替换将来可能被访问的D1;在基于访问频率的策略中,未考虑访问频率的动态性,导致D1 和D2 的访问频率相同,事实上最近访问的高频数据D2 再次被访问的可能性更大,不符合实际访问规律[9]。CVSL策略综合考虑最近访问时间和访问频率,优先级排序为D2 >D1 >D3,能够反映数据访问频率随时间变化的变化,更能适应热点数据的访问特点。因此CVSL策略克服了基于最近访问时间和基于访问频率缓存策略的不足。
自动分层的数据迁移是定时执行的,短时间内无法快速响应热数据的变化[10-13]。例如,当出现新的热数据时,缓存在第一次访问时就会将其调入SSD,接下来的读请求都能直接从SSD访问;而分层架构,必须等待一段时间(数据迁移涉及不同层之间空间交换,必须后台执行),才会将新的热数据迁移到SSD,那么在这段时间内,是无法享受到SSD的高性能的,甚至在极端的情况下,可能该数据被迁移到SSD后,热度已过。另一方面,分层的优点是其有足够的时间更准确地识别冷热数据(识别顺序IO)。因此,缓存适合负载变化迅速的场景;分层适合静态的负载(冷热数据很少变化)。
此外,固态硬盘由于写前擦的硬件特性,非对齐访问会导致写放大,不能充分发挥固态盘性能优势,而且降低了SSD使用寿命[14-19]。
基于上述问题,研究设计了一种基于虚拟存储层的缓存控制策略,该策略引入了虚拟存储层的概念,综合缓存技术和自动分层技术的优缺点,CVSL在结合访问时间策略和访问频率策略基础之上,引入虚拟存储层概念,有效甄别数据访问热度,避免因间歇性访问的假性冷数据被移除缓存,提高整体缓存命中率。
结合分层存储中热数据、温数据、冷数据的概念,虚拟存储层承载访问频次的统计,充分考虑间歇性局部热点数据的访问特点,尽量避免热点数据因暂时冷却被迁入低速存储介质,将热数据直接降级为冷数据,同时对顺序写IO不缓存,再没有增加硬件成本的情况下,提高了缓存命中率,充分发挥固态硬盘优势,提升了综合访问性能。
虚拟存储层是通过软件划分出的一个虚拟存储域,逻辑上是位于高速存储介质和低速存储介质之间,存储温数据。对于迁入虚拟存储层的数据块,仅缓存其块描述信息,对应数据实际存储在低速介质中。虚拟存储层不存储实际数据,数据会直接存储在低速存储介质,但在虚拟存储层中保留数据块的访问时间,访问频次等信息。在虚拟存储层中的数据会根据访问热度决定数据是重新迁入高速存储介质还是迁入低速存储介质。其中,数据块在虚拟存储层和低速存储介质之间流动,只需要移除该缓存块的块描述信息据即可,无须数据迁移,不会增加低速存储介质额外的IO负担。
CVSL缓存控制逻辑架构如图2所示。
图2 CVSL缓存控制逻辑架构
数据物理从高速存储介质(SSD)和低速存储介质(HDD)之间迁移,逻辑上从高速存储介质、虚拟存储层、低速存储介质之间迁移。温数据和冷数据均存放在低速存储介质HDD上。
CVSL缓存系统由以下模块组成,如图3所示。
图3 CVSL模块组成
1)缓存控制模块,主要负责缓存数据的基本控制功能,按照SSD物理特性设计的,根据SSD擦除块以chunk为最小单位(默认512K)分配SSD空间,使用B+树、最近最少使用(LRU,least recently used)链表、最不经常使用(LFU,least frequently used)链表混合方法来跟踪缓存数据,缓存数据可以是chunk上的任意一个扇区。最大程度上减少随机写的代价。定期唤醒或者达到空间阈值上限回写缓存脏数据。
缓存页控制根据SSD擦除块大小将SSD空间分成若干个chunk。缓存数据与元数据都是按chunk来组织的。
(1)分配器:COW(copyonwrite)式的空间分配,分配的单元是chunk,数据在chunk内部全部都是追加写入的,不会出现覆盖写,当有覆盖写时,会重定向到新的数据块。
(2)元数据部分:B+树节点数据是最主要的元数据,也是COW式分配,对于B+树节点的修改,需要先分配新的节点,将新数据写入,再丢弃老的节点。
2)逻辑迁移模块,主要负责根据数据块的访问时间访问次数信息进行热度统计,根据统计结果在虚拟存储层和数据存储层之间进行逻辑调度。
3)虚拟存储模块,主要负责维护迁入虚拟存储层数据块的热度信息以及与数据存储层的映射关系。逻辑上使用page(4k)为最小单位管理数据块。虚拟存储层在内存中开辟一定空间,暂存待迁入数据块,多个数据块合并后按照chunk对齐迁入,降低SSD写入次数,尽量避免数据抖动影响性能。
4)数据存储模块,主要负责实际存储所有的数据块,包括虚拟存储层的数据块,因为数据存储层一般容量较大,所以采用1 M为最小单位管理数据块,后面可设计为可变模式,支持1~64 M可调节。
数据存储格式如图4所示。
图4 数据存储格式
相比传统策略,CVSL综合考虑了访问时间策略和访问频率策略,兼顾了SSD的物理特点,并且缓存块在移除缓存层时,其访问时间访问频次等信息仍维护在虚拟存储层和数据存储层中。数据热度信息在数据块整个生命周期中均有效,有助于缓存层、虚拟存储层和数据存储层进行热点数据追踪。
CVSL通过缓存页管理将热点数据存储在高速介质上,虚拟存储层位于IO缓存层和数据存储层之间,将温数据和冷数据逻辑隔离,防止冷热数据频繁迁入迁出造成抖动,造成性能波动,提高热点数据命中率。
缓存控制模块采用B+树索引管理HDD和缓存数据的映射关系,建立LRU和LFU两个链表,根据访问时间和访问次数控制缓存块的迁入迁出。
当有上层应用访问未在缓存中,但对应block在虚拟存储层时,判定该缓存页为热点数据,调入缓存层,根据LRU和LFU链表移除最长时间没有使用以及最近最不常用的缓存页。
当有上层应用访问为在缓存中,且对应block未在虚拟存储层时,暂不将数据块迁入缓存层。
被移除的缓存页由调度模块管理,根据其数据热度迁入虚拟存储层,或者数据存储层。如果缓存页为非脏数据,该过程为逻辑分层,仅涉及元数据修改,不会对机械盘进行读写操作。
缓存控制模块还承载着脏数据回写的功能。当缓存层中脏数据达到一定阈值会主动触发回写线程进行脏数据刷写;内置定时器会触发回写线,定时扫描脏数据块进行脏数据回写。
脏数据回写时不会更新数据块访问次数、访问时间等信息,直接写入数据存储层,防止内部数据刷写影响虚拟存储层的数据热度评估,造成缓存数据块热度出现偏差;
数据在写入数据存储时,合并排序写入,充分利用机械盘的特性,提高数据写入效率。
上层请求到达时,如果是顺序IO,则不进行缓存,直接绕过缓存控制层;如果数据块在SSD缓存层,则直接读写访问并向上返回请求结果;如果缓存未命中,则访问虚拟存储层。
如果数据在虚拟存储层,则根据映射关系在数据存储层访问数据,向上返回请求结果,并且将该数据块调入缓存层(此处会尝试多个缓存页合并调入缓存层,减少SSD写入次数)。
如果未在虚拟存储层,则继续向数据存储层请求,未再虚拟存储层的数据块只更新访问次数信息,不立即调入缓存层。
访问完毕后,更新内存中对应block的访问时间、读写次数等信息。
由于虚拟存储层仅存储缓存块的块描述信息,使用较小的空间即可存储较大范围的块描述信息,即可在较大范围内筛选间歇性热点数据,有效提高了此类数据的缓存命中率。
IO缓存层最大程度上保护数据,在系统异常关机时数据仍然是可靠的。因为只有在数据完全写回存储设备才确认写成功。SSD的特点就是随机IO性能很高,而对于顺序IO提升却并不大,所以会检测顺序IO并透传给数据存储层。
访问流程如图5所示。
图5 应用访问流程图
热度统计线程会周期性遍历设备所有的block,block的热度由4个参数衡量,包括最近写时间、被写次数、最近读时间、被读次数。
逻辑上升的block满足:1)自上次统计以来,被写次数大于Whicount;或者,2)自上次统计以来,被读次数大于Rhicount。满足条件的block按被访问时间和被访问次数降序排列,热数据块在前,形成逻辑上升数据块链表Queueup。
逻辑下降的block满足:1)自上次统计以来被写次数小于Wlowcount;并且,2)自上次统计以来被读次数小于Rlowcount。满足条件的block按被访问时间和被访问次数升序排列,冷数据块在前,生成逻辑下降数据链表Queuedown。
Whicount为写次数高水位线,Rhicount为读次数高水位线,Wlowcount为写次数低水位线,Rlowcount,为读次数低水位线,可以根据实际业务调整,注意需满足Whicount≥Wlowcount,Rhicount≥Rlowcount,默认Whicount=Wlowcount=Rhicount=Rlowcount=AVGrwcount(平均读写次数)
热度统计完毕后,热度统计线程会清除数据块中的访问时间、读写次数信息。热度统计流程如图6所示。
图6 热度统计流程图
在确定了需要向上或者向下迁移的block后,数据迁移线程将待迁移的block逐个迁移。在迁移每个block前会判断是否停止此次迁移任务。停止的条件有:1)迁移线程工作时间限制,如果超时就中止这次迁移;2)检查目前虚拟存储层的逻辑利用率,如果利用率为大于95%,则只允许向下迁移任务;如果利用率小于60%,则只允许执行向上迁移任务;如果利用率大于60%小于90%时,则同时允许执行向上迁移和向下迁移任务。
该数据迁移不会对数据块进行读写,仅修改虚拟存储层的逻辑关系,不会对机械盘造成额外的性能负担。由于缓存层管理单位为page=4 k,数据存储层管理单位为block=1 M。所以当命中虚拟存储层block时,仅将其访问的page调入缓存层,不需要加载整个block。
逻辑迁移流程如图7所示。
图7 数据逻辑迁移流程图
由于写入数据存在热数据:温数据:冷数据=15%:5%:80%的特点,建议SSD:HDD容量比为(15+5)%:80%。其虚拟存储层block总数计算公式如下:
Cblock=Vhdd×(15%+5%)÷Sblock
(1)
式中,Cblock代表虚拟存储层管理的block总数,Vhdd代表磁盘容量(单位MiB),Sblock代表block大小(单位MiB)。
为了验证CVSL中基于虚拟存储层设计的缓存管理和动态迁移策略的有效性,本节采用具有代表性的Linux开源缓存加速软件dmcache和CVSL模块进行了随机IO性能对比测试实验。
本实验基于FT2000+平台和Linux操作系统,dmcache模块(对应内核版本4.19),50GSSD+1片1TSATA机械硬盘进行测试。测试工具采用fio-3.28,direct访问,排除服务器内存影响。
首先使用fio分别测试SSD和HDD的4K随机读写性能,测试5 min,确保SSD和HDD机械盘性能表现正常。
性能测试流程具体如下:
步骤一:SSD全盘trim后,使用dmcache模块将SSD绑定为HDD的缓存设备。
步骤二:使用fio进行随机4 K随机读写预热模拟应用访问,读写比例为4∶6,预热时间为48 h。
步骤三:预热完毕后,使用fio分别进行4 K随机IO读写测试,测试5分钟,记录测试结果。
步骤四:重复步骤二和步骤三3次,并记录测试结果。
CVSL模块测试方法同步骤一~步骤四。
1)4 k随机写性能测试结果对比,如图8所示。
图8 四次4 k随机写测试结果
dmcache的4次随机写测试结果分别为781,712,799,752,平均值为761;CVSL的4次随机写测试结果分别为840,835,846,841,平均值为840,相对dmcache提升约10.5%。
2)4 k随机读性能测试结果对比,如图9所示。
图9 四次4 k随机读测试结果
dmcache的4次随机读测试结果分别为587,553,580,554,平均值为569;CVSL的4次随机读测试结果分别为620,621,612,627,平均值为620,相对dmcache提升约9%。
从图8和图9可以看出,CVSL相比dmcache模块,随机读写性能均有明显提高,缓存加速性能提高了9%~10%。而且CVSL在进行了4次48小时的模拟应用访问后,4 k随机写IOPS稳定在840左右,4 k随机读IOPS稳定在620左右,性能值比较平稳。从实验结果分析,CVSL在未增加硬件成本的情况下,有效的提高了机械硬盘的性能,而且在模拟间歇性数据访问后,性能没有明显波动,达到了预期设计效果。
在全球数据爆炸性增长的背景下,如何结合固态硬盘和传统机械硬盘的优势应对海量数据的高效存储,具有很高的社会意义和研究价值。针对缓存数据尤其是间歇性频繁访问的缓存数据特点,引入虚拟存储层概念,在传统缓存策略上融合了自动分层技术并做了改进,主要有以下技术优势:1)综合考虑了访问时间和访问频率对缓存块的影响,结合了传统缓存适合负载变化迅速的场景自动分层适合静态负载的特点,对热数据判定更精准。充分利用自动分层热点数据升温和降温较慢,可更准备识别热点数据的技术原理,降低间歇性热点数据变为冷数据的概率,也降低了缓存页抖动对性能造成的影响;2)虚拟存储层和数据存储层之间迁移数据时,仅需修改数据块描述信息和映射关系。缓存层淘汰非脏缓存页时,也是仅做页面信息修改,都不会没有对机械硬盘进行读写操作,不会增加额外的磁盘IO,对访问性能没有影响;3)虚拟存储层不存储真实数据,可在较大范围内承载因暂时不访问被移出缓存层的间歇性热点数据,有效的提高了缓存命中率;4)数据块的访问时间访问频次具有全局性,提高了热点数据追踪效率;数据存储层使用block为最小单位,降低了元数据的占用空间。相比传统缓存策略,在没有增加硬件成本的情况下,降低了缓存页被误判为冷数据的概率,提高了缓存命中率。
基于虚拟存储层的SSD缓存控制策略可应用于磁盘阵列、分布式存储等企业级网络存储系统,能够有效提高在云平台、大数据分析、数据库等高并发随机读写应用场景下的存储访问性能,提高应用系统的响应时间。