

# LWLock:buffer\$1mapping
<a name="apg-waits.lwl-buffer-mapping"></a>

当会话正在等待将数据块与共享缓冲池中的缓冲区关联起来时，会发生此事件。

**注意**  
此事件在 Aurora PostgreSQL 版本 12 及更低版本中显示为 `LWLock:buffer_mapping`，在版本 13 及更高版本中显示为 `LWLock:BufferMapping`。

**Topics**
+ [支持的引擎版本](#apg-waits.lwl-buffer-mapping.context.supported)
+ [上下文](#apg-waits.lwl-buffer-mapping.context)
+ [原因](#apg-waits.lwl-buffer-mapping.causes)
+ [操作](#apg-waits.lwl-buffer-mapping.actions)

## 支持的引擎版本
<a name="apg-waits.lwl-buffer-mapping.context.supported"></a>

此等待时间信息与 Aurora PostgreSQL 版本 9.6 及更高版本相关。

## 上下文
<a name="apg-waits.lwl-buffer-mapping.context"></a>

*共享缓冲池*是一个 Aurora PostgreSQL 内存区域，它包含进程现在正在使用或过去正在使用的所有页面。当进程需要页面时，它会将页面读入共享缓冲池中。`shared_buffers` 参数会设置共享缓冲区大小并保留一个内存区域来存储表和索引页。如果更改此参数，请确保重新启动数据库。有关更多信息，请参阅 [共享缓冲区](AuroraPostgreSQL.Tuning.concepts.md#AuroraPostgreSQL.Tuning.concepts.buffer-pool)。

以下情况下回发生 `LWLock:buffer_mapping` 等待事件：
+ 进程在缓冲区表中搜索页面并获取共享缓冲区映射锁。
+ 进程将页面加载到缓冲池中并获取独占缓冲区映射锁。
+ 进程从缓冲池中删除页面并获取独占缓冲区映射锁。

## 原因
<a name="apg-waits.lwl-buffer-mapping.causes"></a>

当此事件发生超过正常时（可能表示性能问题），数据库正在共享缓冲池中移入和移出分页。典型的原因包括：
+ 大型查询
+ 臃肿的索引和表
+ 完整的表扫描
+ 小于工作集的共享池大小

## 操作
<a name="apg-waits.lwl-buffer-mapping.actions"></a>

根据等待事件的原因，我们建议采取不同的操作。

**Topics**
+ [监控缓冲区相关的指标](#apg-waits.lwl-buffer-mapping.actions.monitor-metrics)
+ [评估您的索引策略](#apg-waits.lwl-buffer-mapping.actions.indexes)
+ [减少必须快速分配的缓冲区数量](#apg-waits.lwl-buffer-mapping.actions.buffers)

### 监控缓冲区相关的指标
<a name="apg-waits.lwl-buffer-mapping.actions.monitor-metrics"></a>

当 `LWLock:buffer_mapping` 等待激增时，调查缓冲区命中率。您可以使用这些指标更好地了解缓冲区缓存中发生的情况。检查以下指标：

`BufferCacheHitRatio`  
此 Amazon CloudWatch 指标测量数据库集群中的数据库实例的缓冲区缓存处理的请求百分比。您可以会在 `LWLock:buffer_mapping` 等待事件的前面看到此指标降低。

`blks_hit`  
此性能详情计数器指标表示从共享缓冲池中检索的数据块的数量。当 `LWLock:buffer_mapping` 等待事件出现后，您可能会观察到 `blks_hit` 激增。

`blks_read`  
此性能详情计数器指标表示需要将输入/输出读入共享缓冲池的数据块的数量。您可能会在 `LWLock:buffer_mapping` 等待事件的前面观察到 `blks_read` 激增。

### 评估您的索引策略
<a name="apg-waits.lwl-buffer-mapping.actions.indexes"></a>

要确认您的索引策略不会降低性能，请检查以下各项：

索引膨胀  
确保索引和表膨胀不会导致不必要的分页被读入共享缓冲区。如果表中包含未使用的行，请考虑存档数据并从表中删除这些行。然后，您可以为调整大小的表重建索引。

常用查询的索引  
要确定您是否拥有最佳索引，请在性能详情中监控数据库引擎指标。`tup_returned` 指标显示读取的行数。`tup_fetched` 指标显示返回到客户端的行数量。如果 `tup_returned` 明显大于 `tup_fetched`，可能无法正确编制数据索引。此外，您的表统计数据可能不是最新的。

### 减少必须快速分配的缓冲区数量
<a name="apg-waits.lwl-buffer-mapping.actions.buffers"></a>

要减少 `LWLock:buffer_mapping` 等待事件，请尝试减少必须快速分配的缓冲区数量。一种策略是执行较小的批处理操作。通过对表进行分区，也许能够实现较小的批处理。