Diskdevstat und
netdevstat sind
SystemTap-Werkzeuge, die detaillierte Informationen zur Platten- und Netzwerkaktivität aller auf einem System laufenden Anwendungen sammeln. Diese Werkzeuge wurden durch
PowerTOP inspiriert, welches die Anzahl der CPU-Wakeups von jeder Anwendung pro Sekunde anzeigt (siehe
Abschnitt 2.2, »PowerTOP«). Mit Hilfe dieser Statistiken, die diese Werkzeuge sammeln, können Sie Anwendungen identifizieren, die Energie mit vielen kleinen I/O-Operationen verschwenden, anstatt weniger größere Operationen zu verwenden. Andere Werkzeuge zur Überwachung, die nur die Übertragungsraten messen, helfen bei dieser Art der Verwendung nicht.
Installieren Sie diese Werkzeuge mit SystemTap mit dem Befehl:
yum install systemtap tuned-utils kernel-debuginfo
Führen Sie die Werkzeuge mit folgendem Befehl aus:
oder dem Befehl:
Beide Befehle können bis zu drei Parameter, wie folgt, annehmen:
diskdevstat update_interval total_duration display_histogram
netdevstat update_interval total_duration display_histogram
- update_interval
Die Zeit in Sekunden zwischen Aktualisierung der Anzeige. Standardwert: 5
- total_duration
Die Zeit in Sekunden für den gesamten Durchlauf. Standardwert: 86400 (1 Tag)
- display_histogram
Ein Flag zum Erstellen eines Histogramms aus allen gesammelten Daten am Ende eines Durchlaufs.
Die Ausgabe ähnelt der von PowerTOP. Nachfolgend ist eine Beispiel-Ausgabe eines längeren diskdevstat-Durchlaufs auf einem Fedora 10 System mit KDE 4.2 aufgeführt:
PID UID DEV WRITE_CNT WRITE_MIN WRITE_MAX WRITE_AVG READ_CNT READ_MIN READ_MAX READ_AVG COMMAND
2789 2903 sda1 854 0.000 120.000 39.836 0 0.000 0.000 0.000 plasma
15494 0 sda1 0 0.000 0.000 0.000 758 0.000 0.012 0.000 0logwatch
15520 0 sda1 0 0.000 0.000 0.000 140 0.000 0.009 0.000 perl
15549 0 sda1 0 0.000 0.000 0.000 140 0.000 0.009 0.000 perl
15585 0 sda1 0 0.000 0.000 0.000 108 0.001 0.002 0.000 perl
2573 0 sda1 63 0.033 3600.015 515.226 0 0.000 0.000 0.000 auditd
15429 0 sda1 0 0.000 0.000 0.000 62 0.009 0.009 0.000 crond
15379 0 sda1 0 0.000 0.000 0.000 62 0.008 0.008 0.000 crond
15473 0 sda1 0 0.000 0.000 0.000 62 0.008 0.008 0.000 crond
15415 0 sda1 0 0.000 0.000 0.000 62 0.008 0.008 0.000 crond
15433 0 sda1 0 0.000 0.000 0.000 62 0.008 0.008 0.000 crond
15425 0 sda1 0 0.000 0.000 0.000 62 0.007 0.007 0.000 crond
15375 0 sda1 0 0.000 0.000 0.000 62 0.008 0.008 0.000 crond
15477 0 sda1 0 0.000 0.000 0.000 62 0.007 0.007 0.000 crond
15469 0 sda1 0 0.000 0.000 0.000 62 0.007 0.007 0.000 crond
15419 0 sda1 0 0.000 0.000 0.000 62 0.008 0.008 0.000 crond
15481 0 sda1 0 0.000 0.000 0.000 61 0.000 0.001 0.000 crond
15355 0 sda1 0 0.000 0.000 0.000 37 0.000 0.014 0.001 laptop_mode
2153 0 sda1 26 0.003 3600.029 1290.730 0 0.000 0.000 0.000 rsyslogd
15575 0 sda1 0 0.000 0.000 0.000 16 0.000 0.000 0.000 cat
15581 0 sda1 0 0.000 0.000 0.000 12 0.001 0.002 0.000 perl
15582 0 sda1 0 0.000 0.000 0.000 12 0.001 0.002 0.000 perl
15579 0 sda1 0 0.000 0.000 0.000 12 0.000 0.001 0.000 perl
15580 0 sda1 0 0.000 0.000 0.000 12 0.001 0.001 0.000 perl
15354 0 sda1 0 0.000 0.000 0.000 12 0.000 0.170 0.014 sh
15584 0 sda1 0 0.000 0.000 0.000 12 0.001 0.002 0.000 perl
15548 0 sda1 0 0.000 0.000 0.000 12 0.001 0.014 0.001 perl
15577 0 sda1 0 0.000 0.000 0.000 12 0.001 0.003 0.000 perl
15519 0 sda1 0 0.000 0.000 0.000 12 0.001 0.005 0.000 perl
15578 0 sda1 0 0.000 0.000 0.000 12 0.001 0.001 0.000 perl
15583 0 sda1 0 0.000 0.000 0.000 12 0.001 0.001 0.000 perl
15547 0 sda1 0 0.000 0.000 0.000 11 0.000 0.002 0.000 perl
15576 0 sda1 0 0.000 0.000 0.000 11 0.001 0.001 0.000 perl
15518 0 sda1 0 0.000 0.000 0.000 11 0.000 0.001 0.000 perl
15354 0 sda1 0 0.000 0.000 0.000 10 0.053 0.053 0.005 lm_lid.sh
Die Spalten sind:
- PID
Die Prozess-ID der Anwendung
- UID
Die Benutzer-ID, unter welcher die Anwendungen laufen
- DEV
Das Gerät auf welchem der I/O stattfand
- WRITE_CNT
Die Gesamtanzahl der Schreiboperationen
- WRITE_MIN
Die niedrigste Zeit, für zwei aufeinander folgende Schreibprozesse (in Sekunden)
- WRITE_MAX
Die maximale Zeit, für zwei aufeinander folgende Schreibprozesse (in Sekunden)
- WRITE_AVG
Die durchschnittliche Zeit, für zwei aufeinander folgende Schreibprozesse (in Sekunden)
- READ_CNT
Die Gesamtanzahl für Lese-Operationen
- READ_MIN
Die niedrigste Zeit, für zwei aufeinander folgende Leseprozesse (in Sekunden)
- READ_MAX
Die maximale Zeit, für zwei aufeinander folgende Leseprozesse (in Sekunden)
- READ_AVG
Die durchschnittliche Zeit, für zwei aufeinander folgende Leseprozesse (in Sekunden)
- COMMAND
Der Name des Prozesses
In diesem Beispiel ragen drei sehr auffallende Anwendungen heraus:
PID UID DEV WRITE_CNT WRITE_MIN WRITE_MAX WRITE_AVG READ_CNT READ_MIN READ_MAX READ_AVG COMMAND
2789 2903 sda1 854 0.000 120.000 39.836 0 0.000 0.000 0.000 plasma
2573 0 sda1 63 0.033 3600.015 515.226 0 0.000 0.000 0.000 auditd
2153 0 sda1 26 0.003 3600.029 1290.730 0 0.000 0.000 0.000 rsyslogd
Diese drei Anwendungen besitzen ein WRITE_CNT größer als 0, was bedeutet, dass sie eine Form von Schreibprozess während des Meßvorgangs durchgeführt haben. Von diesen war plasma bei weitem schlimmste Missetäter: es führte die meisten Schreiboperationen durch und natürlich war die durchschnittliche Zeit zwischen den Schreiboperationen die niedrigste. Aus diesem Grund wäre Plasma der beste Kandidat für Nachforschungen, wenn Sie sich Gedanken zu strom-ineffizienten Anwendungen machen würden.
Verwenden Sie die Befehle strace und ltrace, um Anwendungen näher zu untersuchen, indem Sie alle Systemaufrufe der angegebenen Prozess-ID nachverfolgen. Im aktuellen Beispiel könnten Sie beispielsweise ausführen:
In diesem Beispiel enthielt die Ausgabe von strace ein sich alle 45 Sekunden wiederholendes Muster, welches die KDE-Symbol Cache-Datei des Benutzers zum Schreiben öffnete, gefolgt von einem unmittelbaren Schließen der Datei. Daraus ergab sich ein notwendiges physikalisches Schreiben auf die Festplatte, da sich die Meta-Informationen der Datei (speziell der Änderungszeit) geändert hatten. Die abschließende Behebung war das Vermeiden dieser unnötigen Aufrufe, wenn keine Aktualisierungen an den Symbolen aufgetreten waren.