You need to enable JavaScript to run this app.
文档中心
云数据库 PostgreSQL 版

云数据库 PostgreSQL 版

复制全文
下载 pdf
插件
共享缓冲区实时监控与分析(pg_buffercache)
复制全文
下载 pdf
共享缓冲区实时监控与分析(pg_buffercache)
简介与适用场景​
pg_buffercache 是一个官方提供的标准扩展(contrib module),它为开发与运维人员(DBA)提供了一个观察 PostgreSQL 共享缓冲区(Shared buffer) 内部状态的实时窗口。通过它,我们可以精确地了解到数据块在内存中的分布、使用频率和状态,是进行性能分析与优化的关键工具。​
典型的适用场景包括:​
  • 识别热点数据:快速定位当前数据库中哪些表和索引被频繁访问,其数据页在内存中占比最高。​
  • 评估缓存利用率:分析 shared_buffers 的使用情况,判断其大小是否设置得当,是否存在大量空闲或低效使用的缓存空间。​
  • 观测脏页与钉住页:监控脏页(dirty pages)的比例,理解检查点(checkpoint)的压力;同时,观察被“钉住”(pinned)的缓冲,排查潜在的长时间运行查询或连接问题。​
  • 辅助SQL与索引调优:结合 pg_stat_statements 等工具,分析高成本 SQL 语句所访问的数据是否高效利用了缓存。​
注意事项​
pg_buffercache 的查询需要读取共享缓冲区,频繁执行可能对系统产生轻微性能影响,建议在测试环境或维护窗口进行分析。​
创建与删除插件​
创建插件​
在需要分析的数据库中执行以下命令即可启用 pg_buffercache。​
​
CREATE EXTENSION IF NOT EXISTS pg_buffercache;​
​
删除插件​
如果不再需要此功能,可以执行以下命令进行卸载。卸载后,相关的视图和函数将被移除。​
​
DROP EXTENSION pg_buffercache;​
​
使用插件​
查看各对象占用的缓冲区数量​
以下查询统计当前数据库中占用内存缓冲区最多的表和索引,是识别“热点对象”最直接的方法。​
​
regression=> SELECT n.nspname, c.relname, count(*) AS buffers​
FROM pg_buffercache b JOIN pg_class c​
ON b.relfilenode = pg_relation_filenode(c.oid) AND​
b.reldatabase IN (0, (SELECT oid FROM pg_database​
WHERE datname = current_database()))​
JOIN pg_namespace n ON n.oid = c.relnamespace​
GROUP BY n.nspname, c.relname​
ORDER BY 3 DESC​
LIMIT 10;​
​
nspname | relname | buffers​
------------+------------------------+---------​
public | delete_test_table | 593​
public | delete_test_table_pkey | 494​
pg_catalog | pg_attribute | 472​
public | quad_poly_tbl | 353​
public | tenk2 | 349​
public | tenk1 | 349​
public | gin_test_idx | 306​
pg_catalog | pg_largeobject | 206​
public | gin_test_tbl | 188​
public | spgist_text_tbl | 182​
(10 rows)​
​
应用场景:识别内存占用过高的对象,判断索引是否充分缓存,验证热数据是否有效驻留内存。​
查看缓冲区整体概况​
此函数提供了一个关于共享缓冲区全局状态的快速、低成本快照。​
​
regression=> SELECT * FROM pg_buffercache_summary();​
buffers_used | buffers_unused | buffers_dirty | buffers_pinned | usagecount_avg ​
--------------+----------------+---------------+----------------+----------------​
128 | 0 | 11 | 0 | 1.3984375​
(1 row)​
​
应用场景:快速评估缓冲区整体压力,判断是否存在缓冲区不足或脏页积压问题。​
查看缓冲区的使用计数分布​
此函数按使用计数(usage_count)统计缓冲区分布情况。PostgreSQL 使用时钟扫描算法管理缓冲区,使用计数范围 0~5,数值越高表示页面访问越频繁。​
​
regression=> SELECT * FROM pg_buffercache_usage_counts();​
usage_count | buffers | dirty | pinned ​
-------------+---------+-------+--------​
0 | 52 | 8 | 0​
1 | 35 | 0 | 1​
2 | 30 | 6 | 0​
3 | 4 | 1 | 0​
4 | 5 | 0 | 0​
5 | 2 | 0 | 0​
(6 rows)​
​
应用场景:​
  • 使用计数为 0~1 的缓冲区较多,表明缓冲区淘汰较频繁,可能存在内存压力。​
  • 使用计数为 4~5 的缓冲区是真正的热数据,应优先保障其常驻内存。​
  • 脏页集中在高使用计数的缓冲区,说明热数据更新频繁。​
​
​
最近更新时间:2026.03.31 10:39:12
这个页面对您有帮助吗?
有用
有用
无用
无用