首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单进程计算总磁盘i/o

单进程计算总磁盘i/o
EN

Stack Overflow用户
提问于 2014-07-12 15:35:15
回答 1查看 3.2K关注 0票数 7

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

  • iotop=它实时显示每个进程的i/o,但没有给出进程结束后的总数。
  • iostat=它显示实时I/O,但不告诉进程

例如,我使用PID ####在后台运行了一些进程。我需要Total 编写的通过该进程读取,在进程ends.Can之后,有人告诉我如何提取给定进程PID的信息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-12 18:54:15

您可以随意地玩这个涂鸦(myio.sh):

代码语言:javascript
复制
#!/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

代码语言:javascript
复制
#!/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
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24714485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档