【问题标题】:Preventing Cassandra from dumping hprof files防止 Cassandra 转储 hprof 文件
【发布时间】:2012-02-24 20:36:50
【问题描述】:

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

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

我应该怎么做?

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

【问题讨论】:

    标签: java php shell jvm cassandra


    【解决方案1】:

    即使您更新 cassandra-env.sh 以指向堆转储路径,它仍然无法正常工作。原因是从新贵脚本 /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 进程时还有另一个奇怪的观察结果,您会注意到您会看到一些参数被写入两次。如果你 source cassandra-env.sh 并打印 $JVM_OPTS 你会注意到这些变量没问题。

    【讨论】:

      【解决方案2】:

      这是因为 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 堆转储,请参阅此处how to disable creating java heap dump after VM crashes?

      【讨论】:

      • 我也想评论一下。但是我注意到的 hprof 文件没有遵循模板“cassandra-NNN.hprof”,而只是“pid-XXX.hprof”,所以我猜是 JVM 在 Cassandra 崩溃/关闭时将其丢弃。有什么办法可以防止这种情况发生?
      • 注释掉 $CASSANDRA_HOME/conf/cassandra-env.sh 中的块并没有真正起作用。但是由于链接和 .hprof 删除 cron 作业,现在一切正常。再次感谢您的帮助。
      【解决方案3】:

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

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

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

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

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

      【讨论】:

      • 谢谢!我也想通了!因为实际上当我暂停 Cassandra 实例时,hprof 文件就出来了,因为它们被命名为“pid-XXX.hprof”而不是“cassandra-XXX.hprof”。感谢 shell 脚本。我将执行它们。 :)
      猜你喜欢
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 2014-08-01
      • 2019-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多