Kann ich die Anzahl der für die Java VM verfügbaren Threads / CPUs festlegen?

9

Ich möchte die Anzahl der für die Java-VM verfügbaren Threads / Prozesse begrenzen, ähnlich wie Sie den verfügbaren Speicher einstellen. Ich möchte in der Lage sein, es zu spezifizieren, um nur 1 Faden oder eine willkürliche Zahl zu benutzen.

HINWEIS: Ich kann es nicht im Code festlegen, da der Code, den ich beschränken möchte, eine Bibliothek ist, in der ich die Quelle nicht ändern kann. Es muss also eine harte Kappe sein, die dem Level der virtuellen Maschine auferlegt wird. (Oder wenn Sie der Anwendung selbst ein Thread-Limit auferlegen könnten, das Bibliotheken überschreiben könnte?)

HINWEIS2: Der Zweck ist ein Leistungstest, um eine Bibliothek, die ich testen möchte, zu drosseln, um zu sehen, wie gut sie funktionieren würde, wenn sie Zugriff auf eine andere Anzahl von CPUs / Threads hat.

Danke!

    
Martin K 15.11.2015, 18:32
quelle

4 Antworten

2

Es gibt kein VM-Flag oder eine Eigenschaft, um die Anzahl der für Java verfügbaren CPUs zu steuern, d. h. welche Runtime.availableProcessors() zurückgibt.

Wenn Sie unter Windows und Solaris die Prozess-Affinitätsmaske festlegen, wirkt sich dies auch auf Runtime.availableProcessors() aus. Unter Linux funktioniert das jedoch nicht, siehe JDK-6515172 . Leider ist das Update nur für Java 10 gedacht, aber der vorgeschlagene Patch ist in der Fehlerdiskussion enthalten.

Es gibt auch eine Arbeit für Linux mit LD_PRELOAD Patch oder einem OS-Level-Trick, siehe Details in diese Frage .

    
apangin 16.11.2015 14:41
quelle
1

Wenn Sie Linux benutzen, wickeln Sie einfach den java Launcher in ein numactl / taskset Befehl. Dadurch kann die JVM eine beliebige Anzahl von Threads generieren, die jedoch auf einer bestimmten Anzahl physischer Kerne verteilt werden.

Ähnliche Tools sind auch für andere Betriebssysteme verfügbar.

    
the8472 16.11.2015 14:57
quelle
1

Ich schlage vor, Sie könnten Ihren eigenen SecurityManager implementieren und installieren, der die Anzahl der erstellten Threads verfolgt und einen Fehler auslöst, wenn das Maximum erreicht ist.

Gemäß der akzeptierten Antwort auf Diese Frage , ein RuntimePermission mit dem Ziel "modifyThreadGroup" wird jedes Mal überprüft, wenn ein neuer Thread erstellt / gestartet wird.

Aktualisieren

Ein erster Ansatz des SecurityManagers könnte so aussehen:

%Vor%

Natürlich müssen weitere Tests durchgeführt werden, um zu gewährleisten, dass Systemthreads immer erlaubt sind. Und bleiben Sie, dass dieser Algorithmus die Zählung nicht verringert, wenn ein Thread endet.

    
Little Santi 15.11.2015 19:01
quelle
0

Als letzten Ausweg könnte ich die Affinität der Java-VM im Task-Manager so einstellen, dass nur 1 (oder mehr) CPUs verwendet werden. (Dies wird natürlich immer noch mehrere Threads auf 1 CPU erlauben, aber es ist wahrscheinlich das Nächste, was ich wollte, wenn niemand bessere Ideen hat)

    
Martin K 15.11.2015 19:00
quelle

Tags und Links