防止Cassandra转储hprof文件

时间:2012-02-02 06:35:19

标签: java php shell jvm cassandra

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

我也有非常有限的磁盘空间(100 GB中有50GB用于数据),这些文件吞噬了所有磁盘空间,然后才能说“停止”。

我应该怎么做?

是否有可以用来擦除这些文件的shell脚本?

3 个答案:

答案 0 :(得分:7)

这是因为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

如果有效,请告诉我。


<强>更新

  

...我猜是当Cassandra崩溃/关闭时,JVM会抛弃它。有什么方法可以防止这种情况发生吗?

如果要完全禁用JVM堆转储,请参阅此处how to disable creating java heap dump after VM crashes?

答案 1 :(得分:1)

我承认我没有使用过Cassandra,但据我所知,它不应该转储任何hprof文件,除非你在编译时启用它,否则程序会遇到OutofMemoryException。所以试试看那里。

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

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

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

您可以使用cron在给定时间运行脚本,这将满足您的“时间”要求,大多数Linux发行版安装了cron,并处理crontab文件。您可以使用man crontab

找到有关crontab的更多信息

答案 2 :(得分:1)

即使您更新cassandra-env.sh指向heapdump路径,它仍然无法正常工作。原因是来自upstart脚本/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

我不是新手专家,但我所做的只是删除了创建副本的param。另一个奇怪的观察也是通过 ps aux 检查cassandra过程时你会注意到你会看到一些参数写入两次。如果您使用cassandra-env.sh并打印$ JVM_OPTS,您会注意到这些变量没问题。