Calculate Total disk i/o by a single process

后端 未结 1 1230
鱼传尺愫
鱼传尺愫 2021-02-09 18:01

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 :-

  • iotop= It shows i/o per proces
1条回答
  •  孤独总比滥情好
    2021-02-09 18:21

    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

    Examples:

    • ./myio.sh dd if=/dev/zero of=/dev/null bs=1G count=4096
    • as root: ./myio.sh dd if=/dev/sda1 of=/dev/null bs=1M count=4096

    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
    

    0 讨论(0)
提交回复
热议问题