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