苑舒斌,周晓宇,韩宇
中海油信息科技有限公司北京分公司,北京,100010
Dedup是一种用于优化磁盘占用空间的方式。它可以将磁盘中重复的数据合并,并以引用的方式虚拟成多份数据。在磁盘的数据内容重复性很高的情况下,相同的数据可以只存储一份,大幅度地减少了磁盘空间的占用。但同时也带来了数据随机性上升以及IO性能降低等其他问题。
SSD Cache是常见的分层存储方式之一,通过将频繁访问的热点数据存储在高速存储中、冷数据存储在低速存储中,可以起到使用较低的成本达到较高的磁盘性能的作用。SSD是最常见的高速非易失性存储,随机读写能力可达普通机械硬盘的100~1000倍,其拥有随机读写性能强、访问延迟低且断电不丢失数据的特点,常在分层存储中作为缓存层使用。
在Dedup的应用场景下,IO操作数量增加,访问延迟敏感性上升,但同时也带来了更密集的数据访问。而SSD Cache所使用的LRU算法对访问数据的密集程度较为敏感,因此,对数据进行Dedup可以在一定程度上提高Cache的性能表现。虚拟数据优化器VDO(virtual data optimizer)是由红帽提供的一款存储软件,VDO是一个内核模块,可以节省磁盘空间并减小复制带宽。VDO位于任何块存储设备的顶部,提供零块消除、冗余块的分解和数据压缩。VDO包含两个部分,UDS Portion与VDO Portion。UDS Portion用于存储每个块的独特名称和位置,而VDO Portion用于存储数据内容。
OpenCAS是一个开源项目,包括块缓存软件库、适配器、工具等。此缓存加速软件的主要目的是通过使用高性能设备来加速后端块设备。
在本文的方案中,会使用这两个工具进行组合测试。
VDO访问数据时,需要分成两次IO操作。第一次,先访问UDS Portion,获取所需要的VDO Block所在位置;第二次访问,则对VDO Block进行读取。这造成了较高的读放大,并且劣化了读取的连续性,对磁盘的性能表现有较大的负面影响。当VDO写入数据时,第一步是写入操作,VDO会先分配一个空闲的VDO Block用于数据写入,并修改UDS信息,此过程产生两个IO操作;第二步是Dedup操作,VDO Dedup模块会计算该Block的哈希(Hash),并根据Hash寻找对应Block。如果没有找到,则直接返回;如果找到相同Block,则会读出该Block并进行比对,如果结果不同则直接返回,如果结果相同则修改UDS信息,并废弃之前的VDO Block。数据访问过程如图1所示。
图1 VDO数据访问过程
经过研究可以发现,当写入大量数据时,每一次写操作会附带产生至少两个IO操作,最差的情况下会产生4次IO操作,并且连续性较差,大幅度劣化了机械磁盘的IO表现。而在没有VDO的情况下,连续的数据不会被切分成不连续的数据,且每次IO操作严格对应一次物理IO,有利于机械硬盘的性能发挥。磁盘写操作如图2所示。
图2 磁盘写操作
记后备存储的IOPS为H,Cache的IOPS为S,Cache命中率为r,理论IOPS为C。经过理论计算可以得出
考虑到S与H的数值都由硬件决定,在相同的情况下将S记为H,则公式(1)可以继续化简为
可以看出,在H与不变的情况下,C仅与r相关。为了方便,在接下来的计算中,将r定为100,这个数字与本文的测试环境是接近的,则可以得到函数
图3展示了Cache命中率和IOPS的对应关系。
图3 Cache命中率与IOPS的关系
因此,缓存加速软件的性能表现与命中率息息相关。
Cache的命中率随它的容量增加而提高,它们之间的关系曲线如图4所示。在Cache容量比较小的时候,命中率提高得非常快,但根据边际效应递减原理,随着Cache容量的增加,命中率提高的速度逐渐降低。当Cache的容量增加到无穷大时,理论期望命中率可达到100%,但是这实际上是做不到的。
VDO访问数据时,需要分成两次IO操作。第一次,先访问UDS Portion,获取所需要的 VDO Block所在位置;第二次访问,则对VDO Block进行读取。由于UDS Portion的容量一般较小,可以认为UDS Portion能够完全被Cache命中,因此,其主要影响的是第二次VDO Block的Cache命中率。经过计算,可以得到第二个公式,在带有VDO的情况下,C的公式为:
此外,在访问不同的VDO逻辑块时,若其内容相同,则会被分配到相同的VDO Block中,这可以提升VDO Block访问的命中率,对性能提升有一定的正面作用,当环境恰当的时候,甚至可以达到或者超过SSD Cache的性能。下面是在真实环境下进行的热点分析。
在不同的环境中,热点数据的重复程度有相当大的区别。本文以云环境的数据读取情况为例,选取了一个磁盘,在这个磁盘上一共启动了6台虚拟机,其会不断地产生大量数据访问。通过对数据的跟踪发现,在使用相同的256G SSD对1.5TB硬盘进行加速的情况下,SSD Cache的命中率为90%;而在类似的环境中,使用Dedup去重后,再进行跟踪,日志显示命中率为97%。
那么,带入之前的两个公式,本文可以得出以下结论。在使用Dedup之前,SSD Cache可以带来9.2倍的性能提升;而在使用Dedup之后,可以获得20.1倍的性能提升。并且当继续增大,提升的比例也会继续增大;当=1000时,Dedup与Cache的搭配可以获得31.3倍的性能提升,而单纯的Cache只能获得9.9倍的提升。也就是说,当Cache的性能提高的时候,使用Dedup可以获得更高的边际效益[1]。
VDO写入大量重复数据时,会产生大量附带的读操作与3个写操作,但是当使用SSD Cache时,读操作可以被Cache储存,写操作则会被合并。因此,本文可以减少1次读写操作,将最差情况下的3次IO操作减少到最差情况的2次IO操作。同时,由于SSD本身的读写特性,VDO读取数据连续性较低的问题也可以被大幅度缓解。
在传统的单层存储中,发起的访问请求会被传递给真实的物理设备,物理设备根据请求的偏移量进行读取,然后返回结果,IO性能仅取决于硬盘设备本身。但在本文的分层存储模型中,当用户发起访问请求时,会先经过VDO层,VDO再将请求发送给OpenCAS层,OpenCAS从硬盘或缓存中读取数据,并将结果返回给VDO。具体过程如图4所示。此时,IO的性能同时受到硬盘、缓存设备、缓存策略以及缓存命中率的影响[2]。
图4 所提分层存储过程
根据不同情况,本文选取了两种典型的Cache策略。
该模式下,SSD Cache不会提升VDO的写入性能,但是会提升VDO的读取能力。在此种方案下,当数据被写入VDO时,VDO Block与UDS索引的改动会被同时写入Cache与后备存储中,其所需要的时间与直接落盘一致。当VDO需要读取数据时,UDS数据存在于Cache中,VDO Block则会先从Cache中寻找,然后再从后备存储中加载。因为不同逻辑块可以对应同一个VDO Block,因此Cache命中率可以得到一定程度的提升。
该模式下,SSD Cache将会同时进行Cache写入与读取。在此种方案下,当数据被写入VDO时,VDO Block与UDS索引的改动会被先写入Cache中,其所需要的时间远短于写入后备存储所需要的时间。Cache会将写入的数据合并之后再落盘,可以提高数据写入的连续程度,提高性能。当VDO需要读取数据时,UDS数据存在于Cache中,VDO Block则先从Cache中寻找,再从后备存储中加载。因为不同逻辑块可以对应同一个VDO Block,因此Cache命中率同样可以得到一定程度的提升。
根据两种优化模式的特点,在测试中,本文选取了写回优化模式作为本次测试的策略[3]。
对本文所提方案的正确性进行验证,测试环境为CentOS7.5操作系统、4块6T磁盘组成RAID5、Intel S4510 960G。
机械硬盘模式的测试结果如表1所示。
表1 机械硬盘测试结果
纯Dedup模式的测试结果如表2所示。
表2 纯Dedup模式测试结果
对比裸盘与纯Dedup模式可以发现,4K随机写有一定优化,4K随机读的性能则降低了一半。这是由于4K随机写在写入时分配的是连续的物理块,可以提高连续性,一定程度上提高了写入性能;而其他情况则会降低读写的连续性,且一次IO请求会产生两次真实IO请求,导致性能严重下降。
测试时,Cache命中率均维持在90%左右。根据SSD的标称性能,SSD的写入IOPS为60K,在SSD Cache开启写回模式下,进行4K读取时的性能提升了9.6倍;而按照理论计算,性能提升应为9.9倍,结果与计算基本一致。在4K写入的情况下,数据会先写入SSD中。因此,其性能取决于SSD的性能与SSD Cache软件的性能,测试的结果与SSD的标称性能一致[4]。SSD Cache的性能测试结果如表3所示。
表3 SSD Cache测试性能
测试时,Cache命中率均维持在97%左右。4K的随机读取性能相对机械盘提升了26.5倍,根据SSD的性能计算,读取性能应能提升到30倍,与计算基本相符。写入的性能相比SSD Cache模式降低至1/3,但依然能提升机械硬盘20倍的性能。如表4所示。
表4 SSD Cache与Dedup联用性能
在此次测试中,SSD Cache的缓存磁盘处于有较多空余空间的状态。在写回模式下,当Dirty数据超过限制后,写入性能会下降到与直接写入硬盘相同。此时,可以认为与纯Dedup模式下的数据一致[5]。
经过以上测试,可以得到的结论是:SSD Cache与Dedup的联合使用可以进一步提升性能,根据不同的SSD性能与命中率,提升效果也不同。根据实际测试的情况,Dedup与SSD Cache的联用基本可以达到理论上的性能,印证了理论的正确性,但是由于SSD的性能依然受到数据随机性的影响,因此实测数据和理论不完全相符。
但本次实验依然存在不足之处,可以继续进行改进以提升性能。比如说,将Dedup的写入操作进行分类,改善底层的连续性,并选择性地进行缓存,以减少写入时对SSD Cache的冲击。
此外,本次测试中使用了写回策略进行优化,但SSD Cache在使用写回策略时,同样存在一些潜在问题。根据不同的实现方法,SSD Cache在写回模式下,可能存在断电后数据丢失、缓存写满后性能下降的问题,并不是万能的解决方案。