PostgreSQL之Buffer Cache

缓冲区高速缓存(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。

但行好事,莫问前程
原文地址:https://www.cnblogs.com/mingfan/p/14770616.html