我的一个cassandra节点正在aws实例上运行,有时它被停止了,我在system.log
和cassandra.log
文件中看到了以下信息。
可能是造成这类错误的原因
java.lang.OutOfMemoryError: Direct buffer memory
和
Not marking nodes down due to local pause of
如何解决这些问题
答案 0 :(得分:2)
解决方案是在所有节点上安装Java 8并将GC策略更改为G1,结果令人惊讶。 我已经使用G1垃圾收集算法启动了8GB堆的所有节点,我看到了立即改进,使用的堆每个节点没有超过4GB,并且GC时间减少了。
我将解释我为改变设置与G1GC一起运行所采取的步骤,我将详细说明一切是如何工作的。
(在我写完这篇文章之后,我发现这篇文章太长了,所以我决定很好,为丰富的部分留下很多东西,所以请随意跳过它们)
安装最新的Oracle JDK 8以获得G1GC的最新更新。这也适用于Java JRE / JDK,而不是Java 7更新4,但是建议使用Apache Cassandra Java 8。
安装Java 8(适用于基于Debian的系统): 添加Oracle存储库,更新本地apt-get缓存并安装oracle-java8-installer软件包:
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
自动安装(自动接受许可)
echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | sudo /usr/bin/debconf-set-selections
sudo apt-get install oracle-java8-set-default
在环境中设置“JAVA_HOME”变量:
sudo vim /etc/environment
在文件末尾添加这些行。
JAVA_HOME="/usr/lib/jvm/java-8-oracle/"
PATH=$PATH:$JAVA_HOME/bin
重新加载新添加的环境变量:
source /etc/environment
我们现在安装了Java 8 JDK。
要设置G1算法以在特定节点上运行,您需要按照以下步骤操作:
在cassandra-env.sh
文件中添加以下行:
JVM_OPTS="$JVM_OPTS -XX:+UseG1GC"
JVM_OPTS="$JVM_OPTS -XX:G1RSetUpdatingPauseTimePercent=5"
JVM_OPTS="$JVM_OPTS -XX:+PrintFlagsFinal"
您需要注释掉默认情况下可能存在的所有CMS特定标志。搜索这些并小心别人:
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:SurvivorRatio=8
-XX:MaxTenuringThreshold=1
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSWaitDuration=10000
-XX:+CMSClassUnloadingEnabled
就是这样,
参考: - http://progexc.blogspot.in/2015/12/taking-care-of-garbage-in-cassandra.html