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


























