linuxbashprocessiodisk

Calculate Total disk i/o by a single process


I am looking for some tool that will dump total disk I/O by a single process after it ends. So far my finding is :-

For example, I have some process running in background with PID ####. I need the Total Bytes Written and Read by that process in total after the process ends.Can anybody tell how I can extract this information given a process PID.


Solution

  • Feel free to play with this scribble (myio.sh):

    #!/bin/bash 
    
    TEMPFILE=$(tempfile)    # create temp file for results
    
    trap "rm $TEMPFILE; exit 1" SIGINT  # cleanup after Ctrl+C
    
    SECONDS=0               # reset timer
    
    $@ &                    # execute command in background
    
    IO=/proc/$!/io          # io data of command
    while [ -e $IO ]; do
        cat $IO > "$TEMPFILE"   # "copy" data
        sed 's/.*/& Bytes/' "$TEMPFILE" | column -t
        echo
        sleep 1
    done
    
    S=$SECONDS              # save timer
    
    echo -e "\nPerformace after $S seconds:"
    while IFS=" " read string value; do
        echo $string $(($value/1024/1024/$S)) MByte/s
    done < "$TEMPFILE" | column -t
    
    rm "$TEMPFILE"          # remove temp file
    

    Syntax: ./myio.sh <your command>

    Examples:

    Please change dd's of= in last example only if you know what you are doing.


    With this simple script from me you can watch an already running process and its IO.

    Syntax: pio.sh PID

    #!/bin/bash
    
    [ "$1" == "" ] && echo "Error: Missing PID" && exit 1
    IO=/proc/$1/io          # io data of PID
    [ ! -e "$IO" ] && echo "Error: PID does not exist" && exit 2
    I=3                     # interval in seconds
    SECONDS=0               # reset timer
    
    echo "Watching command $(cat /proc/$1/comm) with PID $1"
    
    IFS=" " read rchar wchar syscr syscw rbytes wbytes cwbytes < <(cut -d " " -f2 $IO | tr "\n" " ")
    
    while [ -e $IO ]; do
        IFS=" " read rchart wchart syscrt syscwt rbytest wbytest cwbytest < <(cut -d " " -f2 $IO | tr "\n" " ")
    
        S=$SECONDS
        [ $S -eq 0 ] && continue
    
    cat << EOF
    rchar:                 $((($rchart-$rchar)/1024/1024/$S)) MByte/s
    wchar:                 $((($wchart-$wchar)/1024/1024/$S)) MByte/s
    syscr:                 $((($syscrt-$syscr)/1024/1024/$S)) MByte/s
    syscw:                 $((($syscwt-$syscw)/1024/1024/$S)) MByte/s
    read_bytes:            $((($rbytest-$rbytes)/1024/1024/$S)) MByte/s
    write_bytes:           $((($wbytest-$wbytest)/1024/1024/$S)) MByte/s
    cancelled_write_bytes: $((($cwbytest-$cwbytes)/1024/1024/$S)) MByte/s
    EOF
        echo
        sleep $I
    done