PgFincore

PostgreSQL 内存页管理函数
授权协议 BSD
开发语言 C/C++
所属分类 数据库相关、 数据库调整和优化
软件类型 开源软件
地区 不详
投 递 者 柴琨
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

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列报告从内存中删除了多少页(它们可能尚未存储在备忘录中);
  • 1.常用内存参数 1.1 shared_buffers shared_buffers是PostgreSQL用于共享缓冲区的内存,是由8kb大小的块所形成的数组。PostgreSQL在进行更新、查询等操作时,首先从磁盘把数据读取到内存,之后进行更新,最后将数据写回磁盘。shared_buffers可以暂时存放从磁盘读取的数据,能够让用户下次访问不需要去磁盘直接从里面读取出来,增加查询效率。share

  • 这不想过多讲解pgfincore的安装和使用,只想记录下使用心得,如果读者向读到更多内容,请查看一下内容: use posix_fadvise pre-cache frequency data http://blog.163.com/digoal@126/blog/static/163877040201062944945126/ a powerful upgrade from pgfincore

  • pgfincore 和shared buffer不同,是OS层面的缓存,可以把大对象缓存到OS的cache里,其实就是内存,所以机器的内存配置越大越好,至于oracle是缓存到buffer_pool_keep,可以手工刷出,不过这个是database的缓存,和pg的shared buffer同理。这里就不再详细介绍。 1.下载wgethttp://pgfoundry.org/frs/downloa

  • 每日一贴,今天的内容关键字为对象文件系统     pgfincore 和shared buffer不同,是OS层面的存缓,可以把大对象存缓到OS的cache里,其实就是存内,所以呆板的存内置配越大越好,至于oracle是存缓到buffer_pool_keep,可以手工刷出,不过这个是database的存缓,和pg的shared buffer同理。这里就不再细详绍介。     1.下载wget ht

  • http://blog.163.com/digoal@126/blog/static/163877040201062944945126/ http://blog.163.com/digoal@126/blog/static/16387704020122198214650/ http://blog.163.com/digoal@126/blog/static/16387704020116301021

  • 数据库启动的时候,数据是冷却的,在执行SQL时需要到磁盘搜索BLOCK并载入到BUFFER,这个时候的SQL响应速度比命中情况下的响应速度一般要慢10倍以上,这种一般被称为未命中的查询。 如果数据库启动的时候刚好遇到SQL执行高峰,可能应为SQL响应速度过慢导致应用被堵塞死。造成长时间的应用堵塞,恶性循环。 那么怎么更好的解决这种类似的情况,今天刚好看到了PostgreSQL上的一个很好的例子。

  •   1.安装时需要source /usr/local/pgsql/bin路径,依赖pg_config命令 转载于:https://www.cnblogs.com/pg-libs/p/7039233.html

 相关资料
  • 内存是计算机的主存储器。内存为进程开辟出进程空间,让进程在其中保存数据。我将从内存的物理特性出发,深入到内存管理的细节,特别是了解虚拟内存和内存分页的概念。 内存 简单地说,内存就是一个数据货架。内存有一个最小的存储单位,大多数都是一个字节。内存用内存地址(memory address)来为每个字节的数据顺序编号。因此,内存地址说明了数据在内存中的位置。内存地址从0开始,每次增加1。这种线性增加的

  • 以页为单位管理物理内存 在获得可用物理内存范围后,系统需要建立相应的数据结构来管理以物理页(按4KB对齐,且大小为4KB的物理内存单元)为最小单位的整个物理内存,以配合后续涉及的分页管理机制。每个物理页可以用一个 Page数据结构来表示。由于一个物理页需要占用一个Page结构的空间,Page结构在设计时须尽可能小,以减少对内存的占用。Page的定义在kern/mm/memlayout.h中。以页为

  • 对于一个基于图论的框架来说,节点和边是最小的部件。实际应用中,这些部件构成了各种有向图。比如一个有环图,它的数据流动就是一个环形,部件之间的持有关系如果不能很好的处理,那么可能就会存在内存问题。EasyReact 的内存管理逻辑非常简单,也非常精巧。可以让框架使用者无需关注太多的细节即可轻松的使用,而不必担心本框架涉及的内存方面的问题。 中间节点 节点包含了 fork、map、filter、ski

  • 在计算系统中,通常存储空间可以分为两种:内部存储空间和外部存储空间。内部存储空间通常访问速度比较快,能够按照变量地址随机地访问,也就是我们通常所说的 RAM(随机存储器),可以把它理解为电脑的内存;而外部存储空间内所保存的内容相对来说比较固定,即使掉电后数据也不会丢失,这就是通常所讲的 ROM(只读存储器),可以把它理解为电脑的硬盘。 计算机系统中,变量、中间数据一般存放在 RAM 中,只有在实际

  • 内存生命周期 垃圾回收 垃圾回收在计算机科学中是一种自动的内存管理机制。当一个计算机上的动态内存不再需要时,就应该予以释放以让出内存,这种内存资源管理称为垃圾回收。垃圾回收器可以让程序员减轻许多负担,也减少程序员犯错的机会。 特征 垃圾回收基于两个原理: 考虑某个对象在未来的程序运行中将不会被访问; 向这些对象要求归还内存。 然而,最主要的也是最艰难的部分就是找到「所分配的内存确实已经不再需要了」

  • 主要内容:一、redis的内存管理,二、源码分析,三、总结一、redis的内存管理 一般来说,稍微有点规模的软件,都会自己搞一块内存管理,原因很简单,统一管理内存,适应自己的场景。其实按大牛们的话,这未必是最优选择,实在是小看了写库的那群大牛们。不过说归说,人家写也不会给你报备,想写自然就写了。Redis就听从了大牛的看法,使用了底层更好的内存分配库,根据情况使用tmalloc,jemalloc 以及glibc中的 malloc(pmalloc)。 一般

  • 本章描述 Linux 内核中的内存管理。在本章中你会看到一系列描述 Linux 内核内存管理框架的不同部分的帖子。 内存块 - 描述早期的 memblock 分配器。 固定映射地址和 ioremap - 描述固定映射的地址和早期的 ioremap 。 kmemcheck - 第三部分描述 kmemcheck 工具。

  • 物理内存管理 接下来将首先对实验的执行流程做个介绍,并进一步介绍如何探测物理内存的大小与布局,如何以页为单位来管理计算机系统中的物理内存,如何设计物理内存页的分配算法,最后比较详细地分析了在80386的段页式硬件机制下,ucore操作系统把段式内存管理的功能弱化,并实现以分页为主的页式内存管理的过程。