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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM