pg_buffercache插件提供了可观测视图,视图中包含了表或索引的被访问信息和占用共享缓冲区(shared buffer)的比例等。通过这些信息可分析数据库的访问情况,以优化查询,从而提高数据库性能。
功能介绍
云原生数据仓库 AnalyticDB PostgreSQL 版通过pg_buffercache插件,提供共享缓冲区中缓存的不同粒度页面(Page)信息的可观测视图。DBA可以通过监控这些可观测视图实现:
识别热点数据。频繁出现在共享缓冲区中的表或索引可能代表了系统中的访问热点,对这些表或索引做进一步的查询优化可显著提升数据库性能。
优化缓存配置。根据缓存的实际使用情况,调整共享缓冲区的大小,确保关键数据得到充分缓存,减少磁盘I/O操作。
预防性能瓶颈。通过定期分析,可以在缓存资源成为瓶颈之前,采取措施例如增加缓存资源或调整数据访问策略,以维持数据库的高性能运行。
结合pg_prewarm插件的使用,可以主动将未来可能出现高频率访问的表或索引数据预加载到共享缓冲区中。尤其是在系统启动后预测到访问模式变化时,有效减少了因数据未在缓存中而导致的首次访问延迟,保证了数据库响应的稳定性。
版本限制
当前pg_buffercache插件支持的实例版本和内核版本必须满足以下条件:
AnalyticDB PostgreSQL 6.0版实例且内核版本为v6.6.2.5及以上。
AnalyticDB PostgreSQL 7.0版实例且内核版本为v7.1.0.0及以上。
Serverless版本暂不支持。
安装与卸载
安装插件
使用pg_buffercache插件之前,您需要在云原生数据仓库 AnalyticDB PostgreSQL 版实例插件管理中安装pg_buffercache插件。具体操作,请参见安装、升级与卸载插件。
卸载插件
当您不需要pg_buffercache插件时,可以在插件管理页面卸载pg_buffercache插件。具体操作,请参见安装、升级与卸载插件。
使用示例
为了避免对实例的运行产生影响,本文中所提供的表、索引等均为无锁版本,对业务无影响。在业务并发较大时,获取的统计结果可能会出现一定程度的误差。
获取协调(master)节点缓存使用情况
SELECT * FROM shared_buffer_stat_master_lockfree;
返回结果如下。
relname | percentage_in_shared_buffer | pages_in_shared_buffer
---------------------------+-----------------------------+------------------------
others | 0.53125 | 85
pg_depend_reference_index | 0.09375 | 15
pg_depend | 0.05625 | 9
...
relname:在共享缓冲区中占用空间的表或索引的名称。这有助于分析哪些数据库对象最频繁被访问,影响缓存效率和查询性能。
percentage_in_shared_buffer:该表或索引所占共享缓冲区的比例。通过该指标可了解哪些表或索引占据了缓冲区的主要部分,进而可分析是否需要调整缓存分配策略或优化访问模式以平衡资源使用。
pages_in_shared_buffer:在共享缓冲区中缓存的表或索引的页面数量。页面是数据库存储的基本单位,了解各对象的缓存页面数量有助于评估数据访问的局部性与缓存命中率。
对于部分临时存在的对象,若查询时对应的元数据已不可见,其占用会被统计到others项中。
获取计算(segment)节点缓存使用情况
SELECT * FROM shared_buffer_stat_segments_lockfree;
返回结果如下。
relname | percentage_in_shared_buffer
------------------------+-----------------------------
gp_distribution_policy | 0.00625
pg_namespace_oid_index | 0.0125
pg_rewrite | 0.00625
...
返回结果与master节点的缓存使用情况结果相似,但percentage_in_shared_buffer
返回的是对应表或索引在各个计算节点共享缓冲区中的占用平均值。
获取协调(master)节点缓存整体使用情况
SELECT * FROM shared_buffer_summary_master_lockfree;
返回结果如下。
pages_in_use | pages_marked_dirty | pages_total
--------------+--------------------+-------------
594 | 594 | 16000
pages_in_use: 当前正在被使用的缓冲页面数量。
pages_marked_dirty:被标记为“脏”的页面的数量。即指在缓冲区内被修改过但尚未同步回磁盘的数据页面。该数值反映了写操作的活跃程度及潜在的I/O写回压力。
pages_total:共享缓冲区配置的最大页面数,即数据库可以利用的缓存总量。
获取计算(segment)节点缓存整体使用情况
SELECT * FROM shared_buffer_summary_segments_lockfree;
返回结果如下。
pages_in_use | pages_marked_dirty | pages_total
--------------+--------------------+-------------
11328 | 11328 | 98304
...
与master节点整体使用情况结果相似,但返回的结果为所有计算节点的统计数据汇总。
获取特定表或索引缓存命中情况
语法
SELECT * FROM relation_shared_buffer_stat_lockfree('<查询的表或索引名>'::regclass);
使用示例
SELECT * FROM relation_shared_buffer_stat_lockfree('adbpg_autoanalyze_test_table'::regclass);
返回结果如下。
relname | total_pages | pages_in_shared_buffer
------------------------------+-------------+------------------------
adbpg_autoanalyze_test_table | 20055 | 3327
(1 row)
relname:本次查询的表或索引的名称。
total_pages:指定表或索引在数据库中的总页面数量。
pages_in_shared_buffer:该表或索引当前在共享缓冲区中缓存的页面数量。通过比较
total_pages
和pages_in_shared_buffer
,可以直观地了解到该数据结构的缓存命中潜力及实际缓存效率,进而分析是否需要调整缓存策略或优化数据访问模式以提高缓存利用率和数据库查询性能。
获取特定表及其相关的索引和TOAST表缓存命中情况
语法
SELECT * FROM relation_detail_shared_buffer_stat_lockfree('<查询的表或索引名>'::regclass);
参数说明
当传入值是表的名称,此时返回的结果包含表自身、表的索引、依赖于该表的TOAST表的缓存命中情况。
当传入值是索引名称(通常索引没有子依赖),返回结果只有索引本身的缓存命中情况。
使用示例
SELECT * FROM relation_detail_shared_buffer_stat_lockfree('adbpg_autoanalyze_test_table'::regclass);
返回结果如下。
relname | total_pages | pages_in_shared_buffer
------------------------------+-------------+------------------------
adbpg_autoanalyze_test_table | 20055 | 3327
(1 row)
通过该方法,不仅可以获取指定表自身的缓存情况,还能深入了解与之相关的索引或TOAST表在共享缓冲区中的缓存情况。这一信息对于全面分析和优化数据库性能十分关键。
例如,在上述示例中,尽管表adbpg_autoanalyze_test_table
有相当一部分页面(3327/20055)位于共享缓冲区中,提高了查询效率。但与其关联的索引adbpg_autoanalyze_test_table_i_idx
却没有任何页面被缓存。这可能导致在使用索引查询时,出现性能不佳的情况。