2015-05-13 14 views
7

Ho un cluster a 4 nodi con 16 core CPU e 100 GB RAM su ciascun box (2 nodi su ciascun rack).Impostazioni JVM ottimali per Cassandra

A partire da ora, tutti sono in esecuzione con le impostazioni JVM predefinite di Cassandra (v2.1.4). Con questa impostazione, ogni nodo utilizza 13 GB di RAM e il 30% di CPU. È un cluster di scrittura pesante con eliminazioni o aggiornamenti occasionali.

Devo regolare le impostazioni JVM di Cassandra per utilizzare più memoria? Quali sono le cose che dovrei guardare per definire le impostazioni appropriate?

risposta

10

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".

OpsCenter graphing Heap Used and Non Heap Used together

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.

0

system_cpu_cores non è impostato correttamente. Modificato quello giusto da eseguire.

#!/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` 
system_cpu_cores=`cat /proc/cpuinfo | grep -i processor | wc -l` 
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 
Problemi correlati