Wie kann ich Datei-I / O profilieren?

8

Unser Build ist nervig langsam. Es ist ein Java-System, das mit Ant erstellt wurde, und ich verwende meinen auf Windows XP. Abhängig von der Hardware kann es zwischen 5 und 15 Minuten dauern, bis die Installation abgeschlossen ist.

Wenn Sie die allgemeinen Leistungsmetriken auf der Maschine beobachten und Hardware-Unterschiede mit den Build-Zeiten korrelieren, zeigt dies an, dass der Prozess E / A-gebunden ist. Es zeigt auch, dass der Prozess viel mehr liest als schreibt.

Ich habe jedoch keinen guten Weg gefunden, zu bestimmen, welche Dateien gelesen und geschrieben werden und wie oft. Mein Verdacht ist, dass der Build mit unseren vielen Teilprojekten und nachfolgenden Aufrufen des Compilers die gleichen häufig verwendeten Bibliotheken mehrmals wiederholt.

Was sind einige Profiling-Tools, die mir sagen, was ein bestimmter Prozess mit welchen Dateien macht? Kostenlos ist nett, aber nicht notwendig.

Process Monitor, wie von Jon Skeet vorgeschlagen, > Ich konnte meinen Verdacht bestätigen: Fast alle Aktivitäten auf der Festplatte waren das Lesen und erneute Lesen von Bibliotheken, wobei die JDK-Kopien von "rt.jar" und andere Bibliotheken ganz oben auf der Liste standen. Ich kann eine RAM-Disk nicht groß genug machen, um alle Bibliotheken, die ich benutzt habe, zu halten, aber die "heißesten" Bibliotheken auf einer RAM-Disk zu montieren, reduzierte die Build-Zeiten um etwa 40%; klar, Windows-Dateisystem-Caching ist nicht gut genug, obwohl ich Windows gesagt habe, um dafür zu optimieren.

Eine interessante Sache, die ich bemerkt habe, ist, dass die typische "Lese" -Operation in einer JAR -Datei einfach ist ein paar Dutzend Bytes; Normalerweise gibt es zwei oder drei davon, gefolgt von einem Überspringen mehrerer Kilobyte weiter in der Datei. Es schien schlecht zu lesen geeignet.

Ich werde mehr Tests mit all meiner Drittanbieter-Bibliotheken auf einem Flash-Laufwerk durchführen und sehen, welche Wirkung das hat.

    
erickson 29.01.2009, 20:08
quelle

5 Antworten

7

Wenn Sie nur für Windows benötigen, SysInternals Prozessmonitor sollte Ihnen alles zeigen, was Sie wissen müssen. Sie können den Prozess auswählen, dann sehen Sie jede einzelne Operation und erhalten eine Zusammenfassung der Dateioperation.

    
Jon Skeet 29.01.2009, 20:14
quelle
1

Ein Oldie, aber ein Goodie: Erstellen Sie eine RAM-Disk und kompilieren Sie Ihre Dateien von dort.

    
Jeffrey Fredrick 30.01.2009 03:30
quelle
1

Zurück, als ich noch Windows verwendete, habe ich gute Ergebnisse erzielt, indem ich meine Builds beschleunigt habe, indem ich die Ausgabe auf eine separate Partition geschrieben habe, die vielleicht 3 GB groß war, und diese in der Nacht einmal pro Woche über eine geplante Aufgabe formatierte. Es ist nur Build-Ausgabe, so ist es egal, wenn es gelegentlich einseitig abgeflacht wird.

Aber seit ich auf Linux umgestiegen bin, ist die Festplattenfragmentierung etwas, worüber ich mich nie mehr Sorgen mache.

Ein weiterer Grund, Ihren Build unter Linux mindestens einmal zu testen, ist, dass Sie strace ausführen können (grepped for ruft öffnen auf, um zu sehen, welche Dateien Ihr Build berührt.

    
Ben Hardy 30.01.2009 01:55
quelle
0

Ich habe eine massive Java-Webapp (JSP-Frontend) mit Ant unter Windows erstellt und es würde mehr als 3 Minuten dauern. Ich habe meinen Computer gelöscht und Linux installiert, und die Builds dauerten plötzlich 18 Sekunden. Das sind echte Zahlen, wenn auch ungefähr 3 Jahre alt. Ich kann nur davon ausgehen, dass Java die Linux-Speicherverwaltung und Threading-Modelle den Windows-Entsprechungen vorzieht, da alle Java-Programme meiner Erfahrung nach besser laufen (insbesondere Eclipse). Linux scheint viel besser zu sein, um zusätzliche Lesevorgänge von der Festplatte zu verhindern, wenn Sie viele Dateien lesen, die sich nicht geändert haben (d. H. Fehlerfreie und Bibliotheken). Dies kann eine Eigenschaft des Disk-Caches oder des Dateisystems sein, ich bin mir nicht sicher was.

Einer der großen Vorteile von Java ist, dass es plattformübergreifend ist. Daher ist es für Sie eine Option, einen Linux-basierten Build-Server einzurichten. Da ich so etwas wie ein Linux-Evangelist bin, würde ich es am liebsten sehen, wenn Sie Ihre Entwicklungsumgebung auf Linux umstellen, aber ich weiß, dass viele Leute das nicht wollen (oder aus praktischen Gründen nicht).

Wenn Sie nicht einmal einen Linux-Build-Server einrichten möchten, um zu sehen, ob er schneller läuft, können Sie zumindest versuchen, die Festplatte Ihres Windows-Rechners zu defragmentieren. Das macht einen großen Unterschied für C ++ Builds auf meinem Arbeitscomputer. Probieren Sie JkDefrag , das viel besser aussieht als das Defragmentierprogramm von Windows.

BEARBEITEN : Ich würde annehmen, dass ich einen Downvote bekommen habe, weil meine Antwort nicht die genaue Frage beantwortet. Es liegt jedoch in der Tradition von StackOverflow, Menschen dabei zu helfen, ihr tatsächliches Problem zu lösen und nicht nur die Symptome zu behandeln. Ich gehöre nicht zu denen, für die die Antwort auf jede Frage "Linux benutzen" ist. In diesem Fall habe ich jedoch sehr reale, gemessene Leistungszuwächse in genau der Situation, um die sich der OP bemüht, und deshalb hielt ich es für sinnvoll, meine Erfahrungen zu teilen.

    
rmeador 29.01.2009 20:58
quelle
0

FileMon ist ein direkteres Werkzeug als ProcMon. Im Allgemeinen sollten Sie bei der Ausführung der Leistungsanalyse für die Datenträger-E / A die folgenden zwei beachten:

  • Durchsatz (Geschwindigkeit des Lese- / Schreibvorgangs von Bytes pro Sekunde)
  • Latenz (wie viel in der Warteschlange zum Lesen / Schreiben wartet)

Sobald Sie die Leistung Ihres Systems in Bezug auf die obigen Punkte bewertet haben, ist es einfach, den Engpass zu identifizieren und Korrekturmaßnahmen zu ergreifen: schnellere Festplatten zu erhalten oder Ihren Code zu ändern (was auch immer günstiger ist).

    
Sesh 30.01.2009 03:36
quelle