Frage

Ich habe ein Java-Programm für eine Reihe von wissenschaftlichen Berechnungen auf mehr Prozessoren zu tun, indem sie es in Stücke brechen und jedes Stück in einem anderen Thread ausgeführt wird. Das Problem ist trivially partitionierbaren so gibt es keine Konkurrenz oder Kommunikation zwischen den Threads. Der einzige gemeinsame Daten, die sie zugreifen sind einige gemeinsam genutzte statische Caches, die nicht brauchen ihren Zugang synchronisiert haben, und einige Datendateien auf der Festplatte. Die Fäden werden auch ständig auf die Platte zu schreiben, aber Dateien zu trennen.

Mein Problem ist, dass manchmal, wenn ich das Programm laufe ich sehr gute Geschwindigkeit zu bekommen, und manchmal, wenn ich genau die gleiche Sache laufen läuft es sehr langsam. Wenn ich es langsam und Strg-C und starten Sie sehen zu laufen, wird es in der Regel starten Sie schnell wieder zum Laufen. Es scheint, sich in setzen entweder langsamen Modus oder schnellen Modus früh im Lauf und schaltet nie zwischen den Modi.

Ich habe es angeschlossen JConsole und es scheint nicht zu einem Speicherproblem zu sein. Als ich es langsam läuft gefangen habe, habe ich versucht, einen Profiler daran anschließen, aber der Profiler nicht anschließen. Ich habe versucht, mit -Xprof läuft, aber die Deponien zwischen einem langsamen Lauf und schnell laufen scheinen nicht viel anders zu sein. Ich habe versucht, verschiedene Müllsammler und verschiedenen Schlichten der verschiedenen Teile des Speicherplatzes verwenden, auch.

Meine Maschine ist ein Mac Pro mit gestreiften RAID-Partition. Die CPU-Auslastung sinkt nie ab, ob seine langsam oder schnell laufen, was man erwarten würde, wenn Threads liest von der Platte blockiert auf waren zu viel Zeit, so dass ich glaube nicht, dass ein Datenträger gelesen Problem sein könnte.

Meine Frage ist, welche Art von Problemen mit meinem Code dies dazu führen könnte? Oder könnte dies ein O Problem sein? Ich habe nicht in der Lage gewesen, es auf einem Fenster eine Maschine zu duplizieren, aber ich habe keinen Windows-Rechner mit einem ähnlichen RAID-Setup habe.

War es hilfreich?

Lösung

Sie könnten Gewinde haben, die in einer Endlosschleife gegangen sind.

Versuchen Sie, mit VisualVM verbinden und den Thread-Monitor verwenden.

https://visualvm.dev.java.net

Sie müssen möglicherweise an, bevor das Problem auftritt.

Andere Tipps

Ich zweite, dass Sie es mit einem Profiler tun sollten an den Fäden der Suche sehen - wie viele Threads, welche Zustände sind sie in etc. Es könnte eine ungerade Race-Bedingung ab und zu passiert sein. Es könnte auch sein, dass die Klassen mit Profiler Haken instrumentiert (die Verlangsamung verursacht), Sortes die Race-Bedingung, und Sie werden keine Verlangsamung mit dem Profiler angebracht sehen: /

Bitte schauen Sie unter , oder besser gesagt die Antwort, wo Cache-Konfliktproblem erwähnt ist.

Laichen Sie die gleiche Umbra von Threads jedes Mal? Ist diese Zahl kleiner oder gleich der Anzahl der Threads auf Ihrer Plattform zur Verfügung? Diese Zahl könnte mit ziemlicher Genauigkeit geprüft oder guestimated werden.

Bitte senden Sie keine finidngs!

Haben Sie ein Tool CPU-Temperatur zu messen? Das Betriebssystem kann die CPU seine Drosselung mit Temperatur Problemen zu behandeln.

Ist es möglich, dass Ihr Programm wird manchmal auf der Festplatte ausgelagert werden? In diesem Fall müssen Sie bei der Speichernutzung des Betriebssystems als Ganzes betrachten, anstatt nur das Programm. Ich weiß aus Erfahrung, es ein großer Unterschied in Laufzeitleistung ist, wenn der Speicher ständig auf die Festplatte ausgelagert wird und zurück.

Ich weiß nicht viel über OSX, aber unter Linux die „freie“ Befehl ist für diesen Zweck geeignet.

Ein weiteres Problem, das diese Verlangsamung verursachen könnte, ist Log-Dateien? Ich habe zumindest einige Logging-Code bekannt, dass das System schrittweise verlangsamt, wie die Protokolldateien wuchs. Es ist möglich, dass Ihre Threads auf einer Log-Datei synchronisiert werden, die in der Größe wächst, dann, wenn Sie Ihr Programm neu starten, wird eine andere Protokolldatei verwendet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top