Wissen, welcher Prozess I / O ohne iotop ausführt

12

Unter Linux möchte ich wissen, welcher Prozess meine Festplatten-E / A-Bandbreite verwendet.

Ich weiß, dass ich verwenden kann, iotopaber ich habe einen Computer, auf dem aus verschiedenen Gründen iotopkeine Installation möglich ist.

Wie kann ich diese Informationen manuell abrufen? (Wie geht es iotopselbst weiter?)

Totor
quelle

Antworten:

16

Die Datei in /proc/<pid>/iostellen dar, was Sie brauchen. Es ist ein bisschen Scripting-Arbeit, um eine Ausgabe ähnlich zu bekommen iotop. Siehe die Linux-Kernel-Dokumentation zu den /proc/<pid>/ioDateiwerten:

rchar

E / A-Zähler: Zeichen gelesen Die Anzahl der Bytes, die diese Task zum Lesen aus dem Speicher veranlasst hat. Dies ist einfach die Summe der Bytes, die dieser Prozess an read () und pread () übergeben hat. Es enthält Dinge wie tty IO und es wird nicht davon beeinflusst, ob ein tatsächliches physisches Festplatten-IO erforderlich war oder nicht (der Lesevorgang wurde möglicherweise vom PageCache ausgeführt).

wchar

E / A-Zähler: Geschriebene Zeichen Die Anzahl der Bytes, die durch diese Task auf die Festplatte geschrieben wurden oder werden sollen. Hier gelten ähnliche Einschränkungen wie bei rchar.

[...]

read_bytes

E / A-Zähler: Byte gelesen Es wurde versucht, die Anzahl der Bytes zu zählen, die durch diesen Prozess tatsächlich aus der Speicherschicht abgerufen wurden. Wird auf der Ebene submit_bio () ausgeführt, ist dies für blockgestützte Dateisysteme korrekt.

write_bytes

E / A-Zähler: Geschriebene Bytes Es wurde versucht, die Anzahl der Bytes zu zählen, die dieser Prozess an die Speicherschicht gesendet hat. Dies geschieht zum Zeitpunkt des Verschmutzens von Seiten.

Jetzt können Sie dieses kleine bashSkript verwenden:

#!/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

Es werden zwei Listen mit einer Verzögerung von 2 Sekunden ( $delay: kann ein- oder ausgeblendet werden) erstellt. Anschließend werden die Listen verglichen und die Unterschiede berechnet. Die 10 Prozesse mit den meisten E / A werden mit ihrer E / A-Bandbreite in den letzten 2 Sekunden gedruckt. Wenn Sie E / A schreiben statt E / A lesen möchten, bearbeiten Sie den grepBefehl in den Listen wie wcharfolgt 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
quelle