Einstellung von Java für die Verwendung einer CPU

8

Ich habe eine Anwendung, die eine Lizenz für eine bestimmte Anzahl von CPUs hat und ich möchte die Anzahl der CPUs, in denen Java läuft, auf 1 setzen, bevor die Überprüfung abgeschlossen ist. Ich betreibe Solaris und habe auf pbind geschaut, aber ich dachte, wenn ich die Anwendung gestartet und dann pbind benutzt hätte, hätte sie die Lizenz geprüft, bevor sie die Anzahl der CPUs eingestellt hätte, die Java benutzen könnte.

Kennt jemand eine Möglichkeit, eine Anwendung mit einer bestimmten Anzahl von CPUs unter Solaris zu starten?

    
Henry B 27.05.2009, 08:29
quelle

4 Antworten

3

Es ist eine Umgehungslösung, aber mit Solaris 10 können Sie eine Zone mit einer einzigen verfügbaren CPU einrichten und dann die Anwendung innerhalb dieser Zone ausführen.

Wenn Sie Tests durchführen möchten, ohne die vollständige Anwendung auszuführen, ist dieses Java-Bit höchstwahrscheinlich das, was sie verwenden, um die Anzahl der CPUs zu erhalten:

%Vor%

Ein vollständiges Beispiel hier .

    
Andre Miller 27.05.2009 08:47
quelle
1

Dies ist keine vollständige Lösung, aber könnte genug sein, um sich zu einer zu entwickeln. Es gibt definitiv einen Punkt, an dem der java -Prozess existiert (und somit von pbind kontrolliert werden kann) und zu diesem Zeitpunkt hat er noch nicht den Code ausgeführt, um die Prozessorprüfung durchzuführen. Wenn Sie den Start der Anwendung selbst anhalten könnten, bis pbind seine Arbeit erledigt hat, sollte dies in Ordnung sein (vorausgesetzt, dass die pbind-Idee aus Sicht der CPU-Überprüfung funktioniert).

Eine Möglichkeit, die JVM an einer geeigneten Stelle anzuhalten, ist der Socket-Anschluss für Remote-Debugger und der Start mit dem Suspend-Modus. Wenn Sie die folgenden Argumente an den Aufruf java übergeben:

  

-Xdebug -Xrunjdwp: Transport = dt_socket, Adresse = 8000, Suspend = y, Server = y

Dann wird die JVM nach dem Start des Java-Prozesses, aber vor der Ausführung der Hauptklasse angehalten, bis ein Debugger / Agent an Port 8000 angeschlossen ist.

Vielleicht wäre es also möglich, ein Wrapper-Skript zu verwenden, um das Programm im Hintergrund mit diesen Parametern zu starten, für eine Sekunde zu schlafen, pbind zu verwenden, um die Anzahl der Prozessoren für den Java-Prozess auf eins zu setzen und dann anzuhängen und Trennen Sie einen Agenten von Port 8000 (was ausreichen wird, damit Java mit der Ausführung fortfahren kann).

Fehler oder potentielle Schwachstellen in dieser Idee wären, ob das Ausführen im Debug-Modus die Leistung Ihrer App beeinträchtigen würde (es scheint im Allgemeinen keine großen Auswirkungen zu haben), ob Sie eine Art von no-op JDWP steuern können Agent über die Befehlszeile und ob Sie Ports auf dem Computer öffnen können. Es ist nicht etwas, das ich zuvor zu automatisieren versucht habe (obwohl ich etwas weitgehend Ähnliches manuell verwendet habe, um die nice ness eines Java-Prozesses zu erhöhen, bevor es losgelassen wurde), also könnte es andere Probleme geben, die ich übersehen habe .

    
Andrzej Doyle 27.05.2009 09:49
quelle
1

Ich denke, die direkteste Antwort auf Ihre Frage ist, pbind zu verwenden, um den laufenden Shell-Prozess zu binden und dann Java von dieser Shell aus zu starten. Laut der Manpage werden die Effekte von pbind von Prozessen geerbt, die aus einem gebundenen Prozess entstehen. Versuchen Sie Folgendes:

%Vor%     
Chris Quenelle 27.05.2009 17:35
quelle
-1

Beim googeln fand ich, dass Sie Recht haben, pbind bindet Prozesse an Prozessoren.

Weitere Informationen und Beispiele unter: Ссылка

    
ATorras 27.05.2009 08:39
quelle

Tags und Links