PostgreSQL 共享缓冲区管理

1 共享缓冲区的内容


数据文件页—表和索引数据块
•可用空间地图
•可见性地图
•缓冲区数组索引
相当于插槽--buffer_ids

1.1 Buffer Tag

Buffer Tag 缓冲区标记
RelFileNode(分别为表对象oid、数据库oid、表空间oid)
•页面的fork number (分别为0、1、2)

  1. 0 表的数据文件
  2. 1 是fsm 文件
  3. 2 是vm文件。

•页面number(即块)

示例:
缓冲区标记{(16821、16384、37721)、0、7}
1、标识第七个块中的页
2、其关系的OID和fork号分别为37721和0(0即为存放表数据的文件)
3、该关系包含在OID为16384的数据库中,表空间的OID为16821

1.2 How a Backend Process Reads Pages

  1. backend process 发送buffer_tagBuffer Mananger,请求一个页面。Buffer Mananger 计算需要的空间(生成buffer id) .
  2. backend porcecess 获取到对应的buffer_id,同时Buffer Mananger ,将数据页面加载到buffer_id 给定的位置。
  3. backend porcecess 直接去访问buffer_id内存地址,获取数据。

1.3 Shared Buffer 替换页面算法

•时钟扫描(8.1开始及以后的版本)
•LRU算法(8.1以前的版本)

1.4 shared buffer 内部详细结构

1.4.1 shared buffer 三层结构

1.4.2 table layer

1.4.3 descriptores layer

Tag
•buffer_id
•refcount
•usage_count
•context_lockand io_in_progress_lock
•Flags
dirty bit
valid bit
io_in_progressbit
•freeNext

1.5 脏页写

1.5.1 bgwriter 调用。

bgwriter_delay 每200ms 调用一次。
bgwriter_lru_maxpages 每次写100 页。

postgres=# show bgwriter_delay ;
 bgwriter_delay 
----------------
 200ms
(1 row)

postgres=# show bgwriter_lru_maxpages ;
 bgwriter_lru_maxpages 
-----------------------
 100
(1 row)