You can clone my branches :
git clone http://git.postgresql.org/git/users/c2main/postgres.git
Current fun is provided by adding a column for indexes and tables in pg_statio* views. Those column output the real read on disk: it let calculate the real hit/miss ratio of your full cache (postgresql shared buffers and OS buffer cache)
git checkout -b track_disk origin/track_disk
Example :
cedric=# show track_disk ;
track_disk
------------
on
cedric=# SELECT relname,
heap_blks_hit,heap_blks_read,heap_blks_real_read/2 as heap_blks_real_read,
idx_blks_hit,idx_blks_read,idx_blks_real_read/2 as idx_blks_real_read
from pg_statio_user_tables where relname = 'pgbench_accounts';
-[ RECORD 1 ]-------+-----------------
relname | pgbench_accounts
heap_blks_hit | 0
heap_blks_read | 0
heap_blks_real_read | 0
idx_blks_hit | 0
idx_blks_read | 0
idx_blks_real_read | 0
./pgbench -S -t 100 -c2
tps = 43.698998 (including connections establishing)
tps = 43.785598 (excluding connections establishing)
relname | pgbench_accounts
heap_blks_hit | 0
heap_blks_read | 200
heap_blks_real_read/2| 200
idx_blks_hit | 342
idx_blks_read | 262
idx_blks_real_read/2 | 181
--
-- After some runs
--
tps = 99.057743 (including connections establishing)
tps = 99.105170 (excluding connections establishing)
relname | pgbench_accounts
heap_blks_hit | 217
heap_blks_read | 19610
heap_blks_real_read/2| 17663
idx_blks_hit | 41026
idx_blks_read | 18570
idx_blks_real_read/2 | 4631
--
-- After some more runs
--
tps = 143.658449 (including connections establishing)
tps = 144.511803 (excluding connections establishing)
relname | pgbench_accounts
heap_blks_hit | 442
heap_blks_read | 39838
heap_blks_real_read | 31023
idx_blks_hit | 83635
idx_blks_read | 37372
idx_blks_real_read | 7112
cedric=# select * from pgmincore('pgbench_accounts');
relpath | block_size | block_disk | block_mem | group_mem
--------------------+------------+------------+-----------+-----------
base/16384/24598 | 4096 | 262144 | 126140 | 15422
base/16384/24598.1 | 4096 | 55318 | 26180 | 3228
(2 rows)
cedric=# select * from pgmincore('pgbench_accounts_pkey');
relpath | block_size | block_disk | block_mem | group_mem
------------------+------------+------------+-----------+-----------
base/16384/24603 | 4096 | 43892 | 43825 | 29
--
-- snapshot pgbench_accounts and pgbench_accounts_pkey
-- restart postgresql
-- flush OS cache for pgbench_accounts and pgbench_accounts_pkey
--
cedric=# select * from pgmincore_snapshot('pgbench_accounts');
cedric=# select * from pgmincore_snapshot('pgbench_accounts_pkey');
cedric=# select * from pgfadv_dontneed('pgbench_accounts');
cedric=# select * from pgfadv_dontneed('pgbench_accounts_pkey');
cedric=# select pg_stat_reset();
-- run a pgbench
./pgbench -S -t 100 -c2
tps = 38.497385 (including connections establishing)
tps = 38.569719 (excluding connections establishing)
-- restore buffer cache
select * from pgfadv_willneed_snapshot('pgbench_accounts');
select * from pgfadv_willneed_snapshot('pgbench_accounts_pkey');
-- run a pgbench
./pgbench -S -t 100 -c2
tps = 169.629961 (including connections establishing)
tps = 170.889926 (excluding connections establishing)