对象文件系统pgfincore introduces

每日一贴,今天的内容关键字为对象文件系统

    pgfincore 和shared buffer不同,是OS层面的存缓,可以把大对象存缓到OS的cache里,其实就是存内,所以呆板的存内置配越大越好,至于oracle是存缓到buffer_pool_keep,可以手工刷出,不过这个是database的存缓,和pg的shared buffer同理。这里就不再细详绍介。

    1.下载wget http://pgfoundry.org/frs/download.php/3186/pgfincore-v1.1.1.tar.gz

    2.解压下载的装安包tar -zxvf pgfincore-v1.1.1.tar.gz

    3.复制解压后的目录到pg源代码目录/contrib

    4.装安:

    postgres用户:

    make clean
make

    su - root

    source /home/postgres/.bash_profile

    make install

    根据READ.rst

    For PostgreSQL >= 9.1, log in your database and::

  mydb=# CREATE EXTENSION pgfincore;

    For other release, create the functions from the sql script (it should be in
your contrib directory)::

  psql mydb -f pgfincore.sql

 

    postgres=# select version();
                                                    version                                                    
---------------------------------------------------------------------------------------------------------------
 PostgreSQL 9.1.2 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.1.2 20071124 (Red Hat 4.1.2-42), 64-bit

    postgres=# CREATE EXTENSION pgfincore;
CREATE EXTENSION

    postgres=# select * from pg_extension ;
    extname     | extowner | extnamespace | extrelocatable | extversion | extconfig | extcondition 
----------------+----------+--------------+----------------+------------+-----------+--------------
 plpgsql        |       10 |           11 | f              | 1.0        |           | 
 pg_buffercache |       10 |         2200 | t              | 1.0        |           | 
 pgfincore      |       10 |         2200 | t              | 1.1.1      |           |

    pgfincore用使:

    pgfincore 对象的cache情况

    pgfadvise_willneed 将对象刷入cache

    pgfadvise_dontneed 将对象刷出cache

    pgfadvise_loader 直接和page cache交互,加载,卸载页面

    pgsysconf 操作统系的cache情况

    pgsysconf_pretty同上,只不过输更易懂,带上了单位。

 

    postgres=# \d t
                         Table "public.t"
 Column |  Type   |                   Modifiers                   
--------+---------+-----------------------------------------------
 s      | integer | not null default nextval('t_s_seq'::regclass)
 i      | integer | 
 postgres=# insert into t(i) values (generate_series(1,10000000));
INSERT 0 10000000
postgres=#  select pg_size_pretty(pg_relation_size('t'));
 pg_size_pretty 
----------------
 346 MB

    以后文件统系的用使情况:pgsysconf(),pgsysconf_pretty()
 postgres=#  select * from pgsysconf();
 os_page_size | os_pages_free | os_total_pages 
--------------+---------------+----------------
         4096 |        182787 |        2044328

    postgres=# select * from pgsysconf_pretty();
 os_page_size | os_pages_free | os_total_pages 
--------------+---------------+----------------
 4096 bytes   | 721 MB        | 7986 MB
(1 row)

    表t的用使情况:pgfincore

    postgres=#  select * from pgfincore('t');
     relpath      | segment | os_page_size | rel_os_pages | pages_mem | group_mem | os_pages_free | databit 
------------------+---------+--------------+--------------+-----------+-----------+---------------+---------
 base/12699/16441 |       0 |         4096 |        88496 |     88496 |         1 |        181767 |

    os_page_size:文件统系页巨细

    rel_os_pages:占用文件统系页数量

    pages_mem:有多少文件统系页在统系cache

 

    刷入cache:pgfadvise_willneed()

    postgres=# select * from pgfadvise_willneed('t');
     relpath      | os_page_size | rel_os_pages | os_pages_free 
------------------+--------------+--------------+---------------
 base/12699/16441 |         4096 |        88496 |        186428
(1 row)

    每日一道理
信念是巍巍大厦的栋梁,没有它,就只是一堆散乱的砖瓦;信念是滔滔大江的河床,没有它,就只有一片泛滥的波浪;信念是熊熊烈火的引星,没有它,就只有一把冰冷的柴把;信念是远洋巨轮的主机,没有它,就只剩下瘫痪的巨架。

    postgres=#  select * from pgfincore('t');
     relpath      | segment | os_page_size | rel_os_pages | pages_mem | group_mem | os_pages_free | databit 
------------------+---------+--------------+--------------+-----------+-----------+---------------+---------
 base/12699/16441 |       0 |         4096 |        88496 |     88496 |         1 |        186397 | 
(1 row)

 

 刷出cache:    
postgres=# select * from pgfadvise_dontneed('t');
     relpath      | os_page_size | rel_os_pages | os_pages_free 
------------------+--------------+--------------+---------------
 base/12699/16441 |         4096 |        88496 |        275021
(1 row)

    postgres=# select * from pgfincore('t');
     relpath      | segment | os_page_size | rel_os_pages | pages_mem | group_mem | os_pages_free | databit 
------------------+---------+--------------+--------------+-----------+-----------+---------------+---------
 base/12699/16441 |       0 |         4096 |        88496 |         0 |         0 |        275052 | 
(1 row)

 

    pgfadvise_loader:

    postgres=# select * from pgfadvise_loader('t', 0, true, true, B'111000');
     relpath      | os_page_size | os_pages_free | pages_loaded | pages_unloaded 
------------------+--------------+---------------+--------------+----------------
 base/12699/16441 |         4096 |        186626 |            3 |              3
(1 row)

    loading:

    postgres=# select * from pgfadvise_loader('t', 0, true, false, B'111000');
     relpath      | os_page_size | os_pages_free | pages_loaded | pages_unloaded 
------------------+--------------+---------------+--------------+----------------
 base/12699/16441 |         4096 |        186460 |            3 |              0
(1 row)

    unloading:

    postgres=# select * from pgfadvise_loader('t', 0, false, true, B'111000');
     relpath      | os_page_size | os_pages_free | pages_loaded | pages_unloaded 
------------------+--------------+---------------+--------------+----------------
 base/12699/16441 |         4096 |        186557 |            0 |              3
(1 row)

    pgfadvise_NORMAL
pgfadvise_SEQUENTIAL
pgfadvise_RANDOM

    这几个可以指定以后存内的性属,常正,次序,还是随机。

    快照与复恢:

    做快照:

    create table pgfincore_snapshot as
select 't'::text as relname,*,now() as date_snapshot
from pgfincore('t',true);

    应用快照:

    select * from pgfadvise_loader('t', 0, true, true,
                          (select databit from  pgfincore_snapshot
                           where relname='t' and segment = 0));

     relpath      | os_page_size | os_pages_free | pages_loaded | pages_unloaded 
------------------+--------------+---------------+--------------+----------------
 base/12699/16441 |         4096 |        186259 |        88490 |              6
(1 row)

    postgres=#  select * from pgfincore('t');
     relpath      | segment | os_page_size | rel_os_pages | pages_mem | group_mem | os_pages_free | databit 
------------------+---------+--------------+--------------+-----------+-----------+---------------+---------
 base/12699/16441 |       0 |         4096 |        88496 |     88490 |         2 |        186097 | 
(1 row)

    可以看到 88496 和88490,有几个页面是刷出cache,所以不相等

    select * from pgfadvise_willneed('t');

    postgres=# select * from pgfincore('t');
     relpath      | segment | os_page_size | rel_os_pages | pages_mem | group_mem | os_pages_free | databit 
------------------+---------+--------------+--------------+-----------+-----------+---------------+---------
 base/12699/16441 |       0 |         4096 |        88496 |     88496 |         1 |        186227 | 
(1 row)

    
制约:
*PgFincore needs mincore() and POSIX_FADVISE.

    *PgFincore has a limited mode when POSIX_FADVISE is not provided by the platform.

    *PgFincore needs PostgreSQL >= 8.3

文章结束给大家分享下程序员的一些笑话语录: 面试官:熟悉哪种语言
应聘者:JAVA
面试官:知道什么叫类么
应聘者:我这人实在,工作努力,不知道什么叫累
面试官:知道什么是包?
应聘者:我这人实在 平常不带包 也不用公司准备了
面试官:知道什么是接口吗?
应聘者:我这个人工作认真。从来不找借口偷懒
面试官:知道什么是继承么
应聘者:我是孤儿没什么可以继承的
面试官:知道什么叫对象么?
应聘者:知道,不过我工作努力,上进心强,暂时还没有打算找对象。
面试官:知道多态么?
应聘者:知道,我很保守的。我认为让心爱的女人为了自已一时的快乐去堕胎是不道德的行为!请问这和C#有什么关系??

posted @ 2013-05-08 19:49  坚固66  阅读(275)  评论(0编辑  收藏  举报