La mia domanda riguarda la misura in cui un'applicazione JVM può sfruttare il layout NUMA di un host.NUMA awareness di JVM
Ho un'applicazione Akka in cui gli attori contemporaneamente trattino le richieste combinando i dati in ingresso con i dati 'comuni' già caricati in un (Scala) oggetto immutabile. L'applicazione si adatta bene al cloud, utilizzando molte macchine virtuali dual core, ma funziona male su un singolo 64 core. Presumo questo perché l'oggetto dati comune risiede in una cella NUMA e molti thread che accedono contemporaneamente da altre celle è troppo per le interconnessioni.
Se corro 64 applicazioni JVM separati contenenti ciascuno 1 attore quindi prestazioni è è ancora buona. Un approccio più moderato potrebbe essere quello di eseguire tante applicazioni JVM quante sono le celle NUMA (8 nel mio caso), dando al sistema operativo host la possibilità di tenere insieme i thread e la memoria?
Ma c'è un modo più intelligente per ottenere lo stesso effetto all'interno di una singola JVM? Per esempio. se sostituissi il mio oggetto dati comune con diverse istanze di una classe case, la JVM avrebbe la possibilità di posizionarle sulla cella NUMA ottimale?
Aggiornamento:
Sto utilizzando Oracle JDK 1.7.0_05 e Akka 2.1.4
ora ho provato con le opzioni UseNUMA e UseParallelGC JVM. Nessuno dei due sembrava avere un impatto significativo sulle prestazioni lente quando si utilizza una o poche JVM. Ho anche provato a usare un PinnedDispatcher e il thre-pool-executor senza alcun effetto. Non sono sicuro che la configurazione stia avendo un effetto, dal momento che non sembra esserci nulla di diverso nei log di avvio.
Il miglioramento maggiore rimane quando utilizzo una singola JVM per worker (~ 50). Tuttavia, il problema con questo sembra essere che c'è un lungo ritardo (fino a un paio di minuti) prima che FailureDector registri lo scambio riuscito di "primo battito" tra le JVM del cluster Akka. Sospetto che ci sia un altro problema qui che non ho ancora scoperto. Ho già dovuto aumentare l'ulimit -u poiché stavo colpendo il numero massimo predefinito di processi (1024).
tanto per chiarire, non sto cercando di raggiungere un gran numero di messaggi, solo cercando di avere un sacco di attori separati accedere contemporaneamente un oggetto immutabile.
Stai utilizzando l'opzione -XX: + UseNUMA jvm? – cmbaxter
Inoltre, quali impostazioni del GC utilizzi? E quale esecutore config? –
Probabilmente devi dire ad akka di usare migliori schemi di threading, vedi qui per alcune opzioni di configurazione della casella di posta: http://doc.akka.io/docs/akka/snapshot/scala/dispatchers.html – Noah