

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

# IO:WALWrite
<a name="wait-event.iowalwrite"></a>



**Topics**
+ [支援的引擎版本](#wait-event.iowalwrite.context.supported)
+ [Context](#wait-event.iowalwrite.context)
+ [等待時間增加的可能原因](#wait-event.iowalwrite.causes)
+ [動作](#wait-event.iowalwrite.actions)

## 支援的引擎版本
<a name="wait-event.iowalwrite.context.supported"></a>

所有 RDS for PostgreSQL 第 10 版和更新版本都支援此等待事件資訊。

## Context
<a name="wait-event.iowalwrite.context"></a>

資料庫中產生預寫日誌資料的資料庫中的活動會先填滿 WAL 緩衝區，然後以非同步方式寫入至磁碟。等待事件 `IO:WALWrite` 是在 SQL 工作階段正在等待 WAL 資料，以完成寫入至磁碟時產生的，以便它可以釋出交易的 COMMIT 呼叫。

## 等待時間增加的可能原因
<a name="wait-event.iowalwrite.causes"></a>

如果此等待事件經常發生，您應該檢閱工作負載，以及工作負載執行的更新類型及其頻率。尤其，尋找下列類型的活動。

**繁重的 DML 活動**  
變更資料庫資料表中的資料不會立即發生。插入至一個資料表可能需要等待另一個用戶端的相同資料表插入或更新。用於變更資料值的資料處理語言 (DML) 陳述式 (INSERT、UPDATE、DELETE、COMMIT、ROLLBACK TRANSACTION) 可能會產生爭用，因而造成預寫日誌檔等待緩衝區排清。此情況是在下列指出繁重 DML 活動的 Amazon RDS Performance Insights 指標中擷取的。  
+  `tup_inserted`
+ `tup_updated`
+ `tup_deleted`
+ `xact_rollback`
+ `xact_commit`
如需這些指標的詳細資訊，請參閱 [Amazon RDS for PostgreSQL 的績效詳情計數器](USER_PerfInsights_Counters.md#USER_PerfInsights_Counters.PostgreSQL)。

**頻繁的檢查點活動**  
頻繁的檢查點會導致 WAL 檔案增加。在 RDS for PostgreSQL 中，整頁寫入一律「開啟」。整頁寫入有助於防範資料遺失。不過，當檢查點發生過於頻繁時，系統可能會遭受整體效能問題。在 DML 活動繁重的系統上尤其如此。在某些情況下，您可能會在 `postgresql.log` 發現錯誤訊息，說明「檢查點發生過於頻繁」。  
建議您在調整檢查點時，仔細平衡效能與異常關機時需要復原的預期時間。

## 動作
<a name="wait-event.iowalwrite.actions"></a>

建議採取下列動作來減少此等待事件的數目。

**Topics**
+ [減少遞交次數](#wait-event.iowalwrite.actions.problem)
+ [監控檢查點](#wait-event.iowalwrite.actions.monitor)
+ [擴增 IO](#wait-event.iowalwrite.actions.scale-io)
+ [專用日誌磁碟區 (DLV)](#wait-event.iowalwrite.actions.dlv)

### 減少遞交次數
<a name="wait-event.iowalwrite.actions.problem"></a>

若要減少遞交次數，您可以將陳述式合併成交易區塊。使用 Amazon RDS Performance Insights 來檢查正在執行的查詢類型。您也可以將大型維護操作移至離峰時段。例如，建立索引或在非生產時段使用 `pg_repack` 操作。

### 監控檢查點
<a name="wait-event.iowalwrite.actions.monitor"></a>

有兩個您可以監控的參數，以查看 RDS for PostgreSQL 資料庫執行個體寫入至 WAL 檔案以取得檢查點的頻率。
+ `log_checkpoints` – 此參數預設為「開啟」。它會導致訊息傳送至每個檢查點的 PostgreSQL 日誌。這些日誌訊息包含寫入的緩衝區數目、寫入它們所花費的時間，以及針對指定檢查點新增，刪除或回收的 WAL 檔案數目。

  如需此參數的詳細資訊，請參閱 PostgreSQL 文件中的[錯誤報告和記錄](https://www.postgresql.org/docs/current/runtime-config-logging.html#GUC-LOG-CHECKPOINTS)。
+ `checkpoint_warning` – 此參數設定檢查點頻率的閾值 (以秒為單位)，若超過此值，就會產生警告。根據預設，此參數不會在 RDS for PostgreSQL 中設定。您可以設定此參數的值，在 RDS for PostgreSQL 資料庫執行個體中的資料庫變更以 WAL 檔案未調整為可處理大小的速率寫入時收到警告。例如，假設您將此參數設為 30。如果您的 RDS for PostgreSQL 執行個體需要寫入變更的頻率超過每 30 秒一次，則「檢查點發生過於頻繁」的警告會傳送至 PostgreSQL 日誌。這可能指出您的 `max_wal_size` 值應該增加。

  如需的詳細資訊，請參閱 PostgreSQL 文件中的[預寫日誌](https://www.postgresql.org/docs/current/runtime-config-wal.html#RUNTIME-CONFIG-WAL-CHECKPOINTS)。

### 擴增 IO
<a name="wait-event.iowalwrite.actions.scale-io"></a>

此類型的輸入/輸出 (IO) 等待事件可透過擴展每秒讀寫次數 (IOPS) 來修補，以提供更快的 IO。擴展 IO 優於擴展 CPU，因為擴展 CPU 可能會導致更多的 IO 爭用，因為增加的 CPU 可以處理更多的工作，從而使 IO 瓶頸更糟。一般而言，在執行擴展操作之前，建議您考慮調整工作負載。

### 專用日誌磁碟區 (DLV)
<a name="wait-event.iowalwrite.actions.dlv"></a>

您可以使用 Amazon RDS 主控台、AWS CLI 或 Amazon RDS API，將專用日誌磁碟區 (DLV) 用於使用佈建 IOPS (PIOPS) 儲存體的資料庫執行個體。DLV 會將 PostgreSQL 資料庫交易日誌移至與包含資料庫資料表的磁碟區不同的儲存磁碟區。如需詳細資訊，請參閱 [專用日誌磁碟區 (DLV)](CHAP_Storage.md#CHAP_Storage.dlv)。