

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# RDS for PostgreSQL 調校的基本概念
<a name="PostgreSQL.Tuning.concepts"></a>

調校 RDS for PostgreSQL 資料庫之前，請務必先瞭解什麼是等待事件及其發生原因。也請檢閱 RDS for PostgreSQL 的基本記憶體和磁碟架構。如需實用的架構圖，請參閱 [PostgreSQL](https://en.wikibooks.org/wiki/PostgreSQL/Architecture) 維基教科書。

**Topics**
+ [RDS for PostgreSQL 等待事件](PostgreSQL.Tuning.concepts.waits.md)
+ [RDS for PostgreSQL 記憶體](PostgreSQL.Tuning.concepts.memory.md)
+ [RDS for PostgreSQL 程序](PostgreSQL.Tuning.concepts.processes.md)

# RDS for PostgreSQL 等待事件
<a name="PostgreSQL.Tuning.concepts.waits"></a>

*等待事件*表示工作階段正在等待資源。例如，當 RDS for PostgreSQL 等待從用戶端接收資料時會發生等待事件 `Client:ClientRead`。工作階段通常會等待如下資源。
+ 透過單一執行緒存取緩衝區，例如，當工作階段嘗試修改緩衝區時
+ 另一個工作階段目前鎖定的資料列
+ 資料檔讀取
+ 日誌檔寫入

例如，為了滿足查詢，工作階段可能執行完整的資料表掃描。如果資料不在記憶體中，工作階段會等待磁碟輸入/輸出完成。將緩衝區讀入記憶體後，工作階段可能需要等待，因為其他工作階段正在存取這些緩衝區。資料庫使用預先定義的等待事件來記錄等待。這些事件分組為多個類別。

單一等待事件本身不表示效能問題。例如，如果請求的資料不在記憶體中，則需要從磁碟讀取資料。如果一個工作階段鎖定資料列來更新，則另一個工作階段要等待此資料列解除鎖定才能更新。遞交需要等待寫入日誌檔完成。等待是資料庫正常運作所不可或缺。

另一方面，大量等待事件通常顯示效能問題。在這種情況下，您可以使用等待事件資料來判斷工作階段將時間花在何處。例如，如果報告通常執行幾分鐘，但現在執行數小時，您可以識別佔總等待時間最多的等待事件。如果您可以查出最常等待事件的原因，通常就能做些改變來改善效能。例如，如果工作階段等待的資料列被另一個工作階段鎖定，您可以結束該鎖定工作階段。

# RDS for PostgreSQL 記憶體
<a name="PostgreSQL.Tuning.concepts.memory"></a>

RDS for PostgreSQL 記憶體分成共用和本機。

**Topics**
+ [RDS for PostgreSQL 中的共用記憶體](#PostgreSQL.Tuning.concepts.shared)
+ [RDS for PostgreSQL 中的本機記憶體](#PostgreSQL.Tuning.concepts.local)

## RDS for PostgreSQL 中的共用記憶體
<a name="PostgreSQL.Tuning.concepts.shared"></a>

RDS for PostgreSQL 在執行個體啟動時配置共用記憶體。共用記憶體分成多個子區域。以下幾節將說明最重要的部分。

**Topics**
+ [共用緩衝區](#PostgreSQL.Tuning.concepts.buffer-pool)
+ [預寫日誌 (WAL) 緩衝區](#PostgreSQL.Tuning.concepts.WAL)

### 共用緩衝區
<a name="PostgreSQL.Tuning.concepts.buffer-pool"></a>

*共用緩衝集區*是一種 RDS for PostgreSQL 記憶體區域，其中保留應用程式連線正在使用或已使用的所有分頁。*分頁*是記憶體形式的磁碟區塊。共用緩衝集區快取從磁碟讀取的資料區塊。集區可減少從磁碟重新讀取資料的次數，讓資料庫運作更有效率。

每個資料表和索引儲存為一連串固定大小的分頁。每個區塊包含多個元組，對應於資料列。元組可以存放在任何分頁中。

共用緩衝集區的記憶體有限。如果新請求需要的分頁不在記憶體中，且已沒有更多記憶體，RDS for PostgreSQL 會移出較不常用的分頁來容納請求。移出政策以時鐘掃描演算法實作。

`shared_buffers` 參數決定伺服器專用於快取資料的記憶體數量。預設值會根據資料庫執行個體的可用記憶體設定為 `{DBInstanceClassMemory/32768}` 位元組。

### 預寫日誌 (WAL) 緩衝區
<a name="PostgreSQL.Tuning.concepts.WAL"></a>

*預寫日誌 (WAL) 緩衝區*保留交易資料，供 RDS for PostgreSQL 稍後寫入持久性儲存。RDS for PostgreSQL 可以透過 WAL 機制達成下列目標：
+ 在故障後復原資料
+ 避免頻繁寫入磁碟以減少磁碟輸入/輸出

當用戶端變更資料時，RDS for PostgreSQL 會將變更寫入 WAL 緩衝區。當用戶端發出 `COMMIT` 時，WAL 寫入器程序會將交易資料寫入 WAL 檔案。

`wal_level` 參數會決定有多少資訊會寫入 WAL，可能的值包括 `minimal`、`replica` 和 `logical`。

## RDS for PostgreSQL 中的本機記憶體
<a name="PostgreSQL.Tuning.concepts.local"></a>

每個後端程序會配置本機記憶體來處理查詢。

**Topics**
+ [工作記憶體區域](#PostgreSQL.Tuning.concepts.local.work_mem)
+ [維護工作記憶體區域](#PostgreSQL.Tuning.concepts.local.maintenance_work_mem)
+ [暫時緩衝區域](#PostgreSQL.Tuning.concepts.temp)

### 工作記憶體區域
<a name="PostgreSQL.Tuning.concepts.local.work_mem"></a>

*工作記憶體區域*為執行排序和雜湊的查詢保留暫存資料。例如，含有 `ORDER BY` 子句的查詢執行排序。查詢在雜湊聯結和彙總中使用雜湊表。

`work_mem` 參數會指定在寫入暫存磁碟檔案之前，供內部排序操作和雜湊表使用的記憶體數量 (以 MB 為單位)。預設值為 4 MB。多個工作階段可以同時執行，每個工作階段可以平行執行維護操作。因此，使用的總工作記憶體可能是 `work_mem` 設定的倍數。

### 維護工作記憶體區域
<a name="PostgreSQL.Tuning.concepts.local.maintenance_work_mem"></a>

*維護工作記憶體區域*快取維護操作的資料。這些操作包括清理、建立索引和新增外部索引鍵。

`maintenance_work_mem` 參數會指定供維護操作使用的記憶體數量上限 (以 MB 為單位)。預設值為 64 MB。一個資料庫工作階段一次只能執行一個維護操作。

### 暫時緩衝區域
<a name="PostgreSQL.Tuning.concepts.temp"></a>

*暫時緩衝區域*快取每個資料庫工作階段的暫存資料表。

每個工作階段視需要配置暫存緩衝區，以您指定的限制為上限。工作階段結束時，伺服器會清除緩衝區。

`temp_buffers` 參數會設定每個工作階段使用的暫存緩衝區數目上限 (以 MB 為單位)。預設值為 8 MB。在工作階段內第一次使用暫存資料表之前，您可以變更 `temp_buffers` 值。

# RDS for PostgreSQL 程序
<a name="PostgreSQL.Tuning.concepts.processes"></a>

RDS for PostgreSQL 使用多個程序。

**Topics**
+ [郵件管理員程序](#PostgreSQL.Tuning.concepts.postmaster)
+ [後端程序](#PostgreSQL.Tuning.concepts.backend)
+ [背景程序](#PostgreSQL.Tuning.concepts.vacuum)

## 郵件管理員程序
<a name="PostgreSQL.Tuning.concepts.postmaster"></a>

*郵件管理員程序*是您啟動 RDS for PostgreSQL 時啟動的第一個程序。郵件管理員程序有下列主要責任：
+ 分叉和監控背景程序
+ 接收來自用戶端程序的身分驗證請求，並在驗證請求之後才允許資料庫處理請求

## 後端程序
<a name="PostgreSQL.Tuning.concepts.backend"></a>

如果郵件管理員驗證用戶端請求，郵件管理員會分叉新的後端程序，也稱為 postgres 程序。一個用戶端程序只連線到一個後端程序。用戶端程序和後端程序直接通訊，無須郵件管理員程序介入。

## 背景程序
<a name="PostgreSQL.Tuning.concepts.vacuum"></a>

郵件管理員程序分叉幾個程序來執行不同的後端任務。一些較重要的程序包括：
+ WAL 寫入器

  RDS for PostgreSQL 將 WAL (預寫日誌) 緩衝區中的資料寫入日誌檔。預寫日誌的原則是直到資料庫將描述變更的日誌記錄寫入磁碟之後，資料庫才能將這些變更寫入資料檔。WAL 機制可減少磁碟輸入/輸出，並允許 RDS for PostgreSQL 在故障後使用日誌來復原資料庫。
+ 背景寫入器

  這個程序定期將已變更 (已修改) 分頁從記憶體緩衝區寫入資料檔。當後端程序在記憶體中修改分頁時，此分頁會變成已變更。
+ 自動資料清理常駐程式

  此常駐程式由下列組成：
  + 自動資料清理啟動器
  + 自動資料清理工作者程序

  自動資料清理啟用時會檢查已插入、更新或刪除大量元組的資料表。此常駐程式有下列責任：
  + 復原或重複使用已更新或刪除的資料列所佔用的磁碟空間
  + 更新規劃員使用的統計數字
  + 防止因交易 ID 環繞而遺失舊資料

  自動資料清理功能可自動執行 `VACUUM` 和 `ANALYZE` 命令。`VACUUM` 有以下變體：標準和完整。標準清理與其他資料庫操作平行執行。`VACUUM FULL` 需要獨佔鎖定其處理的資料表。因此，無法與存取同一個資料表的操作平行執行。`VACUUM` 會建立大量輸入/輸出流量，可能導致其他作用中工作階段的效能不佳。