Java Memory Bedarf auf Rechencluster
lima-city → Forum → Programmiersprachen → Java
anhaltspunkt
cluster
code
dritten durchlauf
instanz
job
komponente
limit
machen
maschine
parallel laufen
ressource
sekunde
starten
tool
verschiedenen parametern
verschiedenen schritten
versuchen
virtuellen speicher
zugewiesenen speicher
-
Hallo,
ich versuche gerade ein Java Tool parallelisiert auf einem Rechencluster auszuführen. Der Cluster ist über OpenCCS organisiert.
Mein Aufbau: Ich alloziere ein C++ Tool, dass nachweislich auf dem Cluster funktioniert (nur nicht in Verbindung mit meiner .jar). Dieses Tool bekommt von mir pro RessourceSet (Chunk) 12ncpus und 35gb RAM, das entspricht den Ressourcen einer Maschine im Cluster. Das C++ Tool führt dann parallel (eben 12x) jeweils das Java Tool aus. Auf einer Maschine sollte das gleiche Java-Tool (mit unterschiedlichen Parametern) 12x parallel laufen. Das funktioniert auch - ganze 10 Sekunden lang. In dieser Zeit ist der Ablauf schon zwei mal durchgelaufen und lt. Log so ca. mitten im dritten Durchlauf (d.h. das jar script ist schon 2x auf 12cpus parallel gelaufen). Dann bekomme ich einen VMEM error:
Reduziere ich den zugewiesenen Speicher bleibt der Fehler, nur das limit ist entsprechend kleiner.Killing the job: vmem usage 136795712k exceeded limit 73400320k on host
Ich habe auch schon versucht, die .jar mit -Xmx<size>m in verschiedenen Schritten von 1024 bis 16m zu begrenzen - mit gleichem Ergebnis.
Wenn ich die jar lokal auf meinem Notebook ausführe, dann benötigt sie (sofern ich das bei ca. 2sek Ausführungszeit im Task Manager erkennen kann) nicht ca. 30 MB RAM. Wie ein derart hoher Speicherbedarf entsteht, kann ich mir nicht erklären.
Hat jemand von euch eine Idee?
Viele Grüße,
Henning -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Wenn du den Heap mit -Xmx begrenzt, dann begrenzt du damit nur den Heap. Die VM hat aber Overhead, den du zusätzlich noch berücksichtigen musst. Du könntest auch versuchen, den gesamten Heap von Anfang an anzufordern (-Xms müsste das sein), und schauen, ob es dann läuft. In dem Fall geht es wohl um virtuellen Speicher, aber keine Ahnung, warum die VM so viel anfordert.
Unabhängig davon: warum musst du überhaupt separate VMs starten? Kann das nicht innerhalb einer VM laufen (= 1x JAR starten, und das JAR startet dann mehrere Threads)? -
Hi,
auch mit -Xms funktioniert es nicht, nicht einmal wenn ich 27g anfordere. Wenn ich die jar auf meinem Notebook mehrfach ausführe macht sich das im RAM kaum bemerkbar. Ich wundere mich also, woher der Speicherbedarf kommt...
und zu 2.: Ich kann nur an der Java Komponente Änderungen vornehmen. Das andere Tool ist nun mal so gebaut, dass es die andere Komponente mehrfach ausführt, dabei wird jedes mal mit verschiedenen Parametern ausgeführt. Dann wird auf die Rückgabe der jar unter gegebenen Parametern gewartet. -
Hallo,
ich stelle mir gerade die Frage, ob es wirklich eine Instanz Deines JARs ist, welche den Speicher in die Höhe treibt. Lass Dir doch mal in Dein Logging permanent die aktuelle Speicherauslastung des Tools und der VM ausgeben:
Runtime rt = Runtime.getRuntime(); long total = rt.totalMemory(); long max = rt.maxMemory(); long free = rt.freeMemory();
Vielleicht gibt das einen Anhaltspunkt ob es wirklich am Speicherhunger der Java Anwendung liegt.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage