postgresql中的主要進程

一、Postgres在啓動後,可分別以一下四種形式啓動進程:
* SubPostmasterMain
* AuxiliaryProcessMain
* PostgresMain
* PostmasterMain

PostmasterMain
1. 設置進程ID
2. 初始化內存池
3. 設置路徑、時間等變量
4. 初始化GUC選項,處理輸入參數並載入hba和ident
5. 設置共享內存和信號量,初始化共享數據結構
6. 設置信號處理句柄
7. 啓動守護進程:
   (1) syslogger:收集其他其他進程的日誌輸出,寫入到文件
   (2) stats daemon:通過UDP獲取各backend的運行時統計信息
   (3) autovacuum launcher:定期進行表空間的自動清理
8. 由參數forkboot啓動一個backend
9. 綁定到TCP socket,監聽連接請求

PostgresMain(--single)
1. 設置進程ID
2. 初始化內存池
3. 設置路徑、時間等變量
4. 初始化GUC選項,處理輸入參數和其他startup packet中的參數
5. 設置信號處理句柄
6. 初始化一個backend(無論它是否由postmaster生成):ipc, lock, file, storage, buffer
7. 啓動XLOG
8. 加載FreeSpaceMap
9. 初始化進程
10. 初始化表緩存和系統目錄訪問
11. 處理預加載的庫
12. 轉到MessageContext內存池
13. 進入查詢處理主循環

SubPostmasterMain(--fork)
1. 指明由postmaster派生
2. 設置進程ID
3. 初始化內存池
4. 處理輸入參數
5. 運行相應的backend或子進程
   a) –forkbackend或–forkboot
    1) 關聯到共享內存
    2) 初始化共享內存訪問(UsedShmemSegAddr)
    3) 初始化AuxiliaryProcess
    4) 創建共享內存和信號量
    5) 啓動AuxiliaryProcessMain

   b) –forkavlauncher
    1) 關聯到共享內存
    2) AutovacuumLauncherIAm()
    3) 初始化共享內存訪問(UsedShmemSegAddr)
    4) 初始化AuxiliaryProcess
    5) 創建共享內存和信號量
    6) 啓動AutoVacLauncherMain

   c) –forkavworker
    1) 關聯到共享內存
    2) AutovacuumLauncherIAm()
    3) 初始化共享內存訪問(UsedShmemSegAddr)
    4) 初始化AuxiliaryProcess
    5) 創建共享內存和信號量
    6) 啓動AutoVacWorkerMain

   d) –forkarch
    1) 啓動PgArchiverMain
   e) –forkcol
    1) 啓動PgstatCollectorMain
   f) –forklog
    1) 啓動SysLoggerMain

AuxiliaryProcessMain(--boot)
1. 設置進程ID
2. 初始化內存池
3. 設置路徑、時間等變量
4. 初始化GUC選項,處理輸入參數
5. 以BootstrapProcessing模式初始化一個backend:ipc, lock, file, storage, buffer
6. 設置信號處理句柄
7. 以NormalProcessing狀態針對不同auxType分別進行以下處理
   a) CheckerProcess
    1) 啓動CheckerModeMain
   b) BooststrapProcess 
    1) BootstrapXLOG
    2) 啓動XLOG
    3) 啓動BootstrapModeMain
   c) StartupProcess 
    1) 啓動XLOG
    2) 加載FreeSpaceMap
    3) BuildFlatFiles(false)
   d) BgWriterProcess 
    1) 初始化XLOG訪問
    2) 啓動BackgroundWriterMain
   e) WalWriterProcess 
    1) 初始化XLOG訪問
    2) 啓動WalWriterMain

二、CATALOG的導入
1. 獲取存放數據的目錄DataDir
2. 創建該目錄及其子目錄
   "global"
   "pg_xlog"
   "pg_xlog/archive_status"
   "pg_clog"
   "pg_subtrans"
   "pg_twophase"
   "pg_multixact/members"
   "pg_multixact/offsets"
   "base"
   "base/1"
   "pg_tblspc"
3. 初始化內存池
4. 以BootstrapProcessing模式初始化一個backend:ipc, lock, file, storage, buffer
5. 以NormalProcessing模式BootStrapXLOG和啓動XLOG
6. 以BootstrapProcessing模式做類似backend的初始化
   (1) 初始化進程
   (2) 初始化表緩存和系統目錄訪問
7. 讀入bki文件,解析並執行
8. 設置checkpoint確保所有更新被寫入磁盤

三、CATALOG的讀取
1. PostgresMain中的1-9
2. 初始化relation description cache,創建一個空的cache哈希表
3. 初始化system catalogs cache
4. 啓動事務系統
5. 使用formrdesc(僅用於pg_class、pg_attribute、pg_proc和pg_type)讀取預計算好的relcache入口(或nailed-in-cache relations的最小集的phony入口)
6. 在非bootstrapping模式下,確保可以訪問critical system indexes
7. 訪問並更新所有從formrdesc和relcache cache file中獲得的數據。
8. 完成所有catcaches的初始化,預載最重要的系統目錄和索引,並寫入到relcache cache file供將來backend使用。

發佈了41 篇原創文章 · 獲贊 4 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章