Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

2.3. Diskdevstat und netdevstat

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:
diskdevstat
oder dem Befehl:
netdevstat
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:
strace -p 2789
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.