1. 程式人生 > >【PostgreSQL】進程及體系結構

【PostgreSQL】進程及體系結構

體系結構 同時 image add 負責 com blog images 後臺

本文主要講述了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】進程及體系結構