2009-08-21 7 views
3

Wir merkten gestern ein seltsames Verhalten mit Java/Web Logic auf einem unserer Multi-Prozessor-Server, also wollten Sie Ihre Gedanken darüber zu bekommen.So machen Sie WebLogic alle Prozessoren auf einem Multi-Prozessor-Maschine

Aus irgendeinem Grund verwenden Web Logic/Java nur einen Prozessor der verfügbaren zwei Prozessoren. Wenn wir eine schwere Last liefen, konnte ich sehen, dass die CPU bei einem fast 100% erreichte und der andere Prozessor vollkommen untätig war. Ist es eine virtuelle Maschine (..aber das ist keine virtuelle Maschine)

Interessant ist, dass andere OS-Aktivitäten Prozessoraktivität auf beiden anzeigen.

Grüße, _UB

+0

Was meinen Sie durch schwere Last? Haben Sie den Server mit gleichzeitigen Anfragen erreicht? – Kaitsu

+0

ja ... Lasttests ausführen, um schwere Lasten zu simulieren. –

+0

Haben Sie dieses Verhalten nur auf einem Ihrer Server und nicht auf den anderen Servern gesehen? – Kaitsu

Antwort

2

In üblichen Szenarien sollte WebLogic (und damit Java) in der Lage sein, alle verfügbaren Prozessoren auf dem Server zu verwenden, auf dem es ausgeführt wird. WebLogic verfügt über einen Pool von Anforderungsverarbeitungsthreads. Wenn Anforderungen gleichzeitig eingehen, werden sie gleichzeitig verarbeitet. Wenn der Server mehrere Prozessoren hat, sollten diese von Java-Threads verwendet werden.

Wenn die in WebLogic ausgeführte Java-Webanwendung in ihren Servlets SingleThreadModel verwendet, können zwei Threads das Servlet nicht gleichzeitig ausführen, sodass nur eine CPU bei der Arbeit angezeigt wird. Dieses Modell ist nicht zu empfehlen und ich schätze sowieso nicht viel.

Ich habe gehört, dass einige Leute sich beschweren, dass sie ihre Java-App-Server nicht dazu bringen können, mehr als 1 CPU zu verwenden, wenn sie ein virtuelles Maschinenbetriebssystem wie VMWare betreiben, selbst wenn sie mehr als eine CPU für die VM reserviert haben. Ich habe keine Ahnung, was der Grund für dieses merkwürdige Verhalten dann war.

Vielleicht sollten Sie versuchen, einige sehr einfache JSP-Seite mit gleichzeitigen Anfragen zu treffen und sehen, ob mehr als 1 CPU verwendet wird. Wenn das funktioniert, liegt das Problem in Ihrer Anwendung.

+0

"Ich habe gehört, dass einige Leute sich beschweren, dass sie ihre Java - Anwendungsserver nicht dazu bringen können, mehr als 1 CPU zu verwenden, wenn sie ein virtuelles Maschinenbetriebssystem wie VMWare betreiben Idee was war der Grund für dieses seltsame Verhalten dann. " - irgendwie wie das Original Poster, oder? Das nennen Sie eine hilfreiche Antwort? Bitte. – duffymo

+0

@duffymo: Nun, der Teil, den Sie aus meiner Antwort zitierten, war nur eine Ergänzung zu der eigentlichen Antwort, die zumindest etwas Konkretes zu Ihrem Vorschlag enthielt, mit dem Lesen von WebLogic-Dokumenten zum Start von WL-Clustering zu beginnen. Das ist wie eine Fliege mit einer großen Kanone zu schießen, wenn das Problem nur darin besteht, eine Anwendung zu bekommen, die mit mehreren Prozessoren läuft, was übrigens in Java-Webanwendungen sehr üblich ist. Frieden. – Kaitsu

+0

@Kaitsu, BEA stimmt nicht mit Ihnen überein, und die Daten des Fragestellers sagen, dass Ihr Weg nicht funktioniert. Das ist der ganze Grund für die Frage. Sie bestehen darauf, dass es einfach funktioniert, und dass die Anwendung, die Sie nicht gesehen haben, fehlerhaft ist, aber die Daten Ihre Sicht nicht unterstützen. Ich verstehe vollständig, dass Java Web Apps Multi-Threading sind; keine Meinungsverschiedenheit dort. Aber es ist eine JVM pro CPU für WebLogic und JBOSS und andere Java EE App-Server, die ich verwende. Ich glaube, es ist mehr als Multi-Threading. Es ist ein gemeinsamer Status für Stateful EJBs, Sessions, Load Balancing, usw. – duffymo

1

Die WebLogic-Dokumentation geben Ratschläge zum how to configure for multi-processor machines. Sie würden mit einer Clusterumgebung enden.

+0

Ach komm schon, du musst keine Clusterumgebung konfigurieren, um mehrere Prozessoren in einer Java-Anwendung verwenden zu können! Alle Java-Anwendungsserver verarbeiten standardmäßig die Anforderungsverarbeitung mit gleichzeitigen Threads. Um dies zu umgehen, verwenden Sie entweder ein Single-Thread-Servlet-Modell (eine Entwicklerentscheidung, wenn auch meistens eine schlechte) oder begrenzen Sie die Request-Verarbeitung auf 1 (= lächerlich). – Kaitsu

+0

Kein Hinweis auf Single-Thread-Modell, also gehe ich davon aus, dass der Fragesteller nicht so dumm war, so zu gehen. Da die WebLogic-Dokumentation selbst auf die spezielle Handhabung von Multi-Prozessor-Maschinen verweist, die ursprüngliche Frage, dass Multi-Prozessoren nicht sofort verwendet werden und Multi-Threads nicht mit Multi-Prozessoren identisch sind, werde ich auf dem Laufenden bleiben meine ursprüngliche Antwort, bis bessere Informationen kommen. – duffymo

+0

@duffymo: Sorry, wenn mein Kommentar unhöflich klang. Ich wollte nur klarstellen. :) – Kaitsu

0

Führen Sie dieses Java-Programm zu testen, ob Java Vorteil aller verfügbaren CPUs (8 in meinem Fall) hat:

public class MultiThreadCPUEater implements Runnable { 
    public static void main(String[] args) { 
     for (int i = 0; i < 8; i++) { 
      MultiThreadCPUEater multiThreadCPUEater = new MultiThreadCPUEater(); 
      Thread thread = new Thread(multiThreadCPUEater); 
      thread.start(); 
     } 
    } 

    @Override 
    public void run() { 
     for (;;) { 
     } 
    } 
}