

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



**Topics**
+ [支持的引擎版本](#wait-event.iowalwrite.context.supported)
+ [上下文](#wait-event.iowalwrite.context)
+ [等待次数增加的可能原因](#wait-event.iowalwrite.causes)
+ [操作](#wait-event.iowalwrite.actions)

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

RDS for PostgreSQL 10 及更高版本的所有版本均支持此等待事件信息。

## 上下文
<a name="wait-event.iowalwrite.context"></a>

数据库中生成预写日志数据的活动首先填满 WAL 缓冲区，然后异步写入磁盘。当 SQL 会话等待 WAL 数据完成向磁盘写入以便它可以释放事务的 COMMIT 调用时，会生成等待事件 `IO:WALWrite`。

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

如果这种等待事件经常发生，则应查看您的工作负载以及工作负载执行的更新类型及其频率。特别要查找以下类型的活动。

**繁重的 DML 活动**  
更改数据库表中的数据不会立即发生。对一个表的插入可能需要等待从另一客户端对同一个表进行插入或更新。用于更改数据值的数据操作语言（DML）语句（INSERT、UPDATE、DELETE、COMMIT、ROLLBACK TRANSATION）可能会导致争用，从而导致预写日志文件等待刷新缓冲区。以下 Amazon RDS 性能详情指标反映了这种情况，这些指标表明 DML 活动非常多。  
+  `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 性能详情来检查正在运行的查询类型。您也可以将大型维护操作移至非高峰时段。例如，在非生产时间创建索引或使用 `pg_repack` 操作。

### 监控您的检查点
<a name="wait-event.iowalwrite.actions.monitor"></a>

您可以监控两个参数，以查看 RDS for PostgreSQL 数据库实例对于检查点写入 WAL 文件的频率。
+ `log_checkpoints` –原定设置情况下，该参数为“on”。它会导致对于每个检查点向 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)。