阻止Cassandra转储hprof文件


Preventing Cassandra from dumping hprof files

我想阻止Cassandra转储hprof文件,因为我不需要使用它们。

我的磁盘空间也非常有限(100 GB中有50 GB用于数据),在我说"停止"之前,这些文件就吞噬了所有的磁盘空间。

我该怎么做?

有没有一个shell脚本可以让我不时地删除这些文件?

这是因为Cassandra以-XX:+HeapDumpOnOutOfMemoryError Java选项开头。如果你想分析的话,这是好东西。此外,如果您得到了大量堆转储,这表明您可能应该调整Cassandra可用的内存。

我还没有尝试过。但是要阻止这个选项,请在$CASSANDRA_HOME/conf/cassandra-env.sh 中评论以下行

JVM_OPTS="$JVM_OPTS -XX:+HeapDumpOnOutOfMemoryError"

或者,你也可以评论这个区块,但我认为这并不是真正需要的。我想这个区块有1.0+版本。我在0.7.3找不到这个。

# set jvm HeapDumpPath with CASSANDRA_HEAPDUMP_DIR
if [ "x$CASSANDRA_HEAPDUMP_DIR" != "x" ]; then
    JVM_OPTS="$JVM_OPTS -XX:HeapDumpPath=$CASSANDRA_HEAPDUMP_DIR/cassandra-`date +%s`-pid$$.hprof"
fi

让我知道这是否有效。


更新

我猜是JVM在Cassandra崩溃/关闭时抛出的。有什么办法防止这种情况发生吗?

如果您想完全禁用JVM堆转储,请参阅此处如何在VM崩溃后禁用创建java堆转储?

我承认我没有使用过Cassandra,但据我所知,它不应该转储任何hprof文件,除非你在编译时启用它,或者程序遇到内存外异常。所以试着看看那里。

就shell脚本而言,如果文件被转储到特定位置,则可以使用此命令删除所有*.hprof文件。

find /my/location/ -name *.hprof -delete

这是使用来自find-delete指令,该指令删除与搜索匹配的所有文件。如果您需要进一步缩小搜索范围,请查看手册页以查找更多搜索选项。

您可以使用cron在给定的时间运行脚本,这将满足您的"时间到时间"要求,大多数linux发行版都安装了cron,并使用crontab文件。您可以使用man crontab 来了解有关crontab的更多信息

即使更新cassandra-env.sh以指向heapdump路径,它仍然无法工作。原因是从暴发户脚本/etc/init.d/cassandra中有一行创建了默认的HeapDump路径

start-stop-daemon -S -c cassandra -a /usr/sbin/cassandra -b -p "$PIDFILE" -- '
    -p "$PIDFILE" -H "$heap_dump_f" -E "$error_log_f" >/dev/null || return 2

我不是一个暴发户专家,但我所做的只是删除了创建重复的参数。另一个奇怪的观察结果是,当通过ps-aux检查cassandra进程时,您会注意到一些参数被写了两次。如果您获取cassandra-env.sh并打印$JVM_OPTS,您会注意到这些变量还可以。