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包括三个值:
- RelFileNode(由表所在的表空间OID,数据库OID和表本身的OID构成)
- forkNum(标记缓冲区中是什么类型的文件快)
表是0
freespace maps是1
visibility maps是2 - 块号
例如: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进程(checkpointer 和 background writer)
详细介绍(Buffer Manager Structure)
buffer表(buffer table)
buffer 描述符(buff descriptors)
buffer池(buffer pool)
未完待续
参考资料:http://www.interdb.jp/pg/pgsql07.html