Is there a way to keep the 2.6 kjournald from writing to idle disks?(to allow spin-downs)

From: Lutz Vieweg
Date: Sun Jan 25 2004 - 13:24:36 EST


Hi everyone,

I run a server that usually doesn't have to do anything on the local filesystems,
it just needs to answer some requests and perform some computations in RAM.

So I use the "hdparm -S 123" parameter setting to keep the (IDE) system disk from
spinning unneccessarily.

Alas, since an upgrade to kernel 2.6 and ext3 filesystem, I cannot find a way to
let the harddisk spin down - I found out that "kjournald" writes a few blocks every
few seconds.

As I wouldn't like to downgrade to ext2: Is there any way to keep the 2.6 kjournald
from writing to idle disks?

I cannot see a good reason why kjournald would write when there are no dirty buffers -
but still it does.


Regards,

Lutz Vieweg


BTW: I used the following script to find the source of the write operations,
just start it in one terminal, do a "sync" in another, then say "hdparm -y /dev/hda"
and you can see that immediately or a few seconds later kjournald will enter the
"D" state and wake up when the disk has spun up.

-------------------------------------------------------------------------------------
#!/usr/bin/tclsh

cd /proc


set stat_arr {
pid
comm
state
ppid
process_group,
session
tty_nr
tty_pgrp
flags
min_flt
cmin_flt
maj_flt
cmaj_flt
utime
stime
cutime
cstime
priority
nice
num_threads
it_real_value
start_time
vsize
rss
RLIMIT_RSS
start_code
end_code
start_stack
esp
eip
pending_signals
blocked_sigs
sigign
sigcatch
wchan
nswap
cnswap
exit_signal
task_cpu
rt_priorit
policy
}

proc scan_stat {_pids _dat} {
upvar $_dat dat
upvar $_pids pids
global stat_arr

set pids [lsort -integer [glob {[0-9]*}]]

foreach pid $pids {
set in [open "$pid/stat" "r"]
set l [gets $in]
close $in

set a [split $l " "]

foreach x $a n $stat_arr {
set dat($pid,$n) $x
}
}
}

#puts [array get dat]

array set dat {}
set pids {}

scan_stat pids dat

while {1} {
after 1000

array set new_dat {}
set new_pids {}

scan_stat new_pids new_dat

foreach pid $new_pids {
if {$pid != [pid]} {
if {![info exists dat($pid,pid)]} {
puts "new process $pid $new_dat($pid,comm)"
} else {
set somechange 0
foreach a $stat_arr {
if {$new_dat($pid,$a) != $dat($pid,$a)} {
puts "$pid $new_dat($pid,comm) attribute '$a' from $dat($pid,$a) to $new_dat($pid,$a)"
set somechange 1
}
}
if {$somechange} {
puts ""
}
}
}
}

array set dat {}
array set dat [array get new_dat]
set pids $new_pids
}
-------------------------------------------------------------------------------------


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/