LWLock:BufferMapping (LWLock:buffer_mapping)
当会话正在等待将数据块与共享缓冲池中的缓冲区关联起来时,会发生此事件。
注意
对于 RDS for PostgreSQL 版本 13 及更高版本,此事件命名为 LWLock:BufferMapping
。对于 RDS for PostgreSQL 版本 12 及更旧版本,此事件命名为 LWLock:buffer_mapping
。
支持的引擎版本
此等待事件信息与 RDS for PostgreSQL 版本 9.6 及更高版本相关。
上下文
共享缓冲池是一个 PostgreSQL 内存区域,它包含进程现在正在使用或过去使用的所有页面。当进程需要页面时,它会将页面读入共享缓冲池中。shared_buffers
参数会设置共享缓冲区大小并保留一个内存区域来存储表和索引页。如果更改此参数,请确保重新启动数据库。
以下情况下回发生 LWLock:buffer_mapping
等待事件:
-
进程在缓冲区表中搜索页面并获取共享缓冲区映射锁。
-
进程将页面加载到缓冲池中并获取独占缓冲区映射锁。
-
进程从缓冲池中删除页面并获取独占缓冲区映射锁。
原因
当此事件发生超过正常时(可能表示性能问题),数据库正在共享缓冲池中移入和移出分页。典型的原因包括:
-
大型查询
-
臃肿的索引和表
-
完整的表扫描
-
小于工作集的共享池大小
操作
根据等待事件的原因,我们建议采取不同的操作。
监控缓冲区相关的指标
当 LWLock:buffer_mapping
等待激增时,调查缓冲区命中率。您可以使用这些指标更好地了解缓冲区缓存中发生的情况。检查以下指标:
blks_hit
-
此性能详情计数器指标表示从共享缓冲池中检索的数据块的数量。当
LWLock:buffer_mapping
等待事件出现后,您可能会观察到blks_hit
激增。 blks_read
-
此性能详情计数器指标表示需要将输入/输出读入共享缓冲池的数据块的数量。您可能会在
LWLock:buffer_mapping
等待事件的前面观察到blks_read
激增。
评估您的索引策略
要确认您的索引策略不会降低性能,请检查以下各项:
- 索引膨胀
-
确保索引和表膨胀不会导致不必要的分页被读入共享缓冲区。如果表中包含未使用的行,请考虑存档数据并从表中删除这些行。然后,您可以为调整大小的表重建索引。
- 常用查询的索引
-
要确定您是否拥有最佳索引,请在性能详情中监控数据库引擎指标。
tup_returned
指标显示读取的行数。tup_fetched
指标显示返回到客户端的行数量。如果tup_returned
明显大于tup_fetched
,可能无法正确编制数据索引。此外,您的表统计数据可能不是最新的。
减少必须快速分配的缓冲区数量
要减少 LWLock:buffer_mapping
等待事件,请尝试减少必须快速分配的缓冲区数量。一种策略是执行较小的批处理操作。通过对表进行分区,也许能够实现较小的批处理。