pg_buffercache
模块提供了一种方法实时检查共享缓冲区。
该模块提供了一个 C 函数pg_buffercache_pages
,它返回一个记录的集合,外加一个包装了该函数以便于使用的视图pg_buffercache
。
这个模块默认被限制为超级用户以及pg_read_all_stats
角色的成员才能访问。可以使用GRANT
把访问权限授予给其他用户。
pg_buffercache
视图视图显示的列的定义如Table F.15所示。
Table F.15. pg_buffercache
列
名称 | 类型 | 引用 | 描述 |
---|---|---|---|
bufferid | integer | ID,在范围 1..shared_buffers 中 | |
relfilenode | oid | pg_class.relfilenode | 关系的文件结点编号 |
reltablespace | oid | pg_tablespace.oid | 关系的表空间 OID |
reldatabase | oid | pg_database.oid | 关系的数据库 OID |
relforknumber | smallint | 关系内的分叉数,见include/common/relpath.h | |
relblocknumber | bigint | 关系内的页面数 | |
isdirty | boolean | 页面是否为脏? | |
usagecount | smallint | Clock-sweep 访问计数 | |
pinning_backends | integer | 对这个缓冲区加 pin 的后端数量 |
共享缓存中的每一个缓冲区都有一行。没有使用的缓冲区的行中只有bufferid
为非空。共享的系统目录被显示为属于数据库零。
因为缓冲是所有数据库共享的,通常会有不属于当前数据库的关系的页面。这意味着对于一些行在pg_class
中可能不会有匹配的连接行,或者甚至有错误的连接。如果你试图与pg_class
连接,将连接限制于reldatabase
等于当前数据库 OID 或零的行是一个好主意。
当访问pg_buffercache
视图时,内部缓冲区管理器会被锁住足够长时间来拷贝视图将显示的所有缓冲区状态数据。这确保了该视图会产生一个一致的结果集合,而不会不必要地长时间阻塞普通的缓冲区活动。尽管如此,如果经常读取这个视图还是会对数据库性能产生一些影响。
regression=# SELECT c.relname, count(*) AS buffers FROM pg_buffercache b INNER 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())) GROUP BY c.relname ORDER BY 2 DESC LIMIT 10; relname | buffers ---------------------------------+--------- tenk2 | 345 tenk1 | 141 pg_proc | 46 pg_class | 45 pg_attribute | 43 pg_class_relname_nsp_index | 30 pg_proc_proname_args_nsp_index | 28 pg_attribute_relid_attnam_index | 26 pg_depend | 22 pg_depend_reference_index | 20 (10 rows)
Mark Kirkwood <markir@paradise.net.nz>
设计建议: Neil Conway <neilc@samurai.com>
调试建议: Tom Lane <tgl@sss.pgh.pa.us>