PostgreSQL内核学习笔记(Buffer管理)

Buffer管理是管理磁盘数据与共享内存之间的数据传输。对于数据库的性能有很重要的影响。

概要

Buffer Manager Structure

Buffer Manager包括buffer表(buffer table),buffer 描述符(buff descriptors),和buffer池(buffer pool)

Buffer Tag

所有数据文件的每个页都有一个唯一的值,就是 buffer tag.当buffer manager 收到一个请求后,PostgresSQL就使用这个想要的页的buffer_tag.
buffer_tag包括三个值:

  1. RelFileNode(由表所在的表空间OID,数据库OID和表本身的OID构成)
  2. forkNum(标记缓冲区中是什么类型的文件快)
    表是0
    freespace maps是1
    visibility maps是2
  3. 块号
    例如:buffer_tag '{(16821, 16384, 37721), 0, 7}'
    (16821, 16384, 37721)是RelFileNode,其中表空间OID是16821,数据库OID是16384,表的OID是37721
    0是forkNum
    7是块号

How a Backend Process Reads Pages

一个backend进程如何从buffer管理中读取一个页?
具体过程如下图所示

(1) 当读一个表或index的页时,backend进程发送一个请求给buffer管理,请求中包含buffer_tag.
(2) buffer管返回 存储请求页的slot的buffer_ID。如果请求的页不在buffer pool中,则buffer管理将页从磁盘加载到buffer池的一个slot中,然后返回这个buffer_ID的slot。
(3) backend进程获取这个buffer_ID的slot。

当backend进程修改了buffer 池中的page,并且被修改的页还没有flush到磁盘中,则称此页为脏页(dirty page).

Page Replacement Algorithm

如果请求的页不在buffer pool中,则需要选择一个页被请求的页代替。页的选择也是有算法的,这个算法称为page replacement algorithms。
page replacement algorithms有很多种,PostgreSQL使用了clock sweep算法,这个算法简单而且比LRU算法简单。

Flushing Dirty Pages

脏页应该最终要刷新到磁盘上;这个刷新的任务不是buffer管理做的,PostgreSQL中是通过两个backgroud进程(checkpointerbackground writer)

详细介绍(Buffer Manager Structure)

buffer表(buffer table)

buffer 描述符(buff descriptors)

buffer池(buffer pool)

未完待续
参考资料:http://www.interdb.jp/pg/pgsql07.html

posted @ 2020-05-19 18:00  hayleeliu  阅读(825)  评论(0编辑  收藏  举报