ISSN l673—941g CODEN JKYTA8 E—mail:fest@vip.163.com Journal of Frontiers ofComputer Science and Technology htto://www.ceaj.org Tel:+86..10..51616056 1673--9418/201 1/05(08).-0686--09 DOI:10.3778 ̄.issn.1673—9418.2011.08.002 使用固态硬盘管理主存KV数据库的虚拟内存术 韩旭 ,曹巍,孟小峰 中国人民大学信息学院,北京100872 VirtualMemoryManagementforMain.Memory KVDatabaseUsingSolidStateDisk HAN Xu ,CAO Wei,MENG Xiaofeng School of Information,Renmin University of China,Beijing 1 00872,China +Corresponding author:E—mail:hanxumelody@ruc.edu.cn I-IAN Xu,CAO Wei,MENG Xiaofeng.Virtual memory management for main-memory KV database esmg solid state disk.Journ ̄of Frontiers of Computer Science and Technology,2011,5(8):686-694. Abstract:Key—value in—memory databases have the characteristics of efifciency,usability and scalability.Because of hte limits of hte capacity of main memory,the applications dealing with large amount of data have to swap data between main memory and disks.While solid state disks(SSDs)have the hilgh performance of random reads as a new storage medium,mey can speed up random reads on virtual memory.To remedy the lower performance of random writes on SSDs,this paper proposes an optimization method of write buffer of SSD,which transforms several random writes to a sequential write,and designs a garbage coHection poScy of SSD,which transforms several random writes to a sequentila read and a sequentila write.to improve hte spatial utilization ofkey-value in-memory database.Finally,an SSD・・based virtual memory implementation is proposed to realize high performance of key・・value main memory data- bases,andtheimprovement which is at most 40%,is confirmed by changing hte source code ofRedis ni experiment. Key words:key—value;solid state disk(SSD);virtual memory;buffer 摘要:主存 ̄4J[(key—value,KV)数据库具有高效性、易用性和可扩展性。由于主存容量有限,一些数据量 较大的应用必须使用磁盘进行数据交换。而固态硬盘(solid state disk,SSD)有高速的随机读特点,使用固态 *The National Natural Science Foundation of China under Grnat No.60833005,91024032,61070055(国家自然科学基金);the Nadonai Science nad Technology Major Special Projects of China under Grant No.2010ZX01042—002-003(国家科技重大专项 “核高基”项目);the Research Funds of Renmin University of China under Grnat No.10XN1018(中国人民大学科学研究基金). Received 2011—04,Accepted 2011-06. 韩旭等:使用固态硬盘管理主存KV数据库的虚拟内存 687 硬盘作为主存KV数据库的虚拟内存会提高对不在主存中的数据的读性能。但是固态硬盘的随机写性能较 差,于是提出了针对固态硬盘的写缓冲区优化算法,将多个随机写转化为一个连续写,并设计了固态硬盘 虚拟内存的垃圾回收机制,将多个随机写转化为一个连续读和一个连续写,从而提高主存KV数据库的性 能。通过改写源代码,将该虚拟内存管理应用于Redis中,并进行了实验测试,结果表明该虚拟内存管理的 性能比原有性能最大提升了40%。 关键词:键值;固态硬盘;虚拟内存;缓冲区 文献标识码:A 中图分类号:TP391 1 引言 在过去的30年里,由Codd提出的关系数据库 模型…在数据库应用领域发挥了重要作用,这种模 式提供了简单性、健壮性与灵活性,将大批量的数 据组织成人们易于理解的表的形式。这种以表的方 式组织数据的模式使数据库领域产生了很大变革, 使数据库应用更加广泛,也使关系型数据库管理系 统(relational database management system,RDBMS) 逐渐成为一种通用型数据库系统。 尽管关系型数据库能够提供例如简单性、健壮 性和灵活性等特点,但是其在某一个特定领域的性 能,不一定优于专门为这种领域而设计的替代 方案。随着Web 2.0技术的发展,面对用户数量的 不断增长和海量的数据存储和数据请求,关系数据 库的伸缩性能就成为其众多优点下的阿克琉斯之 踵。对于短时间内数据量的猛增,只升级服务器的 硬件性能显然对整个系统处理能力的提升是有限 的,当硬件的提升达到上限时,那么整个系统的性 能提升也就达到了上限,这时对数据库的水平扩展 就成为整个系统提升性能的唯一通路。但是由于关 系数据库是以关系表的形式存储数据,对于数据库 的水平扩展就要涉及表的一系列复杂的拆分,尤其 是当试图扩展的节点成百上千时,关系数据库水平 扩展的复杂性将会使整个工作变得繁重不堪。 键值(key—value,KV)数据库的提出恰好能解决 伸缩性的问题。KV数据库通过一个key对应一个 value这种映射来存储数据,这使得KV数据库更适 合非结构化的数据,用户可以自己来定义value存 储数据的语义信息,因此KV数据库有着极高的易 用性,并且非常容易对系统进行扩展。同时,由于 数据访问是通过key和value的映射实现的,可以对 这种数据访问路径进行更多的优化,使KV数据库 达到很高的性能。 Table 1 Comparison between RDBMS and KV databases 表1 RDBMS和KV数据库对比 关系数据库 KV数据库 使用SQL语句对数据进 使用系统提供的应用程序接口 行操作。SQL语句可以(application program interface, 提供聚集、排序等强大 API)对数据进行操作。使系统免 的操作,但增加了系统 却了解析复杂SQL语句的负担, 的 相 可以根据应用程序数据类型而 设计存储形式,减少类似于 SQL中的表连接、聚集操作 数据以表的形式进行存 数据可以根据不同的应用以对 储,因此需要在应用程 象的形式进行存储,省却了中 序与数据库之间建立一 问的映射层,使得代码变得高 个对象到关系的映射 效兼容 存储的数据中包含了数 数据的逻辑关系需要在应用程 据间的逻辑关系 序中体现 由于这种简单的映射关系,KV数据库具有与 生俱来的伸缩性,可以支持动态的扩充。这种数据 库提供了相对廉价的设计存储平台,可以拥有庞大 的扩充潜力。当用户数量和数据量猛增时,供应商 只需要扩展平台,系统的存储能力就能获得较大的 提升。因此KV数据库也是云计算的最佳搭档,像 Cassandra、Hbase这样的云计算数据库也是基于KV 存储结构 688 Journal ofFrontiers ofComputer Science and Technology计算机科学与探索 2011,5(8) 不同于面向云计算的KV数据库,基于主存的 KV数据库则针对的是具有高速响应、低延时的数 据应用。主存KV数据库将数据全部放在主存中,对 数据的读取、赋值和删除操作全部在主存中执行, 因此主存KV数据库有着极高的响应性能。针对一 些数据实时统计的应用和对服务器端数据进行缓 速度。Memcached将应用程序对数据库的查询和一 些API调用得到数据进行缓存,当下次应用程序需 要访问这些数据时,如果数据在Memcached中命中, 则直接从主存中读取这些数据并提供给应用程序, 省却了应用程序再对数据库进行查询的操作。通过 这种方式,Memcached可以降低数据库的负载,并 加速应用程序的处理速度。但是Memcached只是用 存的需求,主存KV数据库能够快速处理这些响应 时间要求很低的请求。但是由于主存数据存储容量 的,当超过一定数据量时,主存存放不下数据 而造成数据丢失。因此当前对主存KV数据库的大 部分应用是使用主存KV数据库(如:Memcached)做 缓存,使用传统关系型数据库(如:MySQL)存储数 据。有的主存KV数据库实现了虚拟内存的功能,通 过将冷数据交换到在磁盘中开辟的虚拟内存空间, 实现数据容量的扩充。但是由于在磁盘存放数据降 低了主存KV数据库的读写性能,该方法并没有得 到广泛采用。 本文针对主存KV数据库的虚拟内存读写性能 低下的问题,提出了使用固态硬盘(solid state disk, SSD)作为虚拟内存;存放主存数据库中的冷数据; 针对SSD的读写特点,将多个随机写转化成一个连 续写的写缓冲区:设计了一种垃圾回收机制,在保 持虚拟内存高效的读写性能的同时,处理虚拟内存 的空闲空间回收,从而在扩充了数据库存储容量的 同时,保持了整个数据库的高性能。 文章组织结构如下:第2章介绍KV存储和固 态硬盘方面的相关工作;第3章介绍基于固态硬盘 将多个随机写转化为一个连续写的写缓冲区的设 计方案;第4章介绍针对简单的追加写方式提出的 垃圾回收机制;第5章对本文进行总结。 2相关工作 随着Web应用的广泛普及,每天都会有大量的 数据需要网络服务提哄商来处理,对KV数据库这 种高扩展性的应用需求使得大量的KV数据库应运 而生。下面简单列述几种KV数据库: Memcached[2]是一个高性能的分布式主存数据 库,它将数据全部存放在主存中以提供极高的处理 以缓存系统中较热的数据,并没有提供数据持久化 等功能,因此Memcached并不能完全替代数据库, 只是作为系统中对数据库数据的缓存。 Redisp 也是一个高性能的分布式主存数据库, 它同Memcached类似,同样能够作为系统中对数据 库数据的缓存来使用,以达到加速应用程序处理速 度的目的。同时,Redis还提供了虚拟内存和数据持 久化的功能。正因为如此Redis存储的数据容量可 以不受内存容量的,通过将冷数据写到磁盘中 进行存储,以达到扩充存储数据容量的目的。而数 据持久化功能可以使Redis中存储的数据定期写到 磁盘中,从而实现了数据库对于数据的持久化存储, 在系统出现问题时可以恢复大量的数据。在一些测 试中,Redis的性能要优于Memcached。 BerkeleyDB(BDB)[4]是一个高性能的嵌入式KV 数据库,并提供一组很简洁的API接口。BerkeleyDB 虽然结构简单,但是它也提供了很多高级数据库的 特性,例如ACID特性(即原子性、一致性、隔离性 和持久性)、事务处理、锁系统等。BerkeleyDB在 嵌入式环境中比关系型数据库要好,这是由于在嵌 人式环境中数据库程序同应用程序在相同的地址 空间中运行,数据库操作不需要进程间的通信。同 时BerkeleyDB所有的操作都是通过一组API接口, 因此不需要对查询语言进行解析,免去了执行计划 的生成,大大提升了效率。 Flash StoreiS]主要是针对Xbox和数据去重应用 设计基于闪存的KV存储系统,设计目标是高吞吐、 低延迟,使用Flash敏感的数据结构和算法,减少内 存存储的key的大小。Hash Store系统主要由内存 的写缓冲区、内存的读缓冲区、内存的Hash索引 (Hash索引完全放在内存中,加速查询的性能)、内 韩旭等:使用固态硬盘管理主存KV数据库的虚拟内存 689 存的最近访问向量、内存的Bloom filter,以及闪存 上数据组织成为循环链表(闪存作为磁盘的二级 Cache使用,采用日志的方式顺序写数据),磁盘上 数据的存储完全采用BDB作为磁盘数据管理工具。 Flash Store具有以下特点:描述了查询、更新和删 除操作的流程。Hash表采用Cuckoo哈希减少冲突。 使用多线程的方式来进行并发控制,主要有客户端 服务线程、刷写闪存线程、垃圾回收线程。针对不 同部分设计了不同类型的加锁。对于恢复,需要重 新加载生成Hash索引,这就需要扫描所有闪存,耗 时,所以采用定期刷写索引到闪存。向多个节点扩 展可以使用分布式哈希,也可以采用更新节点进行 Hash。 SkimpyStasht6 ̄与Flash Store类似,主要的不同 是采用的Hash表是最原始的链表哈希,即减少 Hash表的大小,在Hash后面采用链表存储冲突数 据,整个链表都存储在闪存上,闪存上的数据采用 链表的方式把具有相同Hash Key的连接起来。为了 减少链表的长度,采用两个哈希函数来解决冲突问 题,给搜索、插入和更新带来了麻烦。因为闪存空 间有限,所以对闪存空间回收来说,闪存上数据采 用链表方式进行组织,因此数据回收会有很大难度, 采用直接回收一个链表数据的方式。 3缓冲区的设计与实现 3.1固态硬盘特性介绍 固态硬盘是由控制单元和存储单元组成的,大 多数的固态硬盘采用闪存芯片作为其存储介质 J, 因为闪存是通过电子电路来存取数据,不存在机械 移动带来的延迟,所以闪存的数据定位所需要的时 间相比于传统磁盘要小很多。因此闪存芯片具有非 常高的随机读取速度,能从根本上解决磁盘中随机 渎性能低下的问题。除此之外,固态硬盘还具有其 他一些优秀的特性,比如节省电量、抗震好、散发 热量少和体积小等。 但是闪存除了拥有磁盘所有的读写性能外,还 有擦除这一特有的操作。闪存是基于块的存储结构, 块是擦除操作的基本单元。而页是闪存的读写操作 的基本单位,一个块一般具有32或64个页。闪存 的一次写操作是将一个页的数据变为0,当需要删 除或者重写这个数据时,需要擦除操作将这个页变 为1。闪存并不能支持原位更新,向闪存中写入一条 数据对这个数据块先执行擦除操作后,这个页中的 原有数据也需要重写到这个块中,所以擦除操作所 消耗的时间要远远大于写操作所要执行的时间【8J。 为了克服闪存芯片的物理特性,固态硬盘引入 了闪存转换层(lfash translation layer,FTL)来模拟块 设备的操作【9一州。FTL维护了一个内部映射表来记 录逻辑地址和物理地址之间的映射关系,其对用户 是透明的。但是由于对闪存中一个数据区域的写操 作需要触发一个擦除操作,SSD的随机写性能仍然 不是很高。 如表2所示【1¨,固态硬盘相比于传统磁盘,随 机读的性能提高了18.62倍,但是随机写却要低于 磁盘。因此,直接将数据库应用在固态硬盘上并不 能获得相应于闪存和磁盘IO性能比值而带来的提 引,需要根据固态硬盘的这些特性,优化数据 库对数据的操作,在充分利用固态硬盘高效的随机 读优点的同时,避免过多的随机写数据,以充分发 挥固态硬盘的性能。 Table 2 Performance comparison between Disk and SSD 表2磁盘与固态硬盘的性能比较 3.2缓冲区设计 在主存KV数据库中,当数据占据的主存容量 超过一定值后,这时再向数据库写人数据,数 据库就会根据一定的换入换出算法,选择一个数据 交换到虚拟内存中去。再将这个数据写入硬盘中对 应的虚拟内存文件区域,以达到释放一定的主存空 间来存放新写人数据的目的。此时应用程序对系统 发出频繁的写操作请求,将会有大量的数据非连续 地写入到虚拟内存中。同时,由于数据库需要保存 Journal ofFrontiers ofComputer Science and Technology计算机科学与探索 2011,5(8) 写入硬盘数据的一些元信息,例如存储长度、数据 类型等,又增加了对硬盘的写的频率,且由于这些 元信息的数据量很小,这些写入操作又是粒度非常 小的随机写。虽然直接使用固态硬盘能够使主存 KV数据库对虚拟内存中数据进行读取操作时达到 用的主存空间是否已经达到限定值,如果达到则向 虚拟内存中写入相对访问次数较低的数据,以释放 相应的空间。这时数据库会根据一定的算法得到可 以交换到虚拟内存中的数据,同时将数据写入到写 缓冲区中,同时将数据库key与value的哈希表中对 应value的指针指向写缓冲区中的相应位置。在缓 很高的性能,但是由于数据库向虚拟内存写入数据 实际上是大量的随机写,这样固态硬盘随机写性能 冲区中的数据实际上仍然是存放在主存中,原来对 差的缺点就成为该数据库系统的瓶颈。 针对上述问题,本文使用固态硬盘作为主存 KV数据库的虚拟内存,以提高数据随机读取的性 能,并针对固态硬盘的写操作特点,建立了一个以 固态硬盘块单位为大小的写缓冲区。这个缓冲区将 主存KV数据库中大量的对虚拟内存的随机写操作 在主存中缓存起来,当这个缓冲区数据写满时,将 这些数据一同写入到虚拟内存文件中。通过这种方 法,使得在利用固态硬盘高速的随机读数据性能的 同时,将多个对固态硬盘的随机写数据操作缓存、 合并,转化为一个连续的数据写入操作,从而提高 了主存KV数据库对虚拟内存数据写操作的速度。 内存 固态硬盘 数 缓 据 库 趸 换 冲 次连续 写 虚拟 内 、数 区 内存 存 据 J. 一认刈 U H、J 随机读 Fig.1 The architecture of system 图1系统结构 3.3数据操作 在KV数据库中,大部分数据操作都是Set操作 (写)和Get操作(读),下面主要介绍这两种操作下的 数据流程。 当应用程序向主存KV数据库发出写入数据请 求时,数据库在主存中为这个数据分配相应的主存 空间来存储数据。然后数据库查看当前数据库中占 数据分配的空间并没有释放,这样做的目的是对写 缓冲区数据进行读取操作时省却主存间复制的操 作消耗。对这部分数据的操作也是直接在主存中进 行,不需要从硬盘载人到主存这个过程。当写缓冲 区满时,数据库以追加写的方式在虚拟内存文件中 的末尾连续写入整个缓冲区中的数据,释放相应的 数据空间,并将哈希表中的指针指向虚拟内存空间 中的相应位置。 当应用程序向主存KV数据库发出读数据请求 时,数据库首先根据读请求的key值找到哈希表中 对应的指针,并根据指针指向的位置读取数据。如 果所存放的数据在主存中,直接返回相应数据;若 数据在写缓冲区中,将哈希表中的指针指向具体存 放数据的位置,回收写缓冲区的相应空间;若数据 在虚拟内存中,根据哈希表中对应指针的位置读取 数据,并为其在主存分配相应空间,若此时数据库 占用的主存容量超过限定值,又会触发向虚拟内存 交换数据的请求。 3.4算法实现 基于3.3节的研究,本文实现了两种数据操作。 因为缓冲区中的数据也需要与数据库进行交互,所 以也需要对缓冲区中的数据进行管理,包括将映射 表中的指针指向缓冲区中的相应位置,从缓冲区读 出数据时标记位置可用和将新写人数据存放在缓 冲区释放的位置中。根据数据库对数据的操作,将 设计分为对虚拟内存的写操作和对数据的读操作, 实现如下: 算法1对虚拟内存的写操作 1. Z“8+_获得需要写入虚拟内存的值 2. ,/缓冲区为buffer 3. 地址指针pointers---NULL 韩旭等:使用固态硬盘管理主存KV数据库的虚拟内存 691 4. if在bufer中有被释放的空间then 5. pDfn r+_-空闲空间地址 6. 将value写入到pointer指向的地址 7. 用pointer更新映射表 8. returnOK 9. end if 10. 将value追加到bufer中 11. pDj ,I+__获得bufer中地址 12. 用pointer更新映射表 13. if bufer写满 l4. 将bufer追加连续写到SSD中虚拟内存 15. for bufer中每个数据 l6. pD ,一在虚拟内存中地址 17. 用pointer更新映射表 18. end for 19. endif 20. return 0K 算法2对数据的读操作 输入:需要读取数据的key值key 1. //缓冲区为bufer,值为value 2. 地址指针pointers--NULL 3. 获得value的地址pointer*--dictFind(key) 4. ifpointer指向内存中 5. return pointer 6. end if 7. ifpointer指向缓冲区中 8. 创建一个对象object 9. o cf+.-从pointer地址中读出值 10. 标记bufer中pointer地址可用 11. 用object更新映射表 12. return object 13. endif 14. ifpointer指向虚拟内存中 15. 创建一个对象object 16. D Pcf+_-从pointer地址中读出值 17. 用object更新映射表 18. return object 19. endif 20. returnNULL 这两种算法管理了数据存放于主存、缓冲区和 固态硬盘中虚拟内存这三种不同的情况,将要写人 虚拟内存中的数据写入缓冲区以达到减少随机写 的目的。 4空闲空问回收管理 向固态硬盘按块追加写盼方式将对固态硬盘的 大量随机写转化为向固态硬盘的一次连续写,而且 追加方式不存在SSD数据块的擦除和重写。但是这 种追加方式会使虚拟内存在多次写入数据后变得 非常庞大,而且之前写入数据的数据块如果仍然存 储有少量的数据,那么这个数据块不能够被擦除。 因此在极端情况致使虚拟内存实际上只支持对其 分配空间大小的写入数量,造成了空间的浪费。当 数据库中频繁地与虚拟内存交换数据,在很短的时 间内,虚拟内存就能够被完全占用。因此,针对固 态硬盘数据块设计了空闲空间回收机制,将数据库 对虚拟内存的多个随机写转化为一个连续的读操 作和一个连续的写操作,提高了虚拟内存的空间回 收效率。 该机制将数据库中的虚拟内存以固态硬盘块的 大小为单元进行管理,每个数据块又分为若干个页 来存储数据。同时为虚拟内存中的每一个数据块维 护一个空闲空间统计信息,记录当前空闲空间的大 小和每个空闲的页号。因为数据从虚拟内存载人到 主存中是由Get操作来完成,所以由Get操作触发对 空闲空间信息的更新。当空闲空问的大小达到设定 值,则将整个数据块从虚拟内存中连续读出,并载 人到主存的回收缓冲区中。根据维护的这个数据块 的空闲空间统计信息,将当前写缓冲区中的数据写 到对应的回收缓冲区中,然后将这个回收缓冲区重 新连续地写回到这个虚拟内存数据块中。该方法采 用以连续读和连续写来替代多个随机写的方式,并 使原有数据能够达到“原位更新”,省却了更新原有 数据在数据库哈希表中对应指针的代价。 算法3在读操作中增加空间回收管理 输入:需要读取数据的key值key 1. //缓冲区为bufer,值为value,当前数据块为 block,回收缓冲区c—bufer 2. 地址指针pointers-NULL 692 Journal ofFrontiers ofComputer Science and Technology计算机科学与探索 2011,5(8) 3. 获得value的地址pointer ̄---dictFind(key) 库虚拟内存上读写性能的提升。选择Redis作为测 试使用的主存KV数据库,因为Redis在很多应用 场景中得到广泛使用,像digg、stackoverflow和暴 4. 5. ifpointer指向内存中 returnpointer 6. end if 雪等都在使用Redis数据库,同时其本身具有良好 的性能,并且提供了虚拟内存功能。本文使用的 7. ifpointer指向缓冲区中 8. 创建一个对象object 9. D c“一从pointer地址中读出值 1O. 标记bufer中pointer地址可用 l1. 用object更新映射表 12. return object 13. endif 14. ifpointer指向虚拟内存中 15. 创建一个对象object 16. D c 从pointer地址中读出值 17. 用object更新映射表 1 8. 易 一根据poinWr获得数据块id l9. 更新当前block的空间信息 20. ifblock空闲空间足够大 21. block起始地址c_pointer ̄--addr(block) 22. c_bufer*---从c__pointer读人整个block 23. bufer=merge(buffer,c_bufer) 24. 从c_pointer将bufer写入block中 25. 更新block空间信息 26. 更新数据库映射表 27. endif 28. return object 29. endif 30. returnNULL 该算法使用读数据的操作触发数据库对于虚拟 内存空间的回收,将整个数据块的数据读出用于和 缓冲区中数据进行合并,且在合并时保持原数据块 数据的位置不变更,再写回原数据块中,同时也避 免了原有数据在映射表中的更新操作。 5实验结果与分析 5.1实验环境 本文的实验环境为一台PC机,CPU为四核Intel Core2 Quad CPU Q9650,主存为4 GB,使用500 GB 磁盘和80 GB Intel固态硬盘作为测试平台。实验的 目的主要是测试本文写缓冲区机制对主存KV数据 Redis版本为2.2,这也是当前最新的稳定版本。 5.2实验结果 本文使用了Redis自带的benchmark程序作为 测试程序。这个benchmark会建立50个客户端与数 据库进行通信,并执行相应的操作,来测试每秒钟 系统能完成的操作数。设置了每条测试命令发出l0 万个操作请求,每个操作请求中的数据在给定的10 万个数据中随机取出一个。为了测试不同数据大小 对算法性能的影响,对2O字节和100字节的数据进 一∞ 叮 、 蜊 谳行了测试。该测试针对Redis提供的三种命令Mset、4 2 O 8 Set、Get,对如下四种情况分别进行了实验:(1)虚拟 内存存放在磁盘(Disk);(2)虚拟内存直接存放在固 态硬盘(ssD);(3)增加了写缓冲区的固态硬盘虚拟 内存管理(SSD_BuF);(4)增加了空闲空间回收管理 (SSD—GC)的虚拟内存。实验中开启了Redis的虚拟 内存功能,所有操作都是对虚拟内存中数据的操 作。测试结果如图2~图4。 ■Disk ■SSD —SSD BUF ■SSD GC 20 100 数据大d ̄yte Fig.2 Performance comparison on Mset 图2 Mset操作下的性能对比 5.3结果分析 在实验结果中,有一半实验的固态硬盘的性能 反而不如磁盘的高。虽然固态硬盘的随机读性能要 远远优于磁盘,但是由于其不支持原位更新,写前 6 4一 ∞譬 一\斟 一∞ 譬 )/斟 餐 筠 鲫 ∞ 加 m O 韩旭等:使用固态硬盘管理主存KV数据库的虚拟内存 如 加 如 加 m O 693 ×103 圈Disk ■SSD 图SSD BUF ■SSD GC 20 100 数据大/b/Byte Fig.3 Performance comparison on Set 图3 Set操作下的性能对比 ×103 ■Disk ■SSD 囹SSD BUF ■SSD GC 20 100 数据大dVByte Fig.4 Performance comparison on Get 图4 Get操作下的性能对比 须擦除等特点,在一些特定的数据管理应用中,只 有采用适应固态硬盘特性的算法,才能最大幅度地 发挥固态硬盘的潜能。 由实验结果可以看到,使用写缓冲区的固态硬 盘作为虚拟内存的性能是最高的。加了空闲空间管 理机制后,因为数据库需要管理和维护每一个数据 块的空间,所以性能有所下降。实验中的固态硬盘 对Get命令的提升并没有达到固态硬盘与磁盘在随 机读上性能的差距。这是因为虽然Get命令是对数 据的读操作,但是当前测试时数据库需要将部分数 据交换到虚拟内存中以降低主存占用量,所以Get 命令将数据读人到主存又会触发Redis将数据写回 到虚拟内存中的操作。因此实验中的一个Get命令 实际上对应的是一个从虚拟内存中读取数据和一 个向虚拟内存中写入数据的操作。 从实验结果中可以看到,加入空闲空间管理和 写缓冲区对于Mset命令的性能提升是最大的,最 大可以达到40%。这是由于Redis是一个基于事件 库的系统,一个操作命令会进入到事件库中以等待 执行,Redis会不断扫描这个库中的操作请求。而 Mset命令是对多个key同时赋值,Redis从事件库中 读取并执行一个Mset命令,相当于只读取一次事 件库但是执行了多个Set操作。这使得在整个Redis 执行时间中,Redis检测事件库的时间比例减少,真 正执行命令所占的时间比例上升。而对于Set和Get 操作,Redis每检测事件库只会执行一个数据操作, 检测事件库所消耗的时间比例较高。因此,Mset操 作的测试结果能够更加准确地反映本文使用固态 硬盘作为主存KV数据库虚拟内存,并且使用写缓 冲区和空闲空问管理机制对虚拟内存进行管理,提 升主存KV数据库的性能。 6总结 本文针对主存KV数据库对虚拟内存操作性能 较差的问题,提出了使用固态硬盘作为虚拟内存, 并设计了针对固态硬盘的写缓冲区机制。该机制将 多个随机写转化为一个连续写,进而提高了向虚拟 内存交换数据的执行效率。同时根据固态硬盘特点, 设计了基于数据块的空闲空问回收机制,由读数据 操作触发,将原数据块区域中的数据与缓冲区中数 据合并,并重写入这个数据区域中,避免了虚拟内 存空间的浪费。 Rererences: (1 J Codd E E A relational model of data for large shared data banks[J].Communications of ifle ACM,1970,13(6):377— 387. [2]Danga Interactive.Memcached[EB/OL].【2011-03-19], http://memcached.org 【3】Salvatore Sanfilippo.Redis[EB/OL].[20I1-03—19I.http:// redis.io. [4]Sleepycat Software.BerkeleyDB[EB/OL]_f2011-03—211. 694 Journal ofFrontiers ofComputer Science and Technology计算机科学与探索 2011,5(8) http:Hwww.oracle.com/technetwork/database/berkeleydb/ overview/index.htm1. m J M.A space—efficient flash translation layer [10】 Kim J.Kifor compact—flash systems[J].IEEE Transactions on 【5】Debnath B,Sengupta S,Li Jin.FlashStore:high through— hput persistent key—value store[J].Proceedings of the Consumer Electronics,2002,48(2):366—375. ang Zhichao,Zhou Da,Meng Xiaofeng.Sub—Join: [11】 LiVLDB Endowment,2010,3(1,2):1414-1425. 【6】Debnath B,Sengupta S,Li Jin.SkimpyStash:RAM space skimpy key-・value store on flash・-based storage[C]//Pro— ceedings of the 201 l International Conference on Man— query optimization algorihm tfor lfash—based database[J]. Journal of Frontiers of Computer Science and Technology, 2010,4(5):401—409. __gn of flash—based DBMS:all in—page [12] Lee S,Moon B.Desiagement of Data(SIGMOD’1 1).New York,N USA: ACM.2011:25-36. logging approach[C]//Proceedings of the 2007 ACM SIGM0D International Conference on Management of Data(SIGMOD’07).New York,N USA:ACM,2Oo7: 55-66. lash memory 【13】 Lee S,Moon B,Park C,et a1.A case for f【7】Mtron.Solid state drive MSD—SA11A 3035 product speci— ifcation[EB/OL].(2008)[2009—07—19].http://mtron.net/Upload_ Data/Spec/ASiC/MOBI/SATA/MSD—SATA3035rev0.4.pfd. _SSD in enterprise database applications[C]//Proceedings Of the 2008 ACM SIGMOD International Conference on 【8】Samsung Electronics.1 G x 8Bit/2G x 8Bit/4G x 8Bit NAND flash memory,version 1.1【EB/OL].(2007—06—18) Management of Data(SIGMOD’08).New York,N USA:ACM.2008:1075-1086. 【2009一O6—151.http://www.alldatasheet.com/datasheet— pdf/pdf/139788/SAMSUNG/K9WAG08UIA.htm1. 【9】Intel-Corporation.Understanding the flash translation 附中文参考文献: [11】梁志超,周大,孟小峰.Sub—Join:面向闪存数据库的查 layer(FTL)speciifcations[EB/OL].(1998—12)[2009—06—151. http://www.embeddedfreebsd.org/Documents/Intel一兀L.pdf. 询优化算法[J】.计算机科学与探索,2010,4(5):401--409. HAN Xu was born in 1989.His research interests include lash—based fdatabase and key-value store,etc 韩旭(1989一),男,山东曹县人,主要研究领域为基于闪存的数据库,KV存储等。 CAO Wei was born in 1975.She received her Ph.D.degree from Renmin University of China in 2009. Now she is a lecturer at School of Information,Renmin University of China,and the member of CCF.Her research interests include high performance database,database tuning and flash—based databases. 曹巍(1975一),女,辽宁沈阳人,2009年于中国人民大学获得博士学位,现为中国人民大学信息学院 讲师,CCF会员,主要研究领域为高性能数据库,数据库自管理自调优,闪存数据库。 MENG Xiaofeng was born in 1 964.He received his Ph.D.degree from Chinese Academy of Sciences in 1999.Now he is a professor and doctoral supervisor at Renmin University of China,and the senior mem. ber of CCF His research interests include Web data management,cloud data management,mobile data management,XML data management,flash—aware DBMS and privacy protection. 孟小峰(1964一),男,1999年于中国科学院获得博士学位,现为中国人民大学教授、博士生导师,CCF 高级会员,主要研究领域为Web数据管理,云数据管理,移动数据管理,XML数据管理,闪存数据库 管理,隐私保护。