基于SSD缓存软件MaxIO的详细解析

描述

闪存SSD基本成为当前IT基础设施中必不可少的元素。高IOPS、低延时和高带宽是SSD的显著特点,单块SSD的IOPS可以达到数万甚至百万之多,带宽达到数GB/s,而延迟仅为几十微秒,性能完全可以和高端存储相媲美。SSD有效消除了计算和存储的巨大鸿沟,解决了I/O性能瓶颈问题,尤其是I/O随机读写能力。

在计算机系统中,CPU中有L1,L2、甚至有L3 Cache;Linux有Page Cache,MySQL有BufferCache/QueryCache;IO系统中RAID卡/磁盘也有Cache;在大型互联网系统中,数据库前面一般也都有一层MemCache。Cache是容量与性能之间取得平衡的结果,以更低的成本,获得更高的收益,是系统设计应遵循的原则。

目前闪存的价格已经逼近SAS硬盘,但相对SATA硬盘还是要高于许多,迫于成本因素,全SSD存储方案应用仍然较少,多数应用以SSD混合存储配置为主,从而获得较高的性价比。通常情况下,我们假设热点数据占10-20%,配置相应比例的SSD存储,采用Cache加速或Tier分层模式将热点数据存储在SSD存储中,一旦热点数据超过预先设置阈值或触发迁移策略,则按相应淘汰算法将较冷数据迁回HDD磁盘存储,从而期望在性能和容量方面达到整体平衡。

当然混合存储也并非完美。SSD擅长的随机读写,带宽并不是它的强项,对于带宽型应用,SSD对性能并没有太大帮助,HDD存储也容易堆叠起来。关于热点数据占比,这个并不好估计,如果SSD配置不足,性能会变得更差,SSD被写满时性能可能会出现较大的波动。因此,实际应用中要结合I/O特点设计合理的混合存储模式,如果实在不合适,还是推荐使用全SSD存储,或者人工将应用负载分配到SSD或HDD存储中。

MaxIO简介MaxIO是一款SSD智能缓存加速软件,利用I/O访问的局部性原理,采用SSD作为传统块设备的缓存,充分利用SSD的I/O特点和性能优势,专门针对慢速的HDD块存储进行高效加速。MaxIO几乎可以为任何块设备创建缓存并提升性能,包括物理磁盘、基于RAID的DAS设备、SAN卷、Device Mapper卷,甚至软RAID。

MaxIO采用了独特且高效的缓存技术来加速企业级存储应用,对I/O进行智能分析,根据加速设备SSD的大小,将更多更常用的热点数据放置于高速SSD介质中,有效缩短应用等待数据的时间。MaxIO支持多种灵活的加速模式,针对不同的业务场景,可发挥不同的加速效果,包括透写(Write Through)、回写(Write Back)和只读(Read Only或Write Around)三种加速模式。

MaxIO可以部署在任意X86硬件上,包括服务器和软件定义存储系统,因此可以在存储层和计算层灵活实现加速,且仅占用极少的系统CPU和内存资源,能够采用SSD为更多的应用提供I/O性能加速。MaxIO采用透明加速配置,可在线增加或删除加速模块,应用无需做任何配置更改,因此对企业应用场景不产生任何干扰。MaxIO具有友好的硬件兼容性,广泛支持各个厂商的SATA/SAS/PCIe/NVMe SSD。

MaxIO架构

工作原理 SSD Cache的基本原理很简单(如下图所示),利用I/O访问的局部性原理,将热点数据放置在SSD上,下次再次访问热点数据时,不需要经过传统硬盘的处理,而是直接在SSD上命中,极大的缩短IO响应时间。

SSD

SSD Cache的实现方式有多种,基于Linux内核机制的实现主要有DM-Cache与IO拦截两种方式,其中Flashcache是DM-Cache实现方式的典型代表,而MaxIO采用的是IO拦截实现方式。值得一提,正是因为没有采用Device Mapper机制,MaxIO不用创建新的DM设备,从而可以实现对应用进行灵活的透明加速。

Device mapper是Linux内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下用户可以很方便地根据需要制定实现存储资源的管理策略。Device mapper在内核中是作为一个块设备驱动被注册的,它包含mapped device、映射表、target device三个重要对象概念。Device mapper本质功能就是根据映射关系和target driver描述的IO处理规则,将IO请求从逻辑设备mapped device转发相应的target device上。DM-Cache正是利用了Device Mapper这一原理。将HDD 磁盘与SSD硬盘作为DM中的Target Device,聚合成为一个虚拟设备(Cache设备),同时将HDD磁盘与SSD硬盘Block进行映射。Dm-Cache根据映射规则,可以将对HDD磁盘的操作转换为对SSD硬盘的操作,从而实现将热点数据存储在SSD中的功能。HDD磁盘对SSD硬盘Block的映射,可以为简单的线性映射,也可以采用Hash映射。

IO拦截Cache实现的基本原理是对Linux通用块层BIO请求进行拦截,在Block Layer实现某些分发函数的钩子函数,同样需要将磁盘Block与SSD硬盘Block进行映射,根据映射规则以及操作类型决定是否将磁盘操作转换为对SSD硬盘的操作。如在write-around模式中,则只需要对读操作进行处理:根据映射规则,首先查看Block是否存在SSD中,如果不存在,则从HDD中读取,并写入到SSD中,然后返回;如果已经存在SSD中,则直接将读请求转换为对SSD映射Block的读请求。

SSD

如上图软件架构所示,MaxIO缓存引擎主要由三个核心组件组成:

元数据管理引擎:管理内存中的元数据,维护高速缓存块映射表;

缓存策略引擎:管理SSD缓存的I/O读写和替换策略;

数据迁移引擎:管理SSD缓存中的数据迁入和迁出;  

MaxIO以固定大小的数据块为单位进行缓存加速,缓存策略包括只读(Read-only或Write-around)、写回(Write-back)和写穿(Write-through)。数据块存储在SSD缓存中,直到被缓存的新数据块所替换, 替换策略有LRU、FIFO和Random可供选择。

MaxIO还包括两个重要的子组件:性能分析器和GUI / CLI管理工具。性能分析器跟踪和分析缓存性能,输出信息可以帮助管理员监控缓存效果和调整和缓存策略。MaxIO有两种模式管理工具:可视GUI工具和命令行CLI工具,满足不同管理员需要和喜好。MaxIO的模式引擎是模块化的,允许动态创建和变更缓存配置,可以使用CLI或GUI更改缓存策略(Read-only、Write-back和Write-through)和替换策略(FIFO,LRU和Random)。

元数据管理MaxIO元数据引擎将SSD中的高速缓存集映射到源块设备扇区集合上,每个高速缓存集为2MB,支持2KB/4KB/8KB缓存块大小,缓存块默认大小为4KB,每个缓存集包含512块。选择默认值4KB,因为大多数存储系统的通用I/O块大小也是4KB。假设800GB SSD,包含400K个缓存集(1组=2MB(512*4KB))。MaxIO内置了性能分析器可以为选择缓存块大小提供参考数据,性能分析器可以运行多次,每次使用不同的块大小,以确定不同的块大小对MaxIO性能的影响,从而根据实际应用场景选择合适的块大小以获得最佳的性能加速效果。

高速缓存的元数据运行时存储在系统内存,以提供高速缓存页最快的映射。为了确保这不会对应用程序的性能造成负担,MaxIO已被设计为非常高效地使用内存页。高速缓存所需的内存约为高速缓存大小的0.1%,比如800GB高速缓存仅需要占用800MB系统内存。元数据的副本存储在缓存SSD中以帮助热启动,当高速缓存被禁用时,内存中的元数据被写入SSD,使得当高速缓存被重新启用时,其数据可立即使用。

缓存策略缓存策略就是SSD高速缓存的I/O操作方式,不同的缓存模式将决定系统的性能。缓存模式描述缓存如何处理从主机到HDD的读取和写入操作,处理器从HDD读取数据块时,该数据的副本被写入SSD高速缓存。如果高速缓存中存在空块,则将新块写入空块中的一个;如果高速缓存已满并且没有用于该数据的空间,则按照设置的缓存替换策略从高速缓存中驱逐旧块,新的块被写在被逐出的块空间上。MaxIO支持三种缓存策略:只读、透写、回写。

只读(Read-only)

SSD

Read-only模式只对读操作进行缓存,写操作不缓存。对于写请求,写入数据未存在缓存中时,直接写入HDD,高速缓存将忽略该数据;如果写入数据在高速缓存中存在,为保证数据一致性该高速缓存块被置为无效。对于读操作,如果在SSD中命中则直接返回,未命中则将数据复制到SSD中。这种模式非常适合读多写少的场景。只读模式读写流程如上图所示:

写流程:写操作不缓存,则直接写HDD普通硬盘。即为:写1;

读流程:读流程是需要分为以下2种情况:

(1) 读的数据缓存在SSD设备中,数据可能是之前读或者写的数据(缓存到SSD中的),此时可以直接将SSD数据返回。流程为读3;

(2) 读的数据没有缓存在SSD设备中,数据可能是第一次读取,也可能是之前读的数据但是已经被覆盖,此时,首先需要将数据从磁盘上读取到SSD中,然后从SSD中将数据返回。流程为读1->读2->读3。

透写(Write-through)

SSD

Write-through模式下,对于读数据,全部缓存到高速设备SSD设备上;对于写操作,也缓存到高速设备SSD中,同时也写入到HDD中。这种模式比较适合读多写少,并且写的数据是最近访问的热点数据场景。这种模式因为写也同时写到HDD中,所以写的性能得不到加速,但是数据最安全。透写模式读写流程如上图所示:

写流程:SSD与HDD均需要写入,所以写1与写2操作都是需要的。

读流程:需要分为以下两种情况处理

(1) 读的数据缓存在SSD设备中,数据可能是之前读或者写的数据,此时可以直接将SSD数据返回。流程为读3;

(2) 读的数据没有缓存在SSD设备中,数据可能是第一次读取,也可能是之前读或者写的数据但是已经被覆盖,此时,首先需要将数据从磁盘上读取到SSD中,然后从SSD中将数据返回。流程为读1->读2->读3。

回写(Write-back)

SSD

Write-back回写模式下,读写操作都在SSD首先执行。写请求数据会被写入SSD缓存中,不会立即写入HDD,当SSD中的脏数据(与HDD中不一致的数据)达到预先设定的阈值,会将脏数据同步到HDD中;读请求和只读或透写模式处理类似。这是三种模式中读写性能最高的,因为写操作直接写入SSD而不是HDD,对刚刚写入的块的读取操作将由SSD提供而不是HDD。透写模式读写流程如上图所示:

写流程:写流程分为以下2种情况:

(1) 写的数据满足缓存要求,此时只需要将SSD中的数据改写为最新的数据即可。流程为写2;

(2) 写的数据不满足一些特定的要求(如不对齐等情况),此时则直接将数据写入到HDD普通硬盘中;流程为写1;

读流程:读流程是分为以下2种情况:

(1) 读的数据缓存在SSD设备中,数据可能是之前读的数据(缓存到SSD中的),此时可以直接将SSD数据返回。流程为读3;

(2) 读的数据没有缓存在SSD设备中,数据可能是第一次读取,也可能是之前读的数据但是已经被覆盖,或者是之前写的数据但是被同步到HDD普通硬盘上,此时,首先需要将数据从普通磁盘上读取到SSD中,然后从SSD中将数据返回。流程为读1->读2->读3。

在write-back模式中,不得不提及到数据回写的过程。数据回写指的是将SSD中的脏数据同步到HDD硬盘中,这个只有在write-back模式中才有。一般数据回写会有一些系统参数,如阈值(即脏数据达到一定的比率才会开始执行数据回写);时效时间(数据超过一定时间无操作,则可以执行数据回写);数据回写的速率(因为从SSD中奖数据写入到HDD中,速度较慢,需要考虑回写的速率限制)等参数。回写数据的时机与速率会很大程度上影响写的性能,如果阈值设置的非常高,则当到达阈值后,数据回写的速度会远远低于数据写入到SSD中的速度,这就会造成SSD中并没有充足的空间给新写入的数据,导致写会直接写入到HDD硬盘中,无法实现写加速。因此在设置数据回写相关的参数时,需要根据实际的情况适当的调整参数。

缓存模式对比  Write-back模式简化读取和写入,具有最短的写延迟,拥有最佳读写吞吐性能,是唯一对写操作有加速作用的模式,适用于数据更改频繁的应用;Write-through模式在写密集型应用程序中可以大幅度提升读取最近写入数据的性能;Read-only模式和Write-through策略在读取密集型应用中具有相同的读取性能。 

各厂商生产的SSD具有不同写入性能,但是在不同写入策略下速度的差异却是不太明显的,Write-through和Write-back策略比Read-only策略通常提供更好的性能,但有时写IOPS规格比较低的SSD在Read-only策略下可能比其他两种策略性能发挥的更好。 

从数据安全性角度来看,Read-only和Write-through模式中,SSD不会保存脏数据,数据的所有更新都是实时写入到硬盘的,任何时候SSD发生损坏,业务都无需中断,应用数据也不会损坏。Write-back模式提供最佳的性能体验,但是会保存一定比例的脏数据,为了防止电源或SSD故障时导致数据不完整或丢失,需要配置相关的预防措施,比如利用多块SSD组成RAID1或者RAID5保障数据安全。

替换策略高速缓存设计的另一个关键方面是替换策略。当缓存需要保存一个新数据块,这时可能需要将一个块从高速缓存中移除,缓存如何选择移除哪个块?理想情况下,高速缓存选择一个在将来最不可能访问的那个块,并且将该块替换为对当前任务需要立即访问的数据块。然而,除非进行大量的分析预测,基于过去的I/O模式准确地判断未来的应用读写行为,是非常困难的。高速缓存需要一种可以处理这种情形的合理的替代策略,典型的替换策略包括RANDOM、FIFO和LRU。在实际中需要根据具体的应用场景选择合适的替换策略,保证最大的可能性使热点数据最大程度的保留在SSD中,让SSD的性能优势发挥到最大。

RANDOM:随机替换策略。该策略的实质就是,当需要替换SSD中的block时,用软硬件的随机数产生SSD要替换Block的序号。Random替换策略并不考虑被替换块当前是否为热点,这种策略很少使用。 

FIFO(First In First Out):先进先出策略,这是一种最简单的替换策略。这种策略的实质就是总是选择在SSD中停留时间最长的block置换,即新进入SSD的block,先替换。理由是:最早被写入SSD中的block,其不再被读/写的可能性最大。这种策略只是在按线性顺序访问地址空间时才是理想的,否则效率不高。 

LRU(Least Recently Used):最近最久未使用策略。该策略的实质是,当需要置换SSD中的block时,选择在最近一段时间里最久没有使用过的Block予以置换,这些块在将来也最不可能被访问。LRU策略是与每个Block最后使用的时间有关的,由于该策略实现复杂,有一种LRU近似的策略NUR(Not Recently Used)最近未使用算法。LRU替换策略在绝大多数情形下都比随机或FIFO策略执行得更好,通常作为缺省替换策略被普通采用。

MaxIO特性

透明缓存  MaxIO不使用DM设备映射器,而是采用IO拦截的实现方式,从而实现了透明缓存加速。这个特性带来的好处是,SSD缓存可以根据需要动态配置,而应用无需做任何配置更改,因此对企业应用场景不产生任何干扰。HDD硬盘使用时可以创建SSD缓存对其加速,也可以在不需要的时候随时删除高速缓存。另外,创建缓存时,不管是HDD还是SSD,都可以使用整个设备或分区。

大I/O支持  MaxIO对I/O处理方式进行了修改,不会将大的I/O请求分割为以缓存块大小为单位的多个请求。比如64KB的读写请求,MaxIO不会像诸如flashcache缓存系统把它拆分成16个4KB的小I/O请求。这个优化使得大I/O性能得到显著改进。 

小内存占用MaxIO中每个SSD缓存块元数据仅占用4个字节,这使得系统内存消耗只有SSD容量的0.1%(1/1000)。对于1TB SSD,MaxIO只需占用约1GB的元数据内存开销。这也使得创建大容量的SSD缓存成才可能。

数据块对齐  MaxIO将所有元数据和数据块4K对齐地写入SSD,实现最小化写放大和对闪存磨损,同时还可以提高性能。

高数据安全 MaxIO在以Read-only或Write-through模式使用时,可以在不停止系统操作的情况下移除SSD,或者在SSD完全故障情况下继续工作。如果删除缓存SSD,系统只是简单地回到添加缓存之前的性能级别。出现故障时,对HDD的I/O请求可以继续正常处理。性能可能下降,但应用程序不会收到任何IO错误。SSD设备在Write-back模式下,出现故障可能导致丢失缓存中的脏数据块。为了防止这种数据丢失,可以将SSD设备通过RAID 1镜像实现高可用。

MaxIO局限性

(1) Linux平台为主。MaxIO目前主要以Linux平台为主,尤其是Redhat/CentOS 6.x/7.x系统,其他Linux/Unix平台需要定制或移植,不支持Windows平台。

(2) 读缓存预热。缓存创建后,通常需要一段时间预热缓存,尤其是读缓存。只有热点数据进入SSD,才能获得较高的缓存命中率。

(3) 缓存过量写入。MaxIO在只读模式下,在特定场景下引起过量的数据写入缓存,比如数据备份、碎片整理、文件搜索等。这会导致缓存命中率极低,使得缓存失效。

(4) 顺序I/O无效。MaxIO重点是对随机读写I/O的缓存和加速,而对大块顺序读写基本是无效的。一旦检测到顺序I/O读写逻辑,MaxIO就会跳过SSD,直接对HDD进行操作。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分