If you need to check what is PostgreSQL really doing – reads, writes, etc. you can try bgwriter statistic in pg_stat_bgwriter
Only problem is that PG 8.4 does not store history therefore you need to save some time snapshots.

First – create table for time snapshots:

create table public.systemcheck_stat_bgwriter as
select clock_timestamp() as log_datum, * from pg_stat_bgwriter;

Second – insert time snapshots – manually any time you want or using some program with timer:

insert into public.systemcheck_stat_bgwriter
select clock_timestamp() as log_datum, * from pg_stat_bgwriter;

When you gather some time snapshots you can analyze data with this select:

with sourcedata as (
	select
		s.log_datum,
		extract(epoch from (s.log_datum - lag(s.log_datum,1) over (order by s.log_datum))) as time_diff_seconds,
		s.checkpoints_timed - lag(s.checkpoints_timed, 1) over (order by s.log_datum) as checkpoints_timed_diff,
		s.checkpoints_req - lag(s.checkpoints_req, 1) over (order by s.log_datum) as checkpoints_req_diff,
		s.buffers_checkpoint - lag(s.buffers_checkpoint, 1) over (order by s.log_datum) as buffers_checkpoint_diff,
		s.buffers_clean - lag(s.buffers_clean, 1) over (order by s.buffers_clean) as buffers_clean_diff,
		s.maxwritten_clean - lag(s.maxwritten_clean, 1) over (order by s.maxwritten_clean) as maxwritten_clean_diff,
		s.buffers_backend - lag(s.buffers_backend, 1) over (order by s.buffers_backend) as buffers_backend_diff,
		s.buffers_alloc - lag(s.buffers_alloc, 1) over (order by s.buffers_alloc) as buffers_alloc_diff,
		s.checkpoints_timed,
		s.checkpoints_req,
		s.buffers_checkpoint,
		s.buffers_clean,
		s.maxwritten_clean,
		s.buffers_backend,
		s.buffers_alloc
	from public.systemcheck_stat_bgwriter s)
select
	src.log_datum
	,
	src.time_diff_seconds
	,
	(src.buffers_checkpoint_diff + src.buffers_clean_diff + src.buffers_backend_diff)*8*1024
	as total_writes_bytes
	,
	round(cast((src.buffers_checkpoint_diff + src.buffers_clean_diff + src.buffers_backend_diff)as numeric)*8*1024/(1024*1024),6)
	as total_writes_MB
	,
	case when coalesce(src.time_diff_seconds,0) > 0 then
		round(cast((src.buffers_alloc_diff/src.time_diff_seconds*8*1024) as numeric),2)
	else null end
	as buffers_alloc_per_second_byte
	,
	case when coalesce(src.time_diff_seconds,0) > 0 then
		round(cast((src.buffers_alloc_diff/src.time_diff_seconds*8*1024/(1024*1024)) as numeric),6)
	else null end
	as buffers_alloc_per_second_MB
	,
	case when coalesce(src.time_diff_seconds,0) > 0 then
		round(cast(((src.buffers_checkpoint_diff + src.buffers_clean_diff + src.buffers_backend_diff)*8*1024/src.time_diff_seconds ) as numeric),2)
	else null end
	as total_writes_per_second_byte
	,
	case when coalesce((checkpoints_timed_diff + checkpoints_req_diff),0) > 0 then
		(src.buffers_checkpoint_diff/(checkpoints_timed_diff + checkpoints_req_diff))*8*1024
	else null end
	as avg_checkpoint_write_byte
	,
	case when coalesce((checkpoints_timed_diff + checkpoints_req_diff),0) > 0 then
		(100*checkpoints_timed_diff/(checkpoints_timed_diff + checkpoints_req_diff))
	else null end
	as checkpoint_timed_proc
	,
	case when coalesce((src.buffers_checkpoint_diff + src.buffers_clean_diff + src.buffers_backend_diff),0)>0 then
		src.buffers_checkpoint_diff/(src.buffers_checkpoint_diff + src.buffers_clean_diff + src.buffers_backend_diff)*100
	else null end
	as buffers_checkpoint_proc
	,
	case when (src.buffers_checkpoint_diff + src.buffers_clean_diff + src.buffers_backend_diff)>0 then
		src.buffers_clean_diff/(src.buffers_checkpoint_diff + src.buffers_clean_diff + src.buffers_backend_diff)*100
	else null end
	as buffers_clean_proc
	,
	case when (src.buffers_checkpoint_diff + src.buffers_clean_diff + src.buffers_backend_diff)>0 then
		src.buffers_backend_diff/(src.buffers_checkpoint_diff + src.buffers_clean_diff + src.buffers_backend_diff)*100
	else null end
	as buffers_backend_proc
	,
	case when coalesce(src.time_diff_seconds,0) > 0 then
		round(cast((src.maxwritten_clean_diff/src.time_diff_seconds*8*1024) as numeric),2)
	else null end
	as maxwritten_clean_per_second_byte
	,
	case when coalesce((checkpoints_timed_diff + checkpoints_req_diff),0) > 0 then
		(src.time_diff_seconds/(checkpoints_timed_diff + checkpoints_req_diff))
	else null end
	as seconds_per_checkpoint
	,
	src.checkpoints_timed_diff,
	src.checkpoints_req_diff,
	src.buffers_checkpoint_diff,
	src.buffers_clean_diff,
	src.maxwritten_clean_diff,
	src.buffers_backend_diff,
	src.buffers_alloc_diff,
	src.checkpoints_timed,
	src.checkpoints_req,
	src.buffers_checkpoint,
	src.buffers_clean,
	src.maxwritten_clean,
	src.buffers_backend,
	src.buffers_alloc
from sourcedata	src
order by log_datum;

TODO: I will add explanation for results…