What program in Linux can measure I/O over time?

I'm trying to measure the total amount of disk writing and reading that is done to a particular volume by a particular process over a specified duration.

I've found iotop, which can output IO every second for a particular process like this:

iotop --batch --pid $(pidof my_process)

Where you can specify x iterations with -n x.

But then I have to filter out the actual number, and tally it up myself.

Is there an easier way to do this?


Solution 1:

Don't know of an easier way off hand, but this bash snippet might help you with parsing out what you need from iotop:

iotop --batch --pid 1 > log
line_num=0
while read line; do 
    line_num=$(($line_n+1)) 
    if [[ $(($line_num % 3)) -eq 0 ]]; then 
        #print Column 3
        echo $line | awk '{print $3}'
    fi 
done < log > processed_file
#Get total of column three:
cat processed_file | (tr '\n' +; echo 0) | bc

Actually, Might be easier to read /proc/$PID/io every x seconds:

val=0
total=0
counter=0
pid=2323
while [[ $counter < 100 ]]; do 
    counter=$(($counter +1 ))
    #Change the sed number for different line, 5 is read_bytes
    val=$(cat /proc/$pid/io | sed -n '5p' | awk '{ print $2 }')
    total=$(($total + $val))
    echo $total 
    sleep 1 
done

Actually, looks like the above script is wrong, because it seems like /proc/<pid>/io is just the total, so really, just grab it once, wait however long, grab it again, find the differnce and there is your answer. You might want to look at the source code and find out its data type to see if it eventually wraps around. Probably not a problem for a little tablet though.

Solution 2:

It might be over kill, and you might need to customize a plugin, but you could try "Munin", which is a graphing application that does just what you need.

It does not have a plugin for per process IO, but I'm sure hacking one up is not too hard. You'll then get all the added value of munin/rrdtool with avereges over day/week/year, graphing, limits, warnings, etc.