Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

  • iotop= It shows i/o per process in real time but does not give total after process end.
  • iostat= It shows real time I/O but does not tell process

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.

like image 743
Wajih Avatar asked Jul 12 '14 15:07

Wajih


People also ask

How do I check disk IO utilization per process?

By using iotop command, you can monitor the disk utilization by individual processes. You will get the following output: By typing the iotop command with o option, you will get the actual I/O activity. With the help of iostat command, you will get the individual hard disk I/O activity.

How does Linux calculate disk IOPS?

Disk IOPS, or input/output operations per second, is a measure of the amount of work that your disk is doing. This metric can be helpful in determining the workload, health, and performance of your disk. IOPS= r/s + w/s for this disk device.

How do I check top IO consuming process?

To check which processes are actually utilizing the disk IO, run the iotop command with -o or –only option to visualize it. Details: IO: It shows Input/Output utilization of each process, which includes disk and swap. SWAPIN: It shows only the swap usage of each process.


1 Answers

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:

  • ./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
like image 168
Cyrus Avatar answered Oct 03 '22 02:10

Cyrus