我想阻止Cassandra转储hprof文件,因为我不需要使用它们。
我也有非常有限的磁盘空间(100 GB中有50GB用于数据),这些文件吞噬了所有磁盘空间,然后才能说“停止”。
我应该怎么做?
是否有可以用来擦除这些文件的shell脚本?
答案 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
答案 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,您会注意到这些变量没问题。