PostgreSQL的SSD优化方案

  • 格式:pdf
  • 大小:201.12 KB
  • 文档页数:3

第35卷第4期 2012年8月 电子器件 

Chinese Journal of Electron Devices Vo1.35 No.4 Aug.2012 

The PostgreSQL SSD Optimization 

ZHANG Zhenlong 

(Computer and Information Science,Xiamen University,Xiamen Fujian 360000,China) 

Abstract:Recent years,database vendors have been using the SSD to optimize their products,the optimization of the 

SSD in the database to become the hot spot of research.This paper is based on the well—known open source database,the PostgreSQL.And detailed the cache management methods were analysed detailed,and combined with the features of SSD,to design and implement a set of PostgreSQL,using to the SSD as a level two cache.Benchmark tests show that enhance database performance has enhanced about 10%.With the advent of the newer storage devices,database storage structure will be greater development. 

Key words:database;optimization;level-2 cache;postgreSQL;SSD EEACC:7210G doi:10.3969/j.issn.1005—9490.2012.04.024 

PostgreSQL的SSD优化方案水 

张振龙 

(厦门大学计算机与信息学院,福建厦门360000) 

摘 要:近年来各数据库厂商纷纷推出对SSD的优化方案,以提升产品的竞争力,因此SSD在数据库中的优化成为现在研究 的热点。基于著名的开源数据库PostgreSQL,详细分析了PostgreSQL的缓存管理方法,并结合SSD的特性,设计并实现了一套 在PostgreSQL上的,将SSD作为二级缓存的优化方案,基准测试表明,数据库性能有10%左右的提升。随着更新型的存储设 备的出现.数据库存储结构将有更大的发展。 关键词:数据库;优化;二级缓存;postgreSQL;SSD 中图分类号:TP392 文献标识码:A 文章编号:1005—9490(2012)04—0474—03 

近几年.越来越多的非关键性业务开始尝试使 

用开源数据库以节省成本,在开源数据库中 PostgreSQL是功能最为完善的关系型数据库。本文 

选取PostgreSQL作为原型数据库。 sso(固态硬盘)是摒弃传统磁介质,其存储优 

势是高速的顺序读取和顺序写入,高速的随机读取 性能;劣势是价格偏高,寿命较短,以及写入放大,本 

文将结合SSD的特点,将其使用在数据库系统中, 以提升数据库系统的整体效率。 

1 相关工作 

目前许多知名数据库厂商也针对SSD提出了 自己产品的改进方案,许多学术研究也把SSD中使 

用数据库优化作为研究方向。研究点大概集中在以 

下几点: 

项目来源:企业项目 收稿日期:2012—04—20 修改日期:2012-05-06 (1)将整个数据库放置在SSD上,提出一种新 的数据库存储概念。为闪存数据库,并围绕闪存数据 

库对数据存储方式提出各种改进算法。但是,由于 

SSD本身的寿命问题,以及成本问题,该数据库只能 应用于小型的非关键性应用。 (2)在关系型数据库中,将13志,索引,临时表 

空间,回滚段这些信息放置到SSD中,以提高数据 库整体执行效率。13志的特点是大量的顺序写操 作,而索引,临时表空间,回滚段的特点是顺序写,随 

机读。而且这些数据都属于是非关键性数据,可重 建.因此.如果一时的SSD损坏并不影响数据的一 

致性。因此完全符合SSD的特点,可以在一定程度 上提升数据库的存储效率。 (3)使用SSD作为二级缓存,也就是我们熟知 的Oracle的flashcache,这点Oracl

e已经成功地商 第4期 张振龙:PostgreSQL的SSD优化方案 475 

用.并为其数据库带来了可观的性能提升。利用 SSD的特性.把从一级缓存中置换出来的数据存储 到SSD中,将SSD其作为二级缓存,由于缓存中的 

数据也不是关键数据,且在使用时制定SSD读写策 略,使其符合随机读顺序写的原则。但是,由于 

Oracle是商业软件,其对SSD的使用的具体策略并 没有公开,本文将使用SSD作为PostgreSQL的二级 

缓存。 

2 PostgreSQL使用SSD优化 

数据库对磁盘数据进行访问时,如果是首次,首 先将数据从磁盘中取出,然后放置到共享缓存,再从 

共享缓存中获取数据进行处理。如果要取的数据在 共享缓存中已经存在,则直接从共享缓存中获取该 

数据进行处理。因此,有共享缓存的存在,大大提升 了数据库的执行效率,减少了数据库的10瓶颈。而 

且,只要是数据库需要的数据,都必须经过共享 缓存。 本文先分析了目前PostgreSQL的共享缓存管理 

方法,然后设计一套策略。并对其进行实现。 2.1 PostgreSQL的共享缓存管理方法 

PostgreSQL对共享缓存的管理方式采用哈希表 以及描述符的方式进行管理。首先在初始化阶段, 

PostgreSQL开辟出一块空间,缓冲区描述符合缓冲 区块的存储空间是连续分配的,而哈希表则分配在 

另一个空间中。 在分配完空间后,描述符与共享缓存空间块是 

一个一一对应的关系,其使用关系则通过哈希表保 

存.一个缓存块的大小在PostgreSQL中默认为8 kbyte。而描述符是以一个数据结构的方式存在,具 

体的数据结构名称叫BufferDesc,在Bur_internals.h 中定义,主要的字段有 refcount:用于下文提到的时钟算法轮寻: 

build:表示所指向的缓冲的块号.默认为4096 个块.以整形方式标识: 

freenext:下一个空闲块的地址,用于下文中提 到的Freelist的管理: 

缓冲区管理的核心就是其对缓冲块的分配方 式,上层接口请求数据时.发送一个BufferTag的数 据结构,该数据结构包含三个字段; 

RelFileNode mode:物理文件的编号: ForkNumber forkNum:当前的文件分支.PG文 

件有三种,在这不详细描述: 

BlockNumber blockNum:当前请求的文件块号 有了这三个值,我们就可以找到对应文件的内 容。这个时候,PostgreSQL并不是马上去磁盘读取 数据。而是将这三个值作为上文中提到的哈希表的 

Key,看是否能在哈希表中找到,而哈希表的Value 正是build。如果能找到,则表示将要请求的这个数 

据正在缓冲区中.直接返回该缓冲区的内容即可;如 果不能找到,再分配一个新的build,并维护哈希表, 

记录下这次磁盘读取。 在共享缓冲区满的时候,又有新的请求需要分 

配共享缓冲区块时,触发缓冲区分配算法,而经典的 也是最简单的缓冲区管理算法就是FIFO,但是一般 

在实际应用中会采用改进的FIFO算法,例如在 PostgreSQL中所采用的算法就是时钟扫描算法。该 

算法在BufferAlloc.c中调用,时钟扫描算法的基本 原理就是,依次扫描所有的共享缓存描述符,在描述 

符中记录了一个refcount的值.如果该值为0,这将 这个共享缓存返回,并使用这个共享缓存块;如果这 

个值不为0,则把这个值减1.继续找寻下一个。而 refcount这个计数器是当这个共享缓存中的数据被 访问时累加1,但是最大值为5。 

时钟扫描算法的弊端就是要遍历所有的共享缓 存块,这样带来了较大的开销。特别是当数据库进 

行大规模读写。或者数据库进行VACUUM的时候. 就会对缓存造成频繁的换人换出。因此,在 

PostgreSQL中,对以上场景采用了一种称为环的策 略。在上层接口中.可以指定共享缓存的分配方式, 如果需要进行环的方式分配,则在分配过程中记录 

事先设定好的环大小,将分配过程中涉及的缓存块 形成一个环,之后如果再需要分配,只在环中进行分 

配,而不会动用环之外的缓存块,从而避免整个共享 缓冲区被大量换人换出。 在对共享缓存的操作过程中.必然要涉及到锁。 PostgreSQL中控制共享缓冲区访问有两种锁。 (1)自旋锁:又称为pin锁,利用互斥量实现的 

底层锁.用于内存块访问。 

(2)内容锁:分为共享锁和排他锁,利用pin锁 实现的上层锁,用于进程问并发的排他和共享操作。 2.2使用SSD作为PostgreSQL二级读缓存 

将SSD作为PostgreSQL的二级缓存一般有三 种方式。一种是作为读数据时的缓存(缓存非脏数 

据),也可以作为写数据时的缓存(只缓存脏数据), 

最后可以作为读写共存的缓存。而本文对SSD作 为读数据的缓存进行详细描述,作为写或者读写缓 

存的场景在这里不考虑,有兴趣的读者可以自己研 究实现。 

作为二级缓存的基本思想就是将一级缓存中存