web-dev-qa-db-ja.com

Cassandraの最適なJVM設定

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

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

より多くのメモリを使用するには、CassandraのJVM​​設定を調整する必要がありますか?適切な設定を行うために何を確認する必要がありますか?

9
dvl

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

DataStax Javaリソースの調整 docには、実際にはこれに関するかなり適切なアドバイスがあります。

Cassandraを初めて使用する多くのユーザーは、Javaヒープサイズを大きくしすぎて、基盤となるシステムのRAMの大部分を消費するようになりがちです。ほとんどの場合、Javaヒープサイズを増やすことは、次の理由で実際には有害です。

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

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

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

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

適切な設定を行うために私が見なければならないすべてのものは何ですか?

OpsCenter を実行している場合(そしてそうあるべきです)、「ヒープ使用済み」と「非ヒープ使用済み」のグラフを追加します。

OpsCenter graphing Heap Used and Non Heap Used together

これにより、クラスターのJVMヒープ使用量を簡単に監視できます。私を助けたもう1つのことは、基本的に_cassandra-env.sh_からJVM計算をハイジャックするbashスクリプトを作成することでした。そうすれば、新しいマシンで実行して、_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

また、必ずチェックアウトしてください AmyTobeyの2.1 Cassandraチューニングガイド 。彼女は、クラスターを最適に実行する方法について、いくつかのすばらしいヒントを持っています。

11
Aaron

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
1
mannoj