http://www.linux-tips-and-tricks.de

Wie ohne Sysinternal's filemon unter Linux herausfinden, wer auf der Platte arbeitet PDF Print E-mail
Montag, 27 August 2007
Heute habe ich mich gewundert warum an meinem Netzwerkrouter ständig was auf die Platte geschrieben wird und wollte untersuchen, wer denn da so ständig schreibt. Google lieferte schnell die Antwort: filemon von Sysinternals - nur leider gibt es das nicht für Linux. Also habe ich weiter gesucht und dabei folgenden Weg gefunden den Verursacher von IO Traffic auf meinem System zu identifizieren.
 
Folgende Tools habe ich im Netz gefunden mit denen mit Linux Plattenaktivitäten festzustellen und zu messen sind:
  1. iostat: Damit kann man herausfinden welche Platte bzw welche Partition wie stark benutzt wird.
    • Beispiel:
    • iostat -p /dev/hda -d 1
      • Zeigt jede Sekunde an wie stark die Partitions auf /dev/hda benutzt werden.
  2. sar: Zeigt an welche Devices Aktivitäten haben
    • Beispiel:
      • sar -d 1 100
      • Zeigt jede Sekunde an wie stark alle Devices im System benutzt werden. Man muss dann mit cat /proc/devices die konkrete Partition herausfinden.
  3. lsof: Zeigt alle benutzten Dateien im System mit diversen Informationen wie Filegröße und pid und Namen des Prozesses, der diese Fileio macht, an.
    • Beispiel:
      • lsof /dev/hdb1
      • Zeigt alle offenen Dateien an, die auf /dev/hdb1 liegen.
    • Beispiel:
      • lsof -p 4711
      • Zeigt alle offenen Dateien des Prozesses mit der Pid 4711 an
    • Weitere Beispiele:
      • Offene files anzeigen: lsof (root)

  • Wer benutzt gerade vi: lsof /usr/bin/vim
  • Wer greift auf das CD-Laufwerk zu: lsof /dev/cdrom
  • Welche Dateien benötigt meine Shell: lsof +p 305
  • Welche Dateien werden zurzeit von echten Usern benutzt: lsof -u ^root
  • Welche Dateien wurden gelöscht, obwohl sie noch offen sind: lsof -a +L1 /
  • Welche Prozesse kommunizieren da auf Port 80 miteinander: lsof -i :80
  • Dateien, die von PID 4137 geöffnet sind: lsof -p 4137
  • strace: Zeigt alle Systemaktivitäten eines Prozesses an.
    • Beispiel:
      • strace -p 4711 -e trace=open,read,write,close
      • Zeigt alle FileIO Aktivitäten des Prozesses 4711 an
    Das ist also das Handwerkszeug was man unter Linux benutzen kann. Wie bin ich also nun an das Problem rangegangen? Nachdem ich mit den o.g. Tools herumgespielt habe um Ihre Beitragskraft zu meinem Problem kennenzulernen habe ich lsof, diff und strace benutzt.
    1. Zuerst habe ich mir zwei Snapshots von lsof erzeugt und abgespeichert und dann mit diff verglichen
      • lsof > l1; sleep 5; lsof >l2; diff l1 l2
    2. Diff zeigt mir Unterschiede. In den ersten Zeilen sind die Prozesse, die auf Files schreiben zu sehen. Dummerweise gibt es aber auch Prozesse, die die FileIO Aktivitäten an Subprozesse deligieren. bei denen ändert sich die PID und u.U. die Size der Files.
    3. Aus den ersten Zeilen, wo Änderungen in der Filegröße (7te Spalte) zu sehen waren habe ich mir die pids (2te Spalte) genommen und mit strace nachgesehen was denn da so bei den Prozessen an Daten geschrieben bzw gelesen werden.
      • strace -p 4711 -e trace=open,read,write,close
    4. Damit habe ich relativ schnell herausgefunden, dass es der squid mit seinem LogFile war. 
    Würde es filemon für Linux geben wäre das sofort sehr einfach zu lösen gewesen. Aber das Ganze läßt sich sicherlich auch in ein Script. Wenn jemand eines kennt welches ähnliche Funktionalität wie filemon hat bin ich für Hinweise dankbar. Ansonsten werde ich wohl mal eines erstellen wenn ich mal etwas Zeit habe.
     
    UPDATE: 
    Nachdem ich gerade ein Script schreibe um die Suche zu vereinfachen stelle ich fest dass die Anleitung oben nur in meinem konkreten Fall funktionierte. Ich bin jetzt am suchen warum es auf einem anderen System nicht funktioniert und update diese Seite dann entsprechend.
     
    Folgende Seiten im Internet haben mir geholfen, diese Informationen zusammenzutragen:
    Last Updated ( Sonntag, 01 Juni 2008 )
     

    Add comment

    ===> Pls add comments in German or English only <===
    eMail will be hidden/eMail wird versteckt


    Security code
    Refresh

    < Prev   Next >