2012-09-10 7 views
8

Ich versuche, eine NetLogo (ein Java Simulation Framework) -Simulation auf einem Cluster als Teil eines großen Experiments auszuführen. Ich war überrascht von dem scheinbar massiven Speicherbedarf einer (relativ) einfachen Simulation. Auf dem Cluster werden die Ausnahmen "java.lang.OutOfMemoryError: Java heap space" für weniger als "-Xmx2500M" hoepsizes ausgelöst. Eine einzelne Ausführung dauert 5 Stunden. Ich habe das gleiche Experiment auf beiden Macs (iMac und MacBook Pro) ausgeführt, und sie wurden in weniger als einer Stunde ausgeführt, wobei "-Xmx1024" keine Fehler verursachte. Die Cluster-Jobs benötigen "-XX: MaxPermSize = 250M", während auf meinen Macs keine Erhöhung über den Standardwert hinaus erforderlich ist. Ich habe den gleichen Code, die gleichen Eingaben, unter Verwendung der genau gleichen Gläser in allen Fällen.Gleiches Programm, gleiche JVM, aber sehr unterschiedliche Speicheranforderungen und Ausführungszeiten auf verschiedenen Maschinen - warum?

64-Bit-JVMs sind jeweils (und soweit ich weiß, dass diese ziemlich ähnlich sind) verwendet:

<on the cluster> 
$ java -version 
java version "1.6.0_26" 
Java(TM) SE Runtime Environment (build 1.6.0_26-b03) 
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode) 

<on my macs> 
$ java -version 
java version "1.6.0_31" 
Java(TM) SE Runtime Environment (build 1.6.0_31-b04-415-10M3646) 
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01-415, mixed mode) 

Und ich bin mit Client-JVM in allen Fällen (wurde ursprünglich Server auf Cluster mit Schalt für den Kunden keinen Unterschied gemacht). Ich habe versucht, auf dem Cluster mit Java 7, gleichen großen Speicher und Ausführungszeit Probleme.

Ich bin völlig perplex, niemand, mit dem ich gesprochen habe, kann dies erklären. Ist jemand da draußen schon einmal da? Jede Hilfe sehr geschätzt!

+0

Vielleicht sollten Sie einen Heap-Dump mit -XX erstellen: + HeapDumpOnOutOfMemoryError und dann mit MAT oder ähnlichem, um zu sehen, was den Speicher verbraucht. –

+0

Ich würde VisualVM oder einen kommerziellen Speicherprofiler wie YourKit verwenden. –

+0

sieht für mich aus, als ob Sie auch zwei verschiedene jvm-Versionen haben. Nicht zu sagen, es ist dein Problem, aber es könnte dazu beitragen. – Matt

Antwort

3

Ich vermute, dass eine schnellere Netzwerk- oder Festplatten-IO hat. Wenn Sie Warteschlangen verwenden, um auf den Datenträger zu schreiben oder in das Netzwerk zu schreiben, in dem ein Computer mithalten kann und der andere nicht, kann die Warteschlange den Computer verlangsamen und eine unbegrenzte Menge an Arbeitsspeicher verwenden.

Wenn haben Sie schnelle Netzwerk-IO kann es entweder helfen, Daten schneller senden (Warteschlangen klein zu halten), oder es kann bedeuten, Sie Daten zu schnell empfangen (dh Warteschlange können schneller wachsen, als sie verbraucht wird)

Viel hängt auf was Ihre Anwendung tatsächlich tut. Wenn Ihr Programm ein OOME erhält, schlage ich vor, dass Sie einen Heapspeicherauszug erstellen und ihn analysieren und nach Auflistungen (z. B. Warteschlange) suchen, die viel Speicher belegen.

+0

Danke für die sehr schnelle Antwort. IO Geschwindigkeit war einer der ersten Vorschläge. Der Cluster ist viel langsamer, und das erklärt die viel langsamere Initialisierung als meine eigenen Maschinen. Wenn das Programm jedoch einmal ausgeführt wird, wird es bis zum Ende (5 Stunden später) nicht gelesen/geschrieben und schreibt eine Zeile in eine Datei, wenn dies der Fall ist. Ich sollte auch sagen, dass während dieser Tests niemand sonst etwas auf dem Cluster laufen lässt. Ich werde in die Haldenkippe schauen, aber in der Zwischenzeit, irgendwelche anderen Vorschläge? – user1660640

+0

Wenn Sie einen Cluster simulieren, haben Sie eine Netzwerk-IO, sogar über Loopback? Die Geschwindigkeitsdaten können über Loopback übertragen werden und variieren drastisch je nach Prozessor und Betriebssystem. –

+0

Der gesamte Job (ein einzelner Job) wird auf einem einzelnen Cluster-Knoten ausgeführt: Die Idee besteht darin, mehrere hundert solcher Jobs gleichzeitig auszuführen. Es ist keine Kommunikation zwischen Knoten erforderlich, jeder Job ist vollständig eigenständig wie ein eigener Java-Prozess. – user1660640

0

Ich vermute, dass das Problem ist, dass Sie die Server-JVM verwenden. Die Client-JVM ist auf 64-Bit-Computern nicht verfügbar. Auch wenn Sie nach dem Client JVM fragen, wird Ihnen der Server einen geben.