Dowiedz się, który proces wykonuje I / O bez iotop

12

W systemie Linux chcę wiedzieć, który proces wykorzystuje pasmo wejścia / wyjścia dysku.

Wiem, że mogę korzystać, iotopale mam komputer, na którym z różnych powodów iotopnie można zainstalować.

Jak mogę ręcznie uzyskać te informacje? (Jak się to odbywa iotop?)

Totor
źródło

Odpowiedzi:

15

Plik /proc/<pid>/ioreprezentuje to, czego potrzebujesz. Jest trochę pracy skryptowej, aby uzyskać wyjście podobne do iotop. Zobacz dokumentację jądra Linuksa do /proc/<pid>/iowartości pliku:

rchar

Licznik we / wy: odczytane znaki Liczba bajtów, które to zadanie spowodowało odczytaniem z pamięci. Jest to po prostu suma bajtów, które ten proces przekazał do read () i pread (). Obejmuje rzeczy takie jak tty IO i nie ma wpływu na to, czy faktyczne IO dysku fizycznego było wymagane (odczyt mógł być zadowolony z pagecache)

wchar

Licznik we / wy: zapisane znaki Liczba bajtów, które to zadanie spowodowało lub spowoduje zapisanie na dysk. Podobne zastrzeżenia dotyczą tutaj jak w przypadku rchar.

[...]

read_bytes

Licznik we / wy: odczyt bajtów Próba zliczenia liczby bajtów, które ten proces naprawdę spowodował pobranie z warstwy pamięci. Wykonano na poziomie subm_bio (), więc jest dokładny dla systemów plików z blokami.

write_bytes

Licznik we / wy: zapisane bajty Próba zliczenia liczby bajtów, które ten proces spowodował wysłanie do warstwy pamięci. Odbywa się to w czasie czyszczenia strony.

Teraz możesz użyć tego małego bashskryptu:

#!/bin/bash

if [ "$(id -u)" -ne 0 ] ; then
  echo "Must be root" 2>&1
  exit 1
fi

delay=2
lista=$(for p in $(pgrep "."); do echo -n "$p "; grep ^rchar /proc/$p/io 2>/dev/null; done)

while :; do

  echo "-----"
  listb=$(for p in $(pgrep "."); do echo -n "$p "; grep ^rchar /proc/$p/io 2>/dev/null; done)

  echo "$lista" | while read -r pida xa bytesa; do
    [ -e "/proc/$pida" ] || continue
    echo -en "$pida:\t"
    bytesb=$(echo "$listb" | awk -v pid=$pida '$1==pid{print $3}')
    echo "$((($bytesb - $bytesa) / $delay)) b/s"
  done | sort -nk2 | tail
  sleep $delay
  listb=$lista
done

Tworzy dwie listy z opóźnieniem 2 sekund ( $delay: można je zwiększyć lub zmniejszyć) między nimi, a następnie porównuje listy i oblicza różnice. 10 procesów z największą liczbą we / wy jest drukowanych z pasmem we / wy w ciągu ostatnich 2 sekund. Jeśli chcesz pisać We / Wy zamiast czytać We / Wy, po prostu edytuj greppolecenie na listach wcharzamiast rchar:

lista=$(for p in $(pgrep "."); do echo -n "$p "; grep ^wchar /proc/$p/io 2>/dev/null; done)
listb=$(for p in $(pgrep "."); do echo -n "$p "; grep ^wchar /proc/$p/io 2>/dev/null; done)
chaos
źródło