缓冲区高速缓存(Buffer Cache)位于服务器的共享内存中,并且所有进程均可访问。在读取或更新数据时,进程将页面读入缓存。当页面位于缓存中时,我们在RAM中使用它并保存数据到磁盘。
当一个进程需要读取一个页面时,它首先尝试通过哈希表在Buffer Cache中找到它,如果在Buffer Cache中找不到所需的页面。在这种情况下,需要将页面从磁盘读取到某个缓冲区中。
PostgreSQL有一个扩展,使我们能够查看缓冲区高速缓存的内部。
-
安装扩展
1)开启postgresql 服务
2)进入:contrib/pg_buffercache 目录
3)运行 :gmake 然后,运行 gmake install
4)再运行 psql , 在psql 状态下,运行:create extension pg_buffercache
-
创建一个表并插入一行数据
create table t_cache(id int) WITH (autovacuum_enabled = off); insert into t_cache values (1);
-
查询在缓冲区都包含什么
SELECT bufferid, CASE relforknumber WHEN 0 THEN 'main' WHEN 1 THEN 'fsm' WHEN 2 THEN 'vm' END relfork, relblocknumber, isdirty, usagecount, pinning_backends FROM pg_buffercache WHERE relfilenode = pg_relation_filenode('t_cache'::regclass);
可以看到,缓冲区包含一页。它是脏的(isdirty),使用计数(usagecount)等于1,并且该页面没有被任何进程(pinning_backends)固定。
-
新建一个session,再次插入一行数据,查询此时缓冲区内容
insert into t_cache values (2);
可以看到使用计数增加了
-
执行查询,查看缓冲区内容变化
postgres=>select * from t_cache ; id ---- 1 2 (2 rows)
可知,阅读页面后,计数也会增加。
-
执行vacuum,查看缓冲区变化
vacuum t_cache ;
VACUUM创建了空闲空间映射(fsm)(一页)和可见性映射(vm)(三页)。
-
如何调整缓冲区大小
可以使用shared_buffers参数设置缓存大小。默认值为128 MB
SELECT setting, unit FROM pg_settings WHERE name = 'shared_buffers';
设置为多少合适,目前pg的推荐是约1/4的RAM。