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