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