Odpowiedzi:
Plik /proc/<pid>/io
reprezentuje to, czego potrzebujesz. Jest trochę pracy skryptowej, aby uzyskać wyjście podobne do iotop
. Zobacz dokumentację jądra Linuksa do /proc/<pid>/io
wartoś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 bash
skryptu:
#!/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 grep
polecenie na listach wchar
zamiast 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)