圖解PostgreSQL進(jìn)程結(jié)構(gòu)和內(nèi)存結(jié)構(gòu)
本文轉(zhuǎn)載自微信公眾號「數(shù)據(jù)和云」,作者陳家睿。轉(zhuǎn)載本文請聯(lián)系數(shù)據(jù)和云公眾號。
一.建立會話的過程
階段一:
客戶端發(fā)起請求。
階段二:
該階段由主服務(wù)postmaster進(jìn)程負(fù)責(zé)。
- 服務(wù)器是否接受客戶端的host通信認(rèn)證。
- 服務(wù)器對客戶端進(jìn)行身份鑒別。
- PM進(jìn)程:提供監(jiān)聽、連接協(xié)議、驗(yàn)證功能,fork其他進(jìn)程 ,監(jiān)聽哪個IP是受到postgres.conf影響的,默認(rèn)提供socket和TCP方式連接,建立會話的過程 。
- 驗(yàn)證功能:通過pg_hba.conf和用戶驗(yàn)證模塊來提供。
階段三:
階段二通過之后,主服務(wù)進(jìn)程為該客戶端單獨(dú)fork一個客戶端工作進(jìn)程Postgres。
SP進(jìn)程:會話進(jìn)程。用戶一旦驗(yàn)證成功就會fork一個新的進(jìn)程。
分配PGA里面的work_mem,從磁盤讀取數(shù)據(jù)到SGA中,與SP通信。
階段四:
客戶端與Postgres進(jìn)程建立通信連接,由Postgres進(jìn)程負(fù)責(zé)后續(xù)所有的客戶端請求操作,直至客戶端退出后,該P(yáng)ostgres進(jìn)程消失。
二.更新語句的流程
- BgWriter(后臺寫)進(jìn)程
- WaLWriter(預(yù)寫式日志)進(jìn)程
- AutoVAcuum(系統(tǒng)自動清理)
- SysLogger(系統(tǒng)日志)進(jìn)程
- PgArch(歸檔)進(jìn)程
- PgStat(統(tǒng)計(jì)數(shù)據(jù)收集)進(jìn)程
- CheckPoint(檢查點(diǎn))進(jìn)程
建立通信之后,更新操作將磁盤中數(shù)據(jù)讀取到shared_buffers,對數(shù)據(jù)的操作在此進(jìn)行,同時會在log buffer中記錄更新操作,并且后續(xù)會有BgWriter(圖中BGW進(jìn)程)進(jìn)程將數(shù)據(jù)刷臟到磁盤中。
數(shù)據(jù)刷臟前,日志會先落盤,log buffer會被進(jìn)程WaLWriter(預(yù)寫式日志)進(jìn)程刷新到磁盤。
三.PGA內(nèi)存
- temp_buffers---臨時緩沖區(qū)
用于存放數(shù)據(jù)庫會話訪問臨時表數(shù)據(jù),系統(tǒng)默認(rèn)值為8M。
可以在單獨(dú)的session中對該參數(shù)進(jìn)行設(shè)置,尤其是需要訪問比較大的臨時表時,將會有顯著的性能提升。
- work_mem --- 工作內(nèi)存或者操作內(nèi)存
其負(fù)責(zé)內(nèi)部的sort和hash操作,合適的work_mem大小能夠保證這些操作在內(nèi)存中進(jìn)行。
- maintenance_work_mem ---維護(hù)工作內(nèi)存
主要是針對數(shù)據(jù)庫的維護(hù)操作或者語句。
主要針對VACUUM,CREATE INDEX,ALTER TABLE ADD FOREIGN KEY等操作。
在對整個數(shù)據(jù)庫進(jìn)行VACUUM或者較大的index進(jìn)行重建時,適當(dāng)?shù)恼{(diào)整該參數(shù)非常必要。
PostreSQL文檔提示在啟用了autoacuum功能的情況下,該參數(shù)不能配置的過大。
四.SGA內(nèi)存
- shared_buffers ---共享緩沖區(qū)
它表示數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)塊的個數(shù),每個數(shù)據(jù)塊的大小是8KB。
數(shù)據(jù)緩沖區(qū)位于數(shù)據(jù)庫的共享內(nèi)存中,它越大越好,不能小于128KB。
這個參數(shù)只有在啟動數(shù)據(jù)庫時,才能被設(shè)置。
默認(rèn)值是128MB。
推薦值:1/4 主機(jī)物理內(nèi)存。
- wal_buffers --- 日志緩存區(qū)的大小
可以降低IO,如果遇上比較多的并發(fā)短事務(wù),應(yīng)該和commit_delay一起用 。
存放WAL數(shù)據(jù)的內(nèi)存空間大小,系統(tǒng)默認(rèn)值是64K。
墨天輪原文鏈接:https://www.modb.pro/db/185840?sjhy