2014-07-12 15 views
5

Poszukuję jakiegoś narzędzia, które zrzuci całe operacje na dysku przez pojedynczy proces po jego zakończeniu. Dotychczas moja Odkrycie to jest: -Obliczyć Total disk i/o jednym procesem

  • iotop = Pokazuje I/O na proces w czasie rzeczywistym, ale nie daje sumie po zakończeniu procesu.
  • iostat = To pokazuje w czasie rzeczywistym I/O, ale nie powiedzieć procesowi

Na przykład mam jakiś proces uruchomiony w tle z PID ####. Potrzebuję Total Bytes Pisemnego i do tego procesu w sumie po zakończeniu procesu. Czy ktoś może powiedzieć, w jaki sposób mogę wyodrębnić te informacje, biorąc pod uwagę PID procesu.

+0

Spójrz na '/ proc//io' i http://stackoverflow.com/a/3634088/3776858 – Cyrus

Odpowiedz

4

Zapraszam do gry z tej wypociny (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 

[email protected] &     # 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 

składnię: ./myio.sh <your command>

Przykłady:

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

Zmień Dd na of= w ostatnim przykładzie, tylko jeśli wiesz, co robisz.


Dzięki temu prostemu skryptowi ode mnie możesz obejrzeć już działający proces i jego IO.

Składnia: 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

Co oznacza każda z nich wartości? Podobnie jak w przypadku mysql, którą wartość powinienem zanotować, aby obliczyć dokładny dysk I/O używany przez mój proces mysql? – Vineeth

+0

@Vineeth: To powinno ci pomóc: [Zrozumieć liczniki w /proc/pid/io](https://stackoverflow.com/a/3634088/3776858) – Cyrus

+0

Bracie, to pomogło. Mam zadanie migracji mojej lokalnej instalacji produkcyjnej mysql do RDS. Więc trzeba obliczyć dokładny dysk I/O używany przez mysql. – Vineeth