Meine Frage betrifft das Ausmaß, in dem eine JVM-Anwendung das NUMA-Layout eines Hosts ausnutzen kann.NUMA Bekanntheit von JVM
Ich habe eine Akka-Anwendung, in der Akteure gleichzeitig Anfragen verarbeiten, indem sie eingehende Daten mit "gemeinsamen" Daten kombinieren, die bereits in ein unveränderliches (Scala) -Objekt geladen wurden. Die Anwendung skaliert gut in der Cloud, indem sie viele Dual-Core-VMs verwendet, aber auf einer einzelnen 64-Core-Maschine schlecht abschneidet. Ich nehme an, dies liegt daran, dass das gemeinsame Datenobjekt in einer NUMA-Zelle liegt und viele Threads, auf die gleichzeitig von anderen Zellen zugegriffen wird, zu viel für die Verbindungen sind.
Wenn ich 64 separate JVM-Anwendungen mit jeweils 1 Akteur ausführen, dann ist die Leistung wieder gut. Ein moderaterer Ansatz könnte darin bestehen, so viele JVM-Anwendungen auszuführen, wie NUMA-Zellen vorhanden sind (in meinem Fall 8), was dem Host-Betriebssystem die Möglichkeit gibt, die Threads und den Speicher zusammenzuhalten?
Aber gibt es eine klügere Möglichkeit, denselben Effekt in einer einzelnen JVM zu erzielen? Z.B. Wenn ich mein gemeinsames Datenobjekt durch mehrere Instanzen einer Fallklasse ersetzen würde, hätte die JVM dann die Möglichkeit, sie in der optimalen NUMA-Zelle zu platzieren?
Update:
Ich bin mit Oracle JDK 1.7.0_05 und Akka 2.1.4
Ich habe jetzt versucht, mit der UseNUMA und UseParallelGC JVM-Optionen. Bei einer oder wenigen JVMs schien keiner der beiden Faktoren einen signifikanten Einfluss auf die langsame Performance zu haben. Ich habe auch versucht, einen PinnedDispatcher und den Three-Pool-Executor ohne Wirkung zu verwenden. Ich bin mir nicht sicher, ob die Konfiguration einen Effekt hat, da in den Startprotokollen nichts anderes zu finden ist.
Die größte Verbesserung bleibt, wenn ich eine einzelne JVM pro Arbeiter (~ 50) verwende. Das Problem dabei scheint jedoch zu sein, dass es eine lange Verzögerung (bis zu einigen Minuten) gibt, bevor der Fehlerdetektor den erfolgreichen Austausch des "ersten Herzschlags" zwischen Akka-Cluster-JVMs registriert. Ich vermute, dass es hier ein anderes Problem gibt, das ich noch nicht aufgedeckt habe. Ich musste bereits die ulimit -u erhöhen, da ich die standardmäßige maximale Anzahl von Prozessen (1024) erreichte.
Nur um zu verdeutlichen, versuche ich nicht, eine große Anzahl von Nachrichten zu erreichen, sondern versuche nur, viele separate Akteure gleichzeitig auf ein unveränderliches Objekt zugreifen zu lassen.
Verwenden Sie die Option -XX: + UseNUMA jvm? – cmbaxter
Welche GC-Einstellungen verwenden Sie? Und welche Executor-Konfiguration? –
Sie müssen wahrscheinlich akka sagen, bessere Threading-Muster zu verwenden, sehen Sie hier für einige Mailbox-Konfigurationsoptionen: http://doc.akka.io/docs/akka/snapshot/scala/dispatchers.html – Noah