存储 频道

研究如何在SSD运行时实现数据高速压缩

  【IT168 专稿】我已经写了一段时间关于SSD的文章,它的确是一个很酷,非常有潜力的技术,但SSD在设计上仍然有瑕疵,为了解决这些问题,最好的办法是增强SSD控制器的功能。

  增强SSD控制器的功能后,设计人员可以从多方面改进SSD,如减少写放大系数,提高SSD的使用寿命,但这样做势必会使控制器变得更加复杂,成本也会因此上升。

  也许你会问,是否能在成本增加不多的情况下,让控制器变得更智能,功能更强大?或是否能将控制器现有的功能移花接木到其它控制器?你会在控制器上嵌入iSCSI或在SSD上植入网络连接吗?可以从SSD创建一个OSD(对象存储设备)吗?你会增强内部RAID-0以提高吞吐量吗?以及其它一些问题。

  SandForce SF-1200看似一个普通的SSD控制器,但它给我们带来了一些非常有趣的设计,包括一些少有的功能,可以让你的SSD性能大幅提升。

  性能结果迥异的两次测试

  我的一位好友叫做Joe Landman,它办了一家名叫Scalable Informatics的公司,他做了一次基于SandForce SF-1200的SSD测试,并在他的博客上发表了测试报告,我不想模仿他的做法,但他的测试结果值得参考。

  Joe是一名优秀的基准测试员和系统管理员,他的测试结果显示这款基于SF-1200的SSD读取速度和写入速度均为260MB/s(这些数字一般都是连续读和连续写测试结果),Joe使用了一个非常棒的基准测试代码fio测试这块硬盘,他运行了一个简单的流写入测试,得到的结果是约65MB/s(未缓存的值,这通常意味着文件比测试系统的内存容量更大,以减少操作系统缓存效果的影响),他然后又运行了流读取测试,得到的测试结果是约200MB/s。

  读取性能看起来与列举(list)性能接近,但写入性能与列举性能相比就相差甚远,也许它是一个基准测试?因此Joe尝试简单地使用dd用0作为输入,他在博客中写道:

  “我尝试使用dd命令进行测试,用0作为输入,我获得了标定的速度。”

  为了进一步确定,Joe又用Bonnie++测试了一次,他获得了基于SF-1200的SSD驱动器公开声称的性能。

  至此,Joe有两次测试都获得了控制器声称的速度:Bonnie++和dd(都用0作为输入数据),因此Joe决定用fio再做一次测试,只不过这次不再使用随机数据,而是用0,最终,流读取和写入测试结果也达到了SSD所宣传的速度。

  为了再检查一次,他取了两块硬盘,组成RAID-0,然后重新执行了同样的流测试,他使用相同的基准测试程序,相同的命令行(但使用0代替了随机数据),相同的文件系统,相同的挂载点等,第一个测试他运行了一次新的基本测试,使用0作为io-bm的输入数据。

  [root@localhost ~]# mpirun -np 1 ./io-bm.exe -n 10 -f /data/d1/big.file -b 1 -w -d -Z

  Thread=00000: host=localhost.localdomain time = 24.305 s IO bandwidth = 421.317 MB/s

  Naive linear bandwidth summation = 421.317 MB/s

  More precise calculation of Bandwidth = 421.317 MB/s

  然后,他运行了相同的测试,但使用随机数据作为io-bm的输入。

  [root@localhost ~]# mpirun -np 1 ./io-bm.exe -n 10 -f /data/d1/big.file -b 1 -w -d

  Thread=00000: host=localhost.localdomain time = 88.818 s IO bandwidth = 115.292 MB/s

  Naive linear bandwidth summation = 115.292 MB/s

  More precise calculation of Bandwidth = 115.292 MB/s

  是什么导致性能差异这么大?两次测试唯一的不同点是一个用0作为输入数据,一个用随机数据作为输入数据。

  其实真正不同的地方在于数据压缩,SandForce SF-1200可以在运行期间,数据写入到硬盘前执行数据压缩,在读取数据时再解压(展开)。

  探究性能差异的原因

  在SandForce SF-1200控制器的设计中,使用了一些数据压缩/展开逻辑和驱动器的直接数据路径,但这些逻辑是否已经添加到典型的控制器尚不明确,不过可以确定一点的是,控制器可以实现在运行时压缩。

  SandForce控制器中使用的技术获得了专利,因此我只能猜测控制器内部是怎么回事,非压缩数据进入硬盘(控制器)后很可能是被存储在一个特殊的缓冲区或高速缓存中,然后,控制器以某种方式压缩数据,也可能是压缩数据块,或在压缩前合并相邻的数据块,如果不是相邻的,可能会先规划数据位置,然后合并数据块,最后压缩它们(也可能完全不是这么回事),不管其实现方法怎么样,在将数据写入存储介质前,控制器必须花掉一些时间和计算能力分析和压缩数据。

  压缩完毕后,控制器将压缩后的数据写入SSD内的存储块,这些存储块极有可能是被擦除(未使用)块池中的块,但是,为了确保驱动器报告正确的数据存储量,未经压缩的数据大小也会以元数据的形式存储在驱动器中,也可能存储在压缩后的数据内,因此,如果数据请求需要获得特定数据块的大小,可以快速报告真实大小。

  一般来说,写入NAND芯片的数据量比原始数据要小(除非数据不能压缩),这意味着写入数据需要的时间更少,写入吞吐量当然也更好,但是,改善水平完全依赖于数据的可压缩性。

  对压缩数据而言,在读操作期间,可能先将其放入一个高速缓存中,解压,再发送给操作系统,再一次强调,读取的数据量更小,花的时间也更少,吞吐量也更好,和写操作一样,性能改善水平完全取决于数据的可压缩性。

  数据在写入SSD之前,数据压缩会对以下几个指标产生影响:

  (1)性能

  如果我们使用Joe单个驱动器的原始数字,数据几乎可以无限制压缩(只有0),读写吞吐量速度均可以达到260MB/s,这样的性能是非常让人满意的,但是,如果数据几乎是不可压缩的(非常随机的),读操作吞吐量性能可以达到200MB/s,但写操作吞吐量性能只有可怜的65MB/s,这意味着写入性能变化了大约4倍,读性能依据数据的可压缩性变化了大约30%。

  由于SSD的低延迟,它的读操作性能表现都很好,因此对SF-1200控制器来说,数据以相当快的速度读取,然后再展开(解压),从逻辑上分析,解压数据和其它关联操作使用的时间降低了性能,但数据量可能比真实的数据量更小,不可压缩数据和可压缩数据在读操作吞吐量性能方面大约相差30%。

  写入吞吐量性能的终极驱动是数据的可压缩性,如果数据可压缩性非常好,那么将只有很小一部分数据被真实地写到存储介质,实际吞吐量将非常高,如果数据可压缩性不好,几乎所有数据必须全部写入存储介质,写入吞吐量势必会下降,因为分析和压缩数据(可能很少,甚至完全没有)需要的时间会比较长。对SandForce SF-1200控制器来说,如果数据几乎是不可压缩的,那么我们将会看到写入性能急剧下降(从260MB/s下降到65MB/s,下降了将近4倍)。

  (2)数据容量

  数据压缩需要考虑的另一个方面是基于SandForce的SSD的空间或数据容量,你可以使用数据压缩功能提高设备的数据容量,但需要注意的是,空间容量取决于数据的可压缩性。

  当你在Linux系统中使用“ls -lsa”命令查看某个文件的属性时,你希望它报告正确的信息,包括字节大小,块数等,但基于SF-1200的设备不能真正利用数据压缩报告比真实容量更大的容量。

  (3)SSD的使用寿命

  SSD中使用的芯片擦除周期都是有限的,因此写入次数也是有限的,达到一定极限后,SSD硬盘将被报废,不可再写入数据,于是诞生了许多减少擦除周期的技术(如减少写放大),以及减少“热点”,SandForce SSD控制器很可能使用了这些技术。

  使用数据压缩技术后,在一个给定的存储块上就可以存储更多的数据,减少存储块擦除的次数,例如,假设我们有一块64GB SandForce SSD和一块64GB使用不同控制器的SSD,如果我们向这两块硬盘写入相同数量的数据,SandForce SSD将比传统的SSD使用更少的存储块,它有效地增长了存储块池的大小,这意味着这些存储块比传统的SSD写入次数更少。关于SandForce SSD非常有趣(且很酷)的事情是,和传统SSD相比,它的寿命要长多久,答案是,这完全取决于你的数据,如果你的数据是高度可压缩的,那么你获得的写入性能会更好(读取性能当然也不耐),驱动器将会“活”得更长。

  这也意味着SandForce SSD可以使用MLC芯片,使$/GB的成本更便宜。

  下面我们仔细介绍一下数据压缩,以及你如何分析你的数据,评估数据的可压缩性。

  数据可压缩性和SF-1200设备的影响

  基于SF-1200的SSD的性能和寿命真正完全依赖于你的数据,如果你的数据可压缩性非常好,你将获得很好的写入性能,如果你的数据可压缩性不好,那么你不可能获得很好的写入性能,因此问题就变成“我的数据可压缩性如何?”了。

  数据压缩(和它的同伴重复数据删除)是计算机科学领域的一项专业技术,你Google一下“数据压缩”就能看到大量的结果(我搜索时返回了11900000条结果),说得简单一点,压缩量取决于你的具体数据和算法。

  有人曾经撰文描述了多种数据压缩方法和压缩率,为了简洁起见,这里列举一些结果:

  • 使用“compact”技术

  o 文本:文件大小减少了38%

  o Pascal源代码:文件大小减少了43%

  o C源代码:文件大小减少了36%

  o 二进制:文件大小减少了19%

  • 使用“compress”技术

  o 文本和英语:文件大小减少了50-60%

  • 算数编码

  o 文件大小减少了12.1%-73.5%

  • 霍夫曼编码

  o 大型学生记录数据库文件大小减少了42.1%

  • 针对特定应用程序的数据压缩例行程序

  o 已经报告的文件大小最大减少了98%

  但是,除了压缩文件外,每个压缩算法都需要一定量的计算工作,通常,压缩的文件越多,需要的计算工作也越多(但并不总是这样,因为这取决于细节,但大体方向是这样的)。

  对SandForce SF-1200控制器来说,它需要一个快速的压缩算法,但也需要一个相当固定的时间,这样在数据可压缩性不好的情况下,写入性能才不至于下降得太利害,但与此同时,可压缩的数据越多,吞吐量性能越好,特别是写吞吐量。

  你怎么知道数据的可压缩性呢?要回答这个问题真的不容易,你可以做的第一件事情是选择有代表性的文件,然后使用gzip以不同压缩水平压缩它,最好再观察压缩文件的压缩率。例如,你可以这样:

  laytonjb@laytonjb-laptop:~$ gzip -6 file

  这里的“-6”就是压缩水平,它是默认值,最大压缩水平是“-9”,多试几个压缩水平,看可以获得的最大压缩率是多少。

  但需要注意的是,gzip会分析文件中的所有数据,而SF-1200控制器只会分析更少的数据块,因此你可以做的第二件事情是,使用strace分析你最常用的应用程序,找出平均系统写入调用大小,然后使用dd命令提取样本数据文件和平均写入大小对应的部分,再使用gzip对这些文件运行不同水平的压缩,例如,提取文件中对应的4KB(4096字节):

  laytonjb@laytonjb-laptop:~$ dd if=file of=data_example_1 bs=4096 skip=13

  这个命令假设你的文件大于14*4KB,因为我跳过了前13个4KB数据块(skip=13),写一个bash脚本,将一个文件分成特定尺寸的n块,针对每块运行不同水平的gzip压缩,记下每块的压缩量和压缩水平,然后就可以计算出所有块得平均压缩水平,于是对数据文件的可压缩性就有一个清晰的认知了。

  看起来要做许多工作,但它确实可以帮助你确定数据的可压缩性,如果你的数据可压缩性非常好,那么基于SF-1200的SSD将非常适合你,如果你的数据可压缩性不好,那么基于SF-1200的SSD可能不是最好的选择。我们定义文件压缩率为“压缩后文件大小/压缩前文件大小”,如果压缩率为1,那么你将获得最低的性能,因为这时的数据实际上是不可压缩的,如果压缩率非常小,你将获得最优异的性能(读/写吞吐量可能会达到260MB/s),你也可以使用这个值确定数据的可压缩性。

  当然,你也可以买一块基于SandForce SF-1200的设备,使用你真实的数据集运行各种测试。

  结论:数据压缩与SSD性能和寿命挂钩

  Joe Landman发现了基于SF-1200的SSD非常棒的一个特性 – 在运行中实现数据高速压缩,本文讨论了Joe博客文章,并就SandForce控制器做了一些猜测,也讨论了数据容量和性能设计的影响,真正最酷的结果是数据的可压缩性将对SSD的性能和使用寿命产生重大的影响。

  这的确是一个非常有趣的发现,数据的可压缩性和驱动器性能,甚至是寿命挂钩了,我想这肯定会影响到未来SSD控制器的设计,如果结合英特尔,Pliant独有的SSD控制器技术和SandForce的压缩技术,即使是不可压缩数据,你一样可以获得很好的性能和使用寿命,对于可压缩数据,情况当然会更好。

  SandForce最近发布了新的控制器,其性能比SF-1200还好,SandForce宣称连续读/写性能可以达到500MB/s,对4KB事务,最大可以达到60000随机读/写性能,这些新控制器具有6Gbps接口帮助改善性能,但我不能说这些控制器也得到了改善。

  原文出处:http://www.linux-mag.com/id/7869

  原文名:On-the-fly Data Compression for SSDs

  作者:Jeffrey B. Layton

0
相关文章