作者:瀚高PG实验室 (Highgo PG Lab)
pg_buffercache模块提供了一种实时检测共享缓冲区的方法。
这个模块提供了一个C函数:pg_buffercache_pages,它返回一个记录的集合和一个视图:pg_buffercache,它包装了这个函数来更方便的使用。
默认情况下,公共访问会从这两者中撤回,来预防潜在的安全问题。
pg_buffercache这个视图中各列定义的详细解释如下:
名称 | 描述 |
bufferid | ID,范围是1到shared_buffers |
relfilenode | 关系的文件节点号 |
reltablespace | 关系的表空间OID |
reldatabase | 关系的数据库OID |
relforknumber | 关系内的分叉树 |
relblocknumber | 关系内的页面数 |
isdirty | 页面是否为脏 |
usagecount | clock-sweep访问计数 |
pinning_backends | 对这个缓冲区加pin的后端数量 |
共享缓存中的每个缓冲区都有一行。未使用的缓冲区除了bufferid以外的所有列为null。共享系统目录被显示为属于数据库零。
因为缓存被所有的数据库共享,通常会有关系中的一些页面不属于当前的数据库。这意味着对许多行来说,在pg_class中可能不会有匹配的连接行,或者甚至可能会有错误连接。如果你试图连接pg_class,一个好的办法就是将连接限制为reldatabase等于当前数据库的OID或者为零的行。
当访问pg_buffercache视图时,内部缓冲区管理器会锁住足够长的时间来拷贝所有这个视图会展示的缓冲区状态数据。这确保了这个视图产生一个一致的结果集,同时不会不必要的长时间阻碍正常的缓冲区活动。虽然如此,但是如果这个视图被频繁读取的话,会对数据库性能产生一些影响。
By Kalath