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.
Ich weiß nicht, aber Android teilen RAM bereits zwischen Prozessen, ich weiß nicht, ob das verwandt ist, aber es könnte sein :) – niceman
Sie können Beagle mit seinen Befehlszeilenoptionen (nthreads) steuern. Überraschung: Das Lesen der Dokumente einer von Ihnen verwendeten Software hilft. – Durandal
@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. –