通过一个进程计算总磁盘I / O

我正在寻找一个工具,它将在一个进程结束后,通过一个进程转储总的磁盘I / O。 到目前为止,我的发现是:

  • iotop =它实时显示每个进程的I / O,但不会在进程结束后给出总计。
  • iostat =它显示实时I / O,但不告诉过程

例如 ,我有一些使用PID ####在后台运行的进程。 在stream程结束后,我需要总共写入读取该进程的总字节数。任何人都可以告诉我如何在给定进程PID的情况下提取这些信息。

Solutions Collecting From Web of "通过一个进程计算总磁盘I / O"

随意玩这个涂鸦(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 

语法: ./myio.sh <your command>

例子:

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

只有当你知道你在做什么时,请在最后一个例子中改变dd的of=


用我这个简单的脚本,你可以看到一个已经运行的进程和它的IO。

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