pg_buffercache模块是用于查看shared buffer cache信息,决定shared buffer cache大还是小。
Installing pg_buffercache into a database:
$ createdb pgbench
$ psql -d pgbench -f /usr/share/postgresql/contrib/pg_buffercache.sql
两步即可完成
pg_buffercache.sql内容:
/* contrib/pg_buffercache/pg_buffercache--1.0.sql */
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "CREATE EXTENSION pg_buffercache" to load this file. \quit
-- Register the function.
CREATE FUNCTION pg_buffercache_pages()
RETURNS SETOF RECORD
AS 'MODULE_PATHNAME', 'pg_buffercache_pages'
LANGUAGE C;
-- Create a view for convenient access.
CREATE VIEW pg_buffercache AS
SELECT P.* FROM pg_buffercache_pages() AS P
(bufferid integer, relfilenode oid, reltablespace oid, reldatabase oid,
relforknumber int2, relblocknumber int8, isdirty bool, usagecount int2);
-- Don't want these to be available to public.
REVOKE ALL ON FUNCTION pg_buffercache_pages() FROM PUBLIC;
REVOKE ALL ON pg_buffercache FROM PUBLIC;
创建函数和视图,回收PUBLIC 权限。
NameTypeReferencesDescriptionbufferidintegerID, in the range 1..shared_buffersrelfilenodeoidpg_class.relfilenodeFilenode number of the relationreltablespaceoidpg_tablespace.oidTablespace OID of the relationreldatabaseoidpg_database.oidDatabase OID of the relationrelblocknumberbigintPage number within the relationrelforknumbersmallintFork number within the relationisdirtybooleanIs the page dirty?usagecountsmallintPage LRU count
pg_buffercache使用:
查看shared buffers大小:
postgres=# SELECT name,setting,unit,current_setting(name) FROM pg_settings WHERE name='shared_buffers';
name | setting | unit | current_setting
----------------+---------+------+-----------------
shared_buffers | 4096 | 8kB | 32MB
(1 row)
postgres=# select count(*) from pg_buffercache;
count
-------
4096
(1 row)
可见block数量一致,大小一致。
查看当前数据库buffer的使用情况排名:
SELECT
c.relname,
count(*) AS buffers
FROM pg_class c
INNER JOIN pg_buffercache b
ON b.relfilenode=c.relfilenode
INNER JOIN pg_database d
ON (b.reldatabase=d.oid AND d.datname=current_database())
GROUP BY c.relname
ORDER BY 2 DESC
LIMIT 10;
relname | buffers
---------------------------+---------
pg_statistic | 15
pg_operator | 13
pg_depend_reference_index | 13
pg_depend | 13
pg_rewrite | 8
pg_depend_depender_index | 6
pg_toast_2619 | 6
pg_index | 6
pg_extension | 5
pg_namespace | 5
(10 rows)
使用pg_buffercache比较灵活,可以通过isdirty字段查询脏块,如果是未使用的buffer,那么除了bufferid,其他字段都为空值。
select count(*) from pg_buffercache where isdirty is true;
select count(*)*8/1024||'MB' from pg_buffercache where relfilenode is null and reltablespace is null and reldatabase is null and relforknumber is null and relblocknumber is null and isdirty is null and usagecount is null;
查看buffercache对象的使用大小以及百分比
SELECT
c.relname,
pg_size_pretty(count(*) * 8192) as buffered,
round(100.0 * count(*) /
(SELECT setting FROM pg_settings
WHERE name='shared_buffers')::integer,1)
AS buffers_percent,
round(100.0 * count(*) * 8192 /
pg_relation_size(c.oid),1)
AS percent_of_relation
FROM pg_class c
INNER JOIN pg_buffercache b
ON b.relfilenode = c.relfilenode
INNER JOIN pg_database d
ON (b.reldatabase = d.oid AND d.datname = current_database())
GROUP BY c.oid,c.relname
ORDER BY 3 DESC
LIMIT 10;