Normalerweise wird es dem Betriebssystem überlassen, zu entscheiden, welche Prozessoren oder Prozessorkerne der Maschine genutzt werden, um eine Anwendung auszuführen. Abhängig von der Zahl der Threads, die von einer Anwendung zu einer bestimmten Zeit genutzt werden, und den Anforderungen anderer Anwendungen, wird das Betriebssystem versuchen, Threads so häufig wie notwendig herumzuverteilen, um die Gesamtlast auf jeden Prozessor ausgeglichen zu halten. Wenn es mehr Threads als Prozessoren gibt (was der Normalfall ist), wird das Betriebssystem Prozessoren unter mehreren Threads verteilen, das bedeutet, dass Threads warten müssen bis sie an der Reihe sind. Für ein paar Anwendungen wird diese Methode nicht ausreichend sein, und es kann nützlich sein, bestimmte Prozessoren oder Gruppe von Prozessoren für bestimmte Anwendungen zu reservieren. Die meisten Betriebssystemplattformen bieten die Fähigkeit an, festzulegen, dass ein Prozess nur auf spezifischen Prozessoren ausgeführt werden soll. Dies wird gewöhnlich mit CPU-Affinity oder CPU-Pinning bezeichnet.
Das Zuweisen von spezifischen Prozessoren zu Ihrer Anwendung kann eine Möglichkeit sein, sicherzustellen, dass stets genügend Prozessorressourcen verfügbar sind. Im Gegenteil sollten Sie explizit einige Prozessoren ungenutzt lassen, um sicherzustellen, dass genügend Ressourcen für andere Prozesse die auf der gleichen Maschine laufen, zur Verfügung stehen. Festlegen der CPU-Affinity kann auch wesentlich zur Optimierung des CPU-Caches beitragen. In anderen Worten, wann immer ein Prozess den Prozessor verändert, werden dessen Daten von einem Prozessor zu einem anderen Prozessor übertragen. Diese Übertragung ist kostenintensiv, aber Sie können dies durch Bindung des Prozesses an eine beschränkte Anzahl von Prozessoren minimieren. Sie sollten jedoch umsichtig vorgehen, für Ihre Anwendung genügend Prozessoren zulassen, da diese die Fähigkeit haben mag, Tasks parallel auf verschiedenen Prozessoren, sofern verfügbar, auszuführen.
Unglücklicherweise stellt Java nicht die Möglichkeit zur Verfügung, die JVM mit Core- oder Processor-Affinity zu starten. Sollten Sie Interesse haben, Ihre Java-Anwendung an spezifische Prozessoren zu binden, würden Sie entweder Befehle wie procaff, taskset oder invoke native code benutzen. Diese Lösungen sind plattformspezifisch.
Lösung |
Die Java Service Wrapper Professional Edition behandelt dieses Problem, indem diese einen einheitlichen und einfachen Weg anbietet, um CPU-Affinity zu konfigurieren - ohne Programmieraufwand. Laut Version 3.5.27 werden nur Windows und Linux unterstützt, aber zusätzliche Plattformunterstützung ist in naher Zukunft geplant. Die Konfiguration kann sich auf den Wrapper-Prozess wie auf den von ihm kontrollierten JVM-Prozess beziehen. Jeder hat seine eigenen Eigenschaften, um Prozessor-Affinität zu konfigurieren. Aber wenn Sie nur die des Wrappers bestimmen, wird der überwachte JVM-Prozess standardmäßig die gleiche Konfiguration erben und automatisch unter Nutzung der gleichen Prozessoren wie der Wrapper-Prozess ausgeführt. |
Technische Übersicht |
||||||||||||||||||||||||||
|