Postgresql技術內幕系列-第二章 進程與內存架構

原文鏈接:http://www.interdb.jp/pg/pgsql02.html

本章主要介紹pg的進程架構和內存架構,如果您對此已經非常熟悉,可跳過本章閱讀後續章節。

2.1 進程架構

PostgreSQL是一個C/S架構的關係型數據庫管理系統,在一個服務器中採用了多進程架構。

'PostgreSQL server'指的是用以一組數據庫後臺進程的集合,用於管理一個數據庫集合。pg server包括以下主要後臺進程:

                                                    圖2.1 PG進程架構圖

  • postgres server process  是所有進程的父進程

  • backend process 是每一個客戶端的連接都有一個後端進程,用以處理所有查詢和SQL

  • backgroud processes 爲管理數據庫而產生的一些進程,包括vacumm進程、checkpoint進程等等

  • backgroud work processes 9.3以後版本開始有這個進程,是後臺工作進程接口。 後臺工作進程,一個可以運行任意用戶代碼的進程,當然也包括:正常的事務(Transaction)操作。外部模塊可以通過調用shared_preload_libraries函數來註冊一個worker。當然worker也可在運行過程中進行動態註冊。 上述兩類worker進程都是通過由postmaster fork而來。這裏不做詳細介紹,詳見官方文檔。     

2.1.1. Postgres Server 進程

如上所述,postgres server進程是pg server中所有進程的父進程。在早期的版本中,該進程被稱作‘postmaster’進程。

可以通過 pg_ctl 工具啓動一個postgres server進程。然後該進程會分配一塊共享內存,啓動大量background進程,等待客戶端來連接,每產生一個連接就會生成一個backend process,一個postgres server process只能監聽一個端口,默認端口是5432。儘管一臺機器可以運行多個server,但是端口必須不同。

2.1.2. Backend 進程

一個backend進程,常被稱作postgres進程,由postgres server進程啓動,用來處理客戶端連接的查詢請求。通過TCP協議和客戶端建立通訊,當客戶端斷開時,連接消失。

在連接PostgreSQL server時,用戶需要指定所要操作的數據庫名稱。

pg允許同時支持多個連接,配置參數max_connections 用於設置最大連接數,默認值爲100。

如果客戶端頻繁的和服務端建立連接然後斷開,會增加數據庫的開銷,導致服務器負載不正常,因爲數據庫本身不提供連接池的功能,如果有需要,可以使用pgbouncer或者pgpool-II。

2.1.3. Background 進程

表2.1展示了background進程列表,以下對這些進程的功能進行簡要介紹,在後續章節中會進行詳細說明。

進程名稱

描述

詳見

background writer

進程將shared buffer pool中的髒數據寫到磁盤,檢查點總能觸發這個進程

Section 8.6

checkpointer

 在9.2版本以後,檢查點會觸發產生這個進程

Section 8.6

Section 9.7

autovacuum launcher

 爲vacuum process週期性的調用autovacuum work processes

Section 6.5

WAL writer

 週期性的從wal buffer刷新數據到磁盤

Section 9.9

statistics collector

 收集統計信息進程,比如pg_stat_activity 和pg_stat_database的數據

 

logging collector (logger)

將錯誤信息寫入到日誌

 

archiver

 將日誌歸檔

Section 9.10

The actual processes of a PostgreSQL server is shown here. In the following example, one postgres server process (pid is 9687), two backend processes (pids are 9697 and 9717) and the several background processes listed in Table 2.1 are running. See also Fig. 2.1.

一個PostgreSQL Server的進程信息如下所示,一個postgres服務器進程(pid爲9687),兩個後端進程(pids爲9697和9717)以及表2.1中列出的幾個後臺進程正在運行。

2.2. 內存架構

PG中的內存可以分爲兩大類,如下圖所示:

1)本地內存:供各backend進程單獨使用。

2)共享內存:供PostgreSQL server中的所有進程共同使用。

2.2.1. 本地內存

每一個backend process 都會分配一塊local memory area, 每一塊區域又分爲三個子區域 ,見下表

2.2.2. 共享內存

共享內存分類如下:

另外,Postgresql還分配一些其他的共享內存區域:

  • 爲訪問控制分配的子區域,比如輕量級鎖,共享鎖或者專有鎖.
  • 爲其他backgroud process提供的子區域,比如檢查點,vacuum.
  • 爲事物處理提供的子區域,比如事物中的保存點(save-point),和二階段事物提交(two-phase-commit)

譯自http://www.interdb.jp/pg/pgsql02.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章