PostgreSQL 内存页管理函数 PgFincore

BSD
C/C++
跨平台
2019-12-03
红薯
PgFincore 正在参加 2019 年度最受欢迎开源中国软件评选,请投票支持!
PgFincore 在 2019 年度最受欢迎开源中国软件评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票赢奖品
已投票

PgFincore 包含一组用于管理 PostgreSQL 内存中页面的函数。

使用PostgreSQL,每个表或索引通常都分成1GB的段,并且每个段都分为内存中的页面和文件系统的块。

这些功能使您可以知道某个关系中的哪个磁盘块以及多少磁盘块在操作系统的页面缓存中。它可以将结果提供为VarBit,并可以存储在表中。然后,使用此表,由于流复制,甚至在其他服务器中,也可以为该关系的每个块恢复页面缓存状态。

其他功能用于在整个关系(每个段)上设置POSIX_FADVISE标志。比较有用的可能是WILLNEEDDONTNEED,它们分别从页面缓存中推入和弹出关系的每个段。

至少使用表名或索引名(或oid)作为参数调用每个函数,并遍历关系的每个段。

安装

从源代码:

make clean
make
su
make install

对于PostgreSQL> = 9.1,登录数据库并:

mydb=# CREATE EXTENSION pgfincore;

对于其他发行版,请从sql脚本创建函数(它应该在contrib目录中):

psql mydb -f pgfincore.sql

PgFincore还随附Debian脚本来构建您自己的软件包:

aptitude install debhelper postgresql-server-dev-all postgresql-server-dev-9.1
# or postgresql-server-dev-8.4|postgresql-server-dev-9.0
make deb
dpkg -i ../postgresql-9.1-pgfincore_1.1.1-1_amd64.deb

PgFincore 在http://yum.postgresql.org/上用于RPM打包 。PgFincore 在http://pgapt.debian.net/上用于debian打包。

 

以下是一些用法示例。如果您想了解更多详细信息,请访问Documentation_

获取关系的当前状态

可能有用:

cedric=# select * from pgfincore('pgbench_accounts');
      relpath       | segment | os_page_size | rel_os_pages | pages_mem | group_mem | os_pages_free | databit | pages_dirty | group_dirty 
--------------------+---------+--------------+--------------+-----------+-----------+---------------+---------+-------------+-------------
 base/11874/16447   |       0 |         4096 |       262144 |    262144 |         1 |         81016 |         |           0 |           0
 base/11874/16447.1 |       1 |         4096 |        65726 |     65726 |         1 |         81016 |         |           0 |           0
(2 rows)

Time: 31.563 ms

在OS页面缓冲区中加载表或索引

您可能希望尝试在OS页面缓存中保留一个表或索引,或者在执行众所周知的大查询之前减少表的装载时间(减少查询时间)。

为此,只需执行以下查询:

cedric=# select * from pgfadvise_willneed('pgbench_accounts');
      relpath       | os_page_size | rel_os_pages | os_pages_free 
--------------------+--------------+--------------+---------------
 base/11874/16447   |         4096 |       262144 |        169138
 base/11874/16447.1 |         4096 |        65726 |        103352
(2 rows)
 
Time: 4462,936 ms
  • os_page_size报告页面大小为4KB。
  • rel_os_pages列是指定文件的页数。
  • os_pages_free是内存(用于缓存)中的可用页数。

快照和还原表或索引(或更多)的OS页缓冲区状态

您可能希望像执行快照一样将表或索引还原到OS页面缓存中。例如,如果您必须重新引导服务器,则PostgreSQL启动时,第一个查询可能会变慢,因为PostgreSQL或OS都没有在各自的缓存中包含有关这些第一个查询所涉及的关系的页面。

执行快照和还原非常简单:

-- Snapshot
cedric=# create table pgfincore_snapshot as
cedric-#   select 'pgbench_accounts'::text as relname,*,now() as date_snapshot
cedric-#   from pgfincore('pgbench_accounts',true);

-- Restore
cedric=# select * from pgfadvise_loader('pgbench_accounts', 0, true, true,
                       (select databit from  pgfincore_snapshot
                        where relname='pgbench_accounts' and segment = 0));
     relpath      | os_page_size | os_pages_free | pages_loaded | pages_unloaded 
------------------+--------------+---------------+--------------+----------------
 base/11874/16447 |         4096 |         80867 |       262144 |              0
(1 row)

Time: 35.349 ms
  • pages_loaded列报告已将多少页读取到内存中(它们可能已经存储在备忘录中)
  • pages_unloaded列报告从内存中删除了多少页(它们可能尚未存储在备忘录中);
的码云指数为
超过 的项目
加载中

评论(0)

暂无评论

暂无资讯

暂无问答

pgfincore

PostgreSQL缓存工具

2014/09/15 15:30
136
0
利用系统缓存提高PostgreSQL操作效率

近期,试用pgfincore,对此做一个实验记录。pgfincore是将数据库对象提前加载到OS cache中,加快操作效率。当有一顶的物理更改时,pgfincore也会将其加载到缓存中。主要是提高查询效率的,当...

2015/12/17 00:38
5.6K
7
pg_prewarm 与 pgfincore的区别

pg_prewarm 与 pgfincore都有预加载 PostgreSQL数据文件的能力,本篇从代码看看他们的差异。

2016/05/19 07:07
329
2
PostgreSQL缓存

缓存.... !!, 它很难在一篇文章中解释清楚。但是我会努力分享我从Heikki, Robert Haas, Bruce Momjian那里学到的知识。在PostgreSQL里有两层:PG共享缓冲和操作系统页面缓存,任何读写都会通过...

2013/07/23 18:17
3.1K
1

没有更多内容

加载失败,请刷新页面

没有更多内容

返回顶部
顶部