PgFincorePostgreSQL 內(nèi)存頁管理函數(shù)
PgFincore 包含一組用于管理 PostgreSQL 內(nèi)存中頁面的函數(shù)。
使用PostgreSQL,每個(gè)表或索引通常都分成1GB的段,并且每個(gè)段都分為內(nèi)存中的頁面和文件系統(tǒng)的塊。
這些功能使您可以知道某個(gè)關(guān)系中的哪個(gè)磁盤塊以及多少磁盤塊在操作系統(tǒng)的頁面緩存中。它可以將結(jié)果提供為VarBit,并可以存儲(chǔ)在表中。然后,使用此表,由于流復(fù)制,甚至在其他服務(wù)器中,也可以為該關(guān)系的每個(gè)塊恢復(fù)頁面緩存狀態(tài)。
其他功能用于在整個(gè)關(guān)系(每個(gè)段)上設(shè)置POSIX_FADVISE標(biāo)志。比較有用的可能是WILLNEED和DONTNEED,它們分別從頁面緩存中推入和彈出關(guān)系的每個(gè)段。
至少使用表名或索引名(或oid)作為參數(shù)調(diào)用每個(gè)函數(shù),并遍歷關(guān)系的每個(gè)段。
安裝
從源代碼:
make clean
make
su
make install
對(duì)于PostgreSQL> = 9.1,登錄數(shù)據(jù)庫并:
mydb=# CREATE EXTENSION pgfincore;
對(duì)于其他發(fā)行版,請(qǐng)從sql腳本創(chuàng)建函數(shù)(它應(yīng)該在contrib目錄中):
psql mydb -f pgfincore.sql
PgFincore還隨附Debian腳本來構(gòu)建您自己的軟件包:
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打包。
以下是一些用法示例。如果您想了解更多詳細(xì)信息,請(qǐng)?jiān)L問Documentation_
獲取關(guān)系的當(dāng)前狀態(tài)
可能有用:
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頁面緩沖區(qū)中加載表或索引
您可能希望嘗試在OS頁面緩存中保留一個(gè)表或索引,或者在執(zhí)行眾所周知的大查詢之前減少表的裝載時(shí)間(減少查詢時(shí)間)。
為此,只需執(zhí)行以下查詢:
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報(bào)告頁面大小為4KB。
- rel_os_pages列是指定文件的頁數(shù)。
- 列os_pages_free是內(nèi)存(用于緩存)中的可用頁數(shù)。
快照和還原表或索引(或更多)的OS頁緩沖區(qū)狀態(tài)
您可能希望像執(zhí)行快照一樣將表或索引還原到OS頁面緩存中。例如,如果您必須重新引導(dǎo)服務(wù)器,則PostgreSQL啟動(dòng)時(shí),第一個(gè)查詢可能會(huì)變慢,因?yàn)镻ostgreSQL或OS都沒有在各自的緩存中包含有關(guān)這些第一個(gè)查詢所涉及的關(guān)系的頁面。
執(zhí)行快照和還原非常簡(jiǎn)單:
-- 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列報(bào)告已將多少頁讀取到內(nèi)存中(它們可能已經(jīng)存儲(chǔ)在備忘錄中)
- pages_unloaded列報(bào)告從內(nèi)存中刪除了多少頁(它們可能尚未存儲(chǔ)在備忘錄中);
