读pg_buffercache输出

时间:2017-06-30 13:15:52

标签: postgresql

我正在使用postgres-9.3(在CenOS 6.9中)并试图理解pg_buffercache表输出。

我跑了这个:

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 5;

,下面的输出显示了一个使用6594缓冲区的表。这是在我有大量INSERT,然后在data_main表中使用SELECT和UPDATE的时候。

       relname      | buffers 
  ------------------+---------
  data_main         |    6594
  objt_main         |    1897
  objt_access       |     788
  idx_data_mai      |     736

我还运行了“select * from pg_buffercache where dirty”,显示了大约50个条目。

我该如何解释这些数字?缓冲区计数是否与我创建扩展或最近的扩展后的所有事务相对应。如何使用适当数量的缓冲区查明我的具体操作?

这是我的设置:

 # show shared_buffers;
    shared_buffers 
  ----------------
     1GB

 # show work_mem;
  work_mem
 ----------
   128kB
 # show maintenance_work_mem;
   maintenance_work_mem 
  ----------------------
   64GB

当前的免费mem(我在这台机器上有64GM内存)。我有一个混合工作负载机器,具有INSERTS周期性突发和大量SELECTS。目前,数据库和表格很小,但将增长到至少200万行。

  $ free -m
         total       used      free     shared    buffers     cached
 Mem:   64375      33483      30891        954         15      15731
 /+ buffers/cache: 18097      46278
Swap:   32767         38      32729

基本上,我试图了解如何正确使用此pg_buffercache表。我应该定期运行此查询吗?我是否需要相应地更改我的shared_buffers。

1 个答案:

答案 0 :(得分:0)

我做了一些阅读和测试,这就是我找到的。在此处找到了一个有用的查询:How large is a "buffer" in PostgreSQL

以下是其他有类似问题的注意事项。

  1. 您需要为每个数据库创建扩展名。所以" \ c db_name"然后"创建扩展pg_buffercache"。

  2. 运行查询相同。

  3. 重新启动数据库会清除查询。