• 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。

    但行好事,莫问前程
  • 相关阅读:
    Gerrit 系统初探 (已转移到 https://steemit.com/gerrit/@linvictor88/gerrit )
    Iaas概述
    题解西电OJ (Problem 1007 -做一名正气的西电人 )--长整型计算
    题解西电OJ (Problem 1005 -跳舞毯)--动态规划
    题解西电OJ (Problem 1004 -亚特兰提斯)--最小生成树
    题解西电OJ (Problem 1003 -最喜欢的数字)--动态规划
    题解西电OJ (Problem 1008
    题解西电OJ (Problem 1006
    HTML-css selector
    Android--应用开发3(Android layout XML属性)
  • 原文地址:https://www.cnblogs.com/mingfan/p/14770616.html
Copyright © 2020-2023  润新知