9 Stimmen

Wie kann ich ein Profil der Datei-E/A erstellen?

Unser Gebäude ist ärgerlich langsam. Es ist ein Java-System, das mit Ameise und ich betreibe meinen unter Windows XP. Je nach Hardware kann es zwischen 5 und 15 Minuten dauern, bis der Vorgang abgeschlossen ist.

Die Beobachtung der allgemeinen Leistungsmetriken auf dem Rechner sowie die Korrelation der Hardwareunterschiede mit den Erstellungszeiten zeigen, dass der Prozess an E/A gebunden ist. Es zeigt auch, dass der Prozess viel mehr liest als schreibt.

Ich habe jedoch keine gute Methode gefunden, um zu bestimmen die Dateien gelesen oder geschrieben werden, und wie oft. Mein Verdacht ist, dass mit unseren vielen Unterprojekten und nachfolgenden Aufrufen des Compilers, der Build die gleichen häufig verwendeten Bibliotheken viele Male neu liest.

Welche Profiling-Tools können mir sagen, was ein bestimmter Prozess mit welchen Dateien macht? Kostenlos ist schön, aber nicht unbedingt notwendig.


Verwendung von Process Monitor, wie von Jon Skeet vorgeschlagen, Ich konnte meinen Verdacht bestätigen: Fast die gesamte Festplattenaktivität bestand aus dem Lesen und erneuten Lesen von Bibliotheken, wobei die JDK-Kopien von "rt.jar" und anderen Bibliotheken an der Spitze der Liste standen. Ich kann keine RAM-Disk erstellen, die groß genug ist, um alle von mir verwendeten Bibliotheken zu speichern, aber das Mounten der "heißesten" Bibliotheken auf eine RAM-Disk verkürzte die Erstellungszeiten um etwa 40 %; offensichtlich leistet das Windows-Dateisystem-Caching keine gute Arbeit, obwohl ich Windows angewiesen habe, es zu optimieren.

Interessant ist, dass der typische "Lesevorgang" auf einer JAR Datei nur ein paar Dutzend Bytes; in der Regel sind es zwei oder drei, gefolgt von einer Überspringung von mehreren Kilobytes weiter in der Datei. Es schien für Massenlesevorgänge schlecht geeignet zu sein.

Ich werde weitere Tests durchführen mit tous meiner Bibliotheken von Drittanbietern auf einem Flash-Laufwerk zu speichern, um zu sehen, welche Auswirkungen das hat.

0 Stimmen

Eine kurze Frage erickson, wie haben Sie herausfinden, wie viele Bytes mit dem ProcessMonitor gelesen werden? Ich habe das gleiche Problem, wenn ich versuche, ein Profil für unsere Builds mit Windows XP zu erstellen.

0 Stimmen

Ich habe gerade herausgefunden, dass in der Spalte Detail für ReadFile-Operationen zum Beispiel Offset steht: N Bytes, Länge: M Bytes, und so weiter.

7voto

Jon Skeet Punkte 1325502

Wenn Sie sólo brauchen es für Windows, SysInternals Prozess-Monitor sollte Ihnen alles zeigen, was Sie wissen müssen. Sie können den Prozess auswählen, dann jeden Vorgang sehen, wie er abläuft, und auch eine Zusammenfassung der Dateioperationen erhalten.

0 Stimmen

Danke, John. Ich habe in der Vergangenheit Process Explorer verwendet. Ist dies ein Nachfolger dieses Produkts oder etwas völlig anderes?

0 Stimmen

Process Explorer ist eine Art Alternative zum Task-Manager. Process Monitor zeigt Ihnen jede E/A-Operation wie das Öffnen von Dateien, das Schreiben in die Registrierung usw. an.

1voto

Ben Hardy Punkte 1721

Als ich noch Windows verwendete, erzielte ich gute Ergebnisse bei der Beschleunigung meines Builds, indem ich die gesamte Build-Ausgabe auf eine separate Partition von vielleicht 3 GB Größe schrieb und diese regelmäßig nachts einmal pro Woche über eine geplante Aufgabe formatierte. Es ist nur die Build-Ausgabe, also macht es nichts, wenn sie gelegentlich einseitig geplättet wird.

Aber ehrlich gesagt, seit ich auf Linux umgestiegen bin, mache ich mir über die Fragmentierung der Festplatte keine Sorgen mehr.

Ein weiterer Grund, Ihren Build zumindest einmal unter Linux zu testen, ist, dass Sie die strace (gefiltert nach Aufrufen von öffnen ), um zu sehen, welche Dateien von Ihrem Build berührt werden.

1 Stimmen

Procmon/Filemon liefern (eigentlich) ähnliche Informationen wie strace. Ich war in der Lage, jede Öffnung, Metadatenabfrage, Lese- und Schreiboperation zu sehen.

1voto

Jeffrey Fredrick Punkte 4561

Ein alter Hut: Erstellen Sie eine RAM-Disk und kompilieren Sie Ihre Dateien von dort.

1 Stimmen

Mein Ziel bei der Erstellung des IO-Profils ist es, herauszufinden, was am meisten davon profitieren würde, auf einer RAM-Disk zu liegen.

0voto

rmeador Punkte 25087

Früher habe ich eine umfangreiche Java-Webanwendung (JSP-Frontend) mit Ant unter Windows erstellt, und das dauerte bis zu 3 Minuten. Ich löschte meinen Computer und installierte Linux, und plötzlich dauerten die Builds 18 Sekunden. Das sind echte Zahlen, wenn auch etwa 3 Jahre alt. Ich kann nur vermuten, dass Java die Linux-Speicherverwaltung und die Threading-Modelle gegenüber den Windows-Äquivalenten bevorzugt, da meiner Erfahrung nach alle Java-Programme unter Linux besser zu laufen scheinen (insbesondere Eclipse). Linux scheint viel besser in der Lage zu sein, zusätzliche Lesevorgänge von der Festplatte zu verhindern, wenn man viele Dateien liest, die sich nicht geändert haben (z. B. Executables und Bibliotheken). Dies kann eine Eigenschaft des Festplatten-Caches oder des Dateisystems sein, ich bin mir nicht sicher, was davon.

Eine der großartigen Eigenschaften von Java ist, dass es plattformübergreifend ist, so dass die Einrichtung eines Linux-basierten Build-Servers tatsächlich eine Option für Sie ist. Da ich so etwas wie ein Linux-Evangelist bin, würde ich es natürlich vorziehen, wenn Sie Ihre Entwicklungsumgebung auf Linux umstellen würden, aber ich weiß, dass viele Leute das nicht tun wollen (oder aus praktischen Gründen nicht können).

Wenn Sie nicht einmal bereit sind, einen Linux-Build-Server einzurichten, um zu sehen, ob er schneller läuft, könnten Sie zumindest versuchen, die Festplatte Ihres Windows-Rechners zu defragmentieren. Das macht einen großen Unterschied für C++-Builds auf meinem Arbeitsrechner. Versuchen Sie JkDefrag was viel besser zu sein scheint als der Defragmentierer, der mit Windows mitgeliefert wird.

EDIT : Ich nehme an, dass ich eine Ablehnung erhalten habe, weil meine Antwort nicht genau auf die gestellte Frage eingeht. Es ist jedoch in der Tradition von StackOverflow, den Leuten zu helfen, ihr wirkliches Problem zu lösen, nicht nur die Symptome zu behandeln. Ich gehöre nicht zu den Leuten, für die die Antwort auf jede Frage "benutze Linux" lautet. In diesem Fall habe ich jedoch sehr reale, gemessene Leistungssteigerungen in genau der Situation, nach der der Fragesteller fragt, und deshalb dachte ich, dass es sich lohnt, meine Erfahrungen zu teilen.

0 Stimmen

Ich bezweifle zwar nicht, dass ein Wechsel zu Linux die Leistung verbessern würde, aber das ist kaum eine Antwort auf eine Frage zur Profilierung von IO unter Windows

0 Stimmen

Danke, rmeador. Viele unserer Entwickler arbeiten mit Linux, und das hilft wirklich. Sein Dateisystem-Cache scheint viel besser zu sein als der von Windows. Es besteht auch der Verdacht, dass Microsoft absichtlich die Leistung von Kernel-Aufrufen durch Nicht-M$-Code behindert hat ;) Aber selbst Linux-Builds sind zu langsam.

0voto

Sesh Punkte 5785

Eigentlich FileMon ist ein direkteres Werkzeug als ProcMon. Im Allgemeinen sollten Sie bei der Durchführung von Leistungsanalysen für Festplatten-E/A die folgenden beiden Punkte berücksichtigen:

  • Durchsatz (Lese-/Schreibgeschwindigkeit von Bytes pro Sekunde)
  • Latenzzeit (wie lange wird in der Warteschlange auf das Lesen/Schreiben gewartet)

Wenn Sie die Leistung Ihres Systems anhand der oben genannten Kriterien bewerten, ist es einfach, den Engpass zu ermitteln und Korrekturmaßnahmen zu ergreifen: besorgen Sie sich schnellere Festplatten oder ändern Sie Ihren Code (je nachdem, was billiger ist).

2 Stimmen

FileMon war zu dem Zeitpunkt, als Sie geantwortet haben, bereits die veraltete Unterversion von ProcMon. -1.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X