2016-06-30 22 views
0

Ich führe bestehende Programme in Java oder Scala geschrieben. Diese Programme werden von verschiedenen Autoren geschrieben und dienen sehr unterschiedlichen Zwecken, so dass es nicht möglich ist, sie in ein Megaprogramm zu integrieren. Wenn eines dieser Java-Programme auf einem Knoten mit vielen Kernen (z. B. 32) und viel RAM (z. B. 200G) gestartet wird, versucht jeder so viele Ressourcen wie möglich zu beanspruchen, bis der Knoten zum Stillstand kommt und keine sinnvolle Berechnung mehr möglich ist wird erledigt. Wenn Sie beispielsweise 32 Instanzen von Beagle auf verschiedenen Datensätzen ausführen, führt dies zu 32 jvms, die jeweils versuchen, 32 Kerne und den größten Teil des Speichers zu verwenden. (Beagle ist nicht für die explizite Multithreading mit nthreads=1 als Standard konfiguriert.)Kann jvm so konfiguriert werden, dass es rücksichtsvoll ist und Rechenressourcen (CPU und RAM) mit anderen Prozessen teilt?

So wie kann ich Jvm konfigurieren mehr wie ein traditionelles Programm verhalten, dass nur so viel Speicher und CPU verwendet, wie es wirklich braucht ...

Ich kenne die folgenden Flags, aber gibt es noch andere Flags?

Kann der jvm wirklich single-threaded sein?

Außerdem versuchen ziemlich leichte Java-Programme, mindestens 30G RAM auf einem Knoten mit 200G RAM zu verwenden, wenn sie wirklich nur < 1G RAM benötigen. Ich setze -Xmx1G und diese Programme liefen ohne Fehler oder merkliche Leistungsverschlechterung; Tatsächlich war die Startzeit viel schneller.

Gibt es eine elegantere Lösung, als eine harte obere Speichergrenze festzulegen? Wenn ich -Xmx zu niedrig setze, stürzt das Programm ab. Wenn ich es zu hoch setze, werden Ressourcen verschwendet. Wenn ich mit Programmen arbeite, die in C++ geschrieben sind und von sorgfältigen Autoren geschrieben wurden, muss ich diese Dinge nicht optimieren. Die C++ - Programmspeicherbelegung skaliert normalerweise vorhersehbar mit der Eingabedatengröße.

Warum kann jvm nicht so viel verwenden, wie es standardmäßig benötigt wird?

Gibt es außer nice und ulimit bessere Lösungen?

nice +10 java kann Probleme verursachen, wenn neue Prozesse kontinuierlich mit höherer Priorität gestartet werden. ulimit java kann dazu führen, dass jvm Passungen wirft.

Ich arbeite in einer Umgebung ohne Root-Zugriff. Ich arbeite nicht auf einem Linux-Server und nicht auf Android.

+0

Ich weiß nicht, aber Android teilen RAM bereits zwischen Prozessen, ich weiß nicht, ob das verwandt ist, aber es könnte sein :) – niceman

+0

Sie können Beagle mit seinen Befehlszeilenoptionen (nthreads) steuern. Überraschung: Das Lesen der Dokumente einer von Ihnen verwendeten Software hilft. – Durandal

+0

@Durandal Beagles 'nthread' Standard ist 1, daher sollte es standardmäßig in Single-Thread laufen. Tatsächlich unterstützte die Version von Beagle, die ich verwendete, Multithreading nicht. Ich kontaktierte den Autor über Beagle, der alle Kerne übernahm, und er behält die Version von Beagle bei, die ich verwendete, war streng single-threaded. Wichtig ist, dass ich Beagle nur als Beispiel benutzt habe. Andere Programme können> 100% CPU-Auslastung haben, wahrscheinlich aufgrund von Multithread-Speicherbereinigung. Teil der Frage ist, ob jvm Multithread während anderer Aufgaben und wie man es deaktiviert. –

Antwort

1

-XX:-UseSerialGC

dass seriellen GC deaktiviert, das ist das Gegenteil von dem, was Sie wollen.

Ich arbeite in einer Umgebung ohne Root-Zugriff.

Wenn der Kernel mit Benutzernamensraum erstellt ist, können Sie unshare verwenden, um einen neuen Benutzernamespace eingeben und dann verwenden cgroups in diesem Namespace-Ressourcen zu begrenzen.

+0

Laut http://www.oracle.com/technetwork/articles/java/vmoptions-jsp-140102.html verwendet '-XX: -UseSerialGC' die serielle Speicherbereinigung. –

+0

Die 'cgroups' Option ist interessant (obwohl ich ziemlich sicher bin, dass wir einen Aktien-Kernel verwenden). Ist es praktisch anders als "ulimit"? –

+1

Die Tabelle beschreibt nur die Optionen, ob die Option ein- und ausgeschaltet wird, wird durch +/- bestimmt. es ist in der Prosa über der Tabelle erwähnt: * "Boolesche Optionen sind eingeschaltet mit -XX: +

1

Kann der jvm wirklich single-threaded sein?

Nein, wenn es gleichzeitig ausgeführt werden kann. Sie können das Taskset verwenden, um die JCVM auf nur ein CPU-Byte zu begrenzen, da dies ziemlich schlecht ist, wenn Sie dies tun, da es mehr als eine CPU benötigt.

Gibt es eine elegantere Lösung, als eine harte obere Speichergrenze festzulegen?

Ich würde versuchen zu bestimmen, was Sie damit meinen.

Warum kann jvm nicht so viel verwenden, wie es tatsächlich benötigt?

Es verwendet so viel CPU und Speicher wie es benötigt.

schön +10 Java kann in Schwierigkeiten geraten, wenn neue Prozesse kontinuierlich

neue JVMs starten kann weit mehr Aufwand als Nutzen schaffen ins Leben gerufen werden. Ich würde JVMs so wenig wie möglich starten, wenn Sie CPU sparen möchten.