Devo regolare le impostazioni JVM di Cassandra per utilizzare più memoria?
Il dottore DataStax Tuning Java Resources ha effettivamente qualche consiglio abbastanza suono su questo:
Molti utenti nuovo a Cassandra sono tentati di alzare Java dimensione heap troppo alto, che consuma la maggior parte del sistema sottostante del RAM. Nella maggior parte dei casi , aumentando la dimensione heap Java è in realtà dannosa per queste ragioni:
- Nella maggior parte dei casi, la capacità di Java per gestire correttamente la raccolta dei rifiuti sopra 8GB diminuisce rapidamente.
- I sistemi operativi moderni mantengono la cache della pagina del sistema operativo per i dati a cui si accede frequentemente e sono molto efficaci nella conservazione di questi dati, ma può essere impedito dal lavoro da una dimensione heap Java elevata.
Se si dispone di più di 2 GB di memoria di sistema , che è tipico, mantenere la dimensione del heap Java relativamente piccolo per consentire più memoria per la cache di pagina.
Dato che si dispone di 100 GB di RAM sulle macchine, (se si sta effettivamente utilizzando le "impostazioni JVM predefinite") la dimensione massima dell'heap JVM deve essere limitata a 8192 M. E in realtà, non vorrei deviare da quello che a meno che non si verifichino problemi con la garbage collection.
Le risorse JVM per Cassandra possono essere impostate nel file cassandra-env.sh
. Se sei curioso, guarda il codice per cassandra-env.sh
e cerca il metodo calculate_heap_sizes()
. Questo dovrebbe darti un'idea di come Cassandra calcola le tue impostazioni JVM predefinite.
Quali cose dovrei osservare per configurare le impostazioni appropriate?
Se si esegue OpsCenter (e si dovrebbe essere), aggiungere un grafico per "Heap utilizzato" e "Non heap utilizzato".
Questo vi permetterà di monitorare facilmente l'utilizzo di heap JVM per il cluster. Un'altra cosa che mi ha aiutato, è stato scrivere un copione bash in cui ho praticamente dirottato i calcoli JVM da cassandra-env.sh
.In questo modo posso eseguirlo su una nuova macchina, e sapere subito qual è il mio MAX_HEAP_SIZE
e HEAP_NEWSIZE
stanno per essere:
#!/bin/bash
clear
echo "This is how Cassandra will determine its default Heap and GC Generation sizes."
system_memory_in_mb=`free -m | awk '/Mem:/ {print $2}'`
half_system_memory_in_mb=`expr $system_memory_in_mb/2`
quarter_system_memory_in_mb=`expr $half_system_memory_in_mb/2`
echo " memory = $system_memory_in_mb"
echo " half = $half_system_memory_in_mb"
echo " quarter = $quarter_system_memory_in_mb"
echo "cpu cores = "`egrep -c 'processor([[:space:]]+):.*' /proc/cpuinfo`
#cassandra-env logic duped here
#this should help you to see how much memory is being allocated
#to the JVM
if [ "$half_system_memory_in_mb" -gt "1024" ]
then
half_system_memory_in_mb="1024"
fi
if [ "$quarter_system_memory_in_mb" -gt "8192" ]
then
quarter_system_memory_in_mb="8192"
fi
if [ "$half_system_memory_in_mb" -gt "$quarter_system_memory_in_mb" ]
then
max_heap_size_in_mb="$half_system_memory_in_mb"
else
max_heap_size_in_mb="$quarter_system_memory_in_mb"
fi
MAX_HEAP_SIZE="${max_heap_size_in_mb}M"
# Young gen: min(max_sensible_per_modern_cpu_core * num_cores, 1/4 * heap size)
max_sensible_yg_per_core_in_mb="100"
max_sensible_yg_in_mb=`expr ($max_sensible_yg_per_core_in_mb * $system_cpu_cores)`
desired_yg_in_mb=`expr $max_heap_size_in_mb/4`
if [ "$desired_yg_in_mb" -gt "$max_sensible_yg_in_mb" ]
then
HEAP_NEWSIZE="${max_sensible_yg_in_mb}M"
else
HEAP_NEWSIZE="${desired_yg_in_mb}M"
fi
echo "Max heap size = " $MAX_HEAP_SIZE
echo " New gen size = " $HEAP_NEWSIZE
Aggiornamento 20.160.212:
Inoltre, essere sicuri di check-out Al Tobey's 2.1 Cassandra Tuning Guide . Ha alcuni ottimi consigli su come far funzionare il tuo cluster in modo ottimale.