Cassandraが起動しないとき

Pocket

マシン
HP Proliant ML115サーバー
搭載メモリ
7GB(1GB + 2GBx3)
OS
Ubuntu11.04
Apache Cassandra
0.7.5

起動しようとすると以下のようなエラーが出てサーバーが立ち上がりません。

$ bin/cassandra -f
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

ネットブック上のUbuntu11.04では起動したのに、バグかと思いました。

bin/cassandraを調べてみる

bin/cassandraを調べてみると121行目あたりにJavaVMを起動する部分があったのでどんなコマンドを発行しているのかちょっといじって確認してみました。

 # The cassandra-foreground option will tell CassandraDaemon not
 # to close stdout/stderr, but it's up to us not to background.
if [ "x$foreground" != "x" ]; then
cassandra_parms="$cassandra_parms -Dcassandra-foreground=yes"
 # [debug] ここに注目
exec $JAVA $JVM_OPTS $cassandra_parms -cp $CLASSPATH $props $class
 # Startup CassandraDaemon, background it, and write the pid.
else
exec $JAVA $JVM_OPTS $cassandra_parms -cp $CLASSPATH $props $class <&- &
[ ! -z $pidpath ] && printf "%d" $! > $pidpath
fi
出力結果

なんじゃこりゃーって感じですね。

/usr/bin/java -ea -XX:+UseThreadPriorities -XX:ThreadPriorityPolicy=42 -Xms3525M -Xmx3525M -Xmn100M -XX:+HeapDumpOnOutOfMemoryError -Xss128k -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=1 -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -Djava.net.preferIPv4Stack=true -Dcom.sun.management.jmxremote.port=8080 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dlog4j.configuration=log4j-server.properties -Dlog4j.defaultInitOverride=true -Dcassandra-foreground=yes -cp bin/../conf:bin/../build/classes:bin/../lib/antlr-3.1.3.jar:bin/../lib/apache-cassandra-0.7.5.jar:bin/../lib/avro-1.4.0-fixes.jar:bin/../lib/avro-1.4.0-sources-fixes.jar:bin/../lib/commons-cli-1.1.jar:bin/../lib/commons-codec-1.2.jar:bin/../lib/commons-collections-3.2.1.jar:bin/../lib/commons-lang-2.4.jar:bin/../lib/concurrentlinkedhashmap-lru-1.1.jar:bin/../lib/guava-r05.jar:bin/../lib/high-scale-lib.jar:bin/../lib/jackson-core-asl-1.4.0.jar:bin/../lib/jackson-mapper-asl-1.4.0.jar:bin/../lib/jetty-6.1.21.jar:bin/../lib/jetty-util-6.1.21.jar:bin/../lib/jline-0.9.94.jar:bin/../lib/json-simple-1.1.jar:bin/../lib/jug-2.0.0.jar:bin/../lib/libthrift-0.5.jar:bin/../lib/log4j-1.2.16.jar:bin/../lib/servlet-api-2.5-20081211.jar:bin/../lib/slf4j-api-1.6.1.jar:bin/../lib/slf4j-log4j12-1.6.1.jar:bin/../lib/snakeyaml-1.6.jar org.apache.cassandra.thrift.CassandraDaemon
-Xms3525M -Xmx3525M

の設定でJavaVMが起動されているのでこのあたりが怪しいです。

conf/cassandra-env.sh

しらみつぶしにbin/cassandraから参照されているファイルを調べていくと、どうもconf/cassandra-evn.shの70行目あたりが確保するヒープメモリを設定する部分のようです。

# Override these to set the amount of memory to allocate to the JVM at
# start-up. For production use you almost certainly want to adjust
# this for your environment. MAX_HEAP_SIZE is the total amount of
# memory dedicated to the Java heap; HEAP_NEWSIZE refers to the size
# of the young generation. Both MAX_HEAP_SIZE and HEAP_NEWSIZE should
# be either set or not (if you set one, set the other).
#
# The main trade-off for the young generation is that the larger it
# is, the longer GC pause times will be. The shorter it is, the more
# expensive GC will be (usually).
#
# The example HEAP_NEWSIZE assumes a modern 8-core+ machine for decent pause
# times. If in doubt, and if you do not particularly want to tweak, go with
# 100 MB per physical CPU core.
#MAX_HEAP_SIZE="4G" -> 1024M
#HEAP_NEWSIZE="800M" -> 128M
if [ "x$MAX_HEAP_SIZE" = "x" ] && [ "x$HEAP_NEWSIZE" = "x" ]; then
calculate_heap_sizes
else
if [ "x$MAX_HEAP_SIZE" = "x" ] ||  [ "x$HEAP_NEWSIZE" = "x" ]; then
echo "please set or unset MAX_HEAP_SIZE and HEAP_NEWSIZE in pairs (see cassandra-env.sh)"
exit 1
fi
fi

この行より前の部分でマシンの搭載メモリからJVMに渡すヒープサイズを自動計算していました。

そこで、MAX_HEAP_SIZEとHEAP_NEWSIZEをオーバーライドすることで手動設定できるようになるようです。私は以下のように設定しました。

MAX_HEAP_SIZE="1024M"
HEAP_NEWSIZE="128M"

こうしたらちゃんと起動できました。よかったです。

関連記事

投稿者紹介

株式会社ユニキャスト
私たちは、テクノロジに魅せられた個性あふれるメンバーによって構成された茨城県日立市に本社を構えるベンチャー企業です。
”テクノロジを通して「驚き」と「感動」を創造し、人々の「夢」と「笑顔」を支えます。” の経営理念をモットーに明るい未来を描き、ワクワクする企画提案を続けて参ります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください