PostgreSQL 共享缓冲区管理
1 共享缓冲区的内容
数据文件页—表和索引数据块
•可用空间地图
•可见性地图
•缓冲区数组索引
相当于插槽--buffer_ids
1.1 Buffer Tag
Buffer Tag 缓冲区标记
RelFileNode(分别为表对象oid、数据库oid、表空间oid)
•页面的fork number (分别为0、1、2)
- 0 表的数据文件
- 1 是fsm 文件
- 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
backend process
发送buffer_tag
给Buffer Mananger
,请求一个页面。Buffer Mananger
计算需要的空间(生成buffer id
) .backend porcecess
获取到对应的buffer_id
,同时Buffer Mananger
,将数据页面加载到buffer_id
给定的位置。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)