標籤:color 緩衝區 16px 訊息 大小 log 數值 postgre class
本文主要講述了PG的幾個主要進程,以及PG的核心架構。進程和體繫結構詳見:
從上面的體繫結構圖可以看出來,PG使用經典的C/S架構,進程架構。在伺服器端有主進程、服務進程、子進程、共用記憶體以及檔案儲存體幾大部分,下面詳細講述伺服器段的幾大部分:
1. Postmaster主進程和服務進程
當PG資料庫啟動時,首先會啟動Postmaster主進程。這個進程是PG資料庫的總控制進程,負責啟動和關閉資料庫執行個體。實際上Postmaster進程是一個指向postgres命令的連結,如下:
[[email protected] ~]$ ll /opt/postgresql/bin/postmaster lrwxrwxrwx. 1 postgres dba 8 Aug 7 23:33 /opt/postgresql/bin/postmaster -> postgres
當使用者和PG資料庫建立串連時,要先與Postmaster進程建立串連,此時用戶端進程會發送身分識別驗證訊息給Postmaster主進程,Postmaster主進程根據訊息進行身分識別驗證,驗證通過後,Postmaster主進程會fork出一個會話服務進程為這個使用者串連服務。可以通過pg_stat_activity表來查看服務進程的pid,如下:
test=# select pid,usename,client_addr,client_port from pg_stat_activity; pid | usename | client_addr | client_port -------+----------+-------------+------------- 26402 | postgres | | -1(1 row)
2. BgWriter(後台寫)進程
BgWriter進程是把共用記憶體中的髒頁寫到磁碟上的進程。它的作用有兩個:一是定期把髒資料從記憶體緩衝區刷出到磁碟中,減少查詢時的阻塞;二是PG在定期作檢查點時需要把所有髒頁寫出到磁碟,通過BgWriter預先寫出一些髒頁,可以減少設定檢查點(CheckPoint,資料庫恢複技術的一種)時要進行的IO操作,使系統的IO負載趨向平穩。BgWriter是PostgreSQL 8.0以後新加的特性,它的機制可以通過postgresql.conf檔案中以"bgwriter_"開頭配置參數來控制:
# - Background Writer -#bgwriter_delay = 200ms # 10-10000ms between rounds
#bgwriter_lru_maxpages = 100 # 0-1000 max buffers written/round#bgwriter_lru_multiplier = 2.0 # 0-10.0 multiplier on buffers scanned/round#bgwriter_flush_after = 512kB # measured in pages, 0 disables
bgwriter_delay:
backgroud writer進程連續兩次flush資料之間的時間的間隔。預設值是200,單位是毫秒。
bgwriter_lru_maxpages:
backgroud writer進程每次寫的最多資料量,預設值是100,單位buffers。如果髒資料量小於該數值時,寫操作全部由backgroud writer進程完成;反之,大於該值時,大於的部分將有server process進程完成。設定該值為0時表示禁用backgroud writer寫進程,完全有server process來完成;配置為-1時表示所有髒資料都由backgroud writer來完成。(這裡不包括checkpoint操作)
bgwriter_lru_multiplier:
這個參數表示每次往磁碟寫資料區塊的數量,當然該值必須小於bgwriter_lru_maxpages。設定太小時需要寫入的髒資料量大於每次寫入的資料量,這樣剩餘需要寫入磁碟的工作需要server process進程來完成,將會降低效能;值配置太大說明寫入的髒資料量多於當時所需buffer的數量,方便了後面再次申請buffer工作,同時可能出現IO的浪費。該參數的預設值是2.0。
bgwriter的最大資料量計算方式:
1000/bgwriter_delay*bgwriter_lru_maxpages*8K=最大資料量
bgwriter_flush_after:
資料頁大小達到bgwriter_flush_after時觸發BgWriter,預設是512KB。
【PostgreSQL】進程及體繫結構