10

各ボックスに 16 コア CPU と 100 GB RAM (各ラックに 2 ノード) を備えた 4 ノード クラスターがあります。

現在のところ、すべて Cassandra (v2.1.4) のデフォルトの JVM 設定で実行されています。この設定では、各ノードは 13GB の RAM と 30% の CPU を使用します。これは、時折削除または更新される書き込み負荷の高いクラスターです。

Cassandra の JVM 設定を調整して、より多くのメモリを使用する必要がありますか? 適切な設定を行うには、どのような点に注意すればよいですか?

4

2 に答える 2

12

Cassandra の JVM 設定を調整して、より多くのメモリを使用する必要がありますか?

DataStax Tuning Java Resources doc には、実際にこれに関する非常に適切なアドバイスがあります。

Cassandra を初めて使用するユーザーの多くは、Java ヒープ サイズを大きくしすぎて、基盤となるシステムの RAM の大部分を消費してしまいます。ほとんどの場合、Java ヒープ サイズを大きくすると、実際には次の理由で悪影響を及ぼします。

  • ほとんどの場合、8 GB を超えるガベージ コレクションを適切に処理する Java の機能はすぐに低下します。
  • 最新のオペレーティング システムは、頻繁にアクセスされるデータの OS ページ キャッシュを維持し、このデータをメモリ内に保持するのに非常に優れていますが、Java ヒープ サイズを大きくすると、その機能を実行できなくなる可能性があります。

通常、システム メモリが 2GB を超える場合は、Java ヒープのサイズを比較的小さくして、ページ キャッシュ用のメモリを増やすことができます。

マシンに 100GB の RAM があるため (実際に「デフォルトの JVM 設定」で実行している場合)、JVM の最大ヒープ サイズは 8192M に制限する必要があります。そして実際には、ガベージ コレクションで問題が発生していない限り、それから逸脱することはありません。

Cassandra の JVM リソースをcassandra-env.shファイルに設定できます。興味がある場合は、コードをcassandra-env.sh見てcalculate_heap_sizes()メソッドを探してください。これにより、Cassandra がデフォルトの JVM 設定をどのように計算するかについての洞察が得られるはずです。

適切な設定を行うには、どのような点に注意すればよいですか?

OpsCenterを実行している場合(実行する必要があります)、「Heap Used」と「Non Heap Used」のグラフを追加します。

OpsCenter のグラフ化 Heap Used と Non Heap Used の併用

これにより、クラスターの JVM ヒープの使用状況を簡単に監視できます。私を助けたもう 1 つのことは、基本的に .NET から JVM 計算をハイジャックする bash スクリプトを作成したことcassandra-env.shです。MAX_HEAP_SIZEそうすれば、新しいマシンで実行でき、自分のとHEAP_NEWSIZEがどうなるかをすぐに知ることができます。

#!/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

更新 20160212 :

また、 Amy Tobey の 2.1 Cassandra Tuning Guideも必ずチェックしてください。彼女は、クラスターを最適に実行する方法についていくつかの素晴らしいヒントを提供しています。

于 2015-05-13T13:13:03.760 に答える
1

system_cpu_cores が正しく設定されていません。実行する権利を編集しました。

#!/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
于 2016-09-25T20:39:14.957 に答える