Die Datei in /proc/<pid>/io
stellen 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>/io
Dateiwerten:
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 bash
Skript 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 grep
Befehl in den Listen wie wchar
folgt 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)