【问题标题】:How to enable GC logging for Apache Storm processes, while preventing log file overwrites and capping disk space usage如何为 Apache Storm 进程启用 GC 日志记录,同时防止日志文件覆盖和限制磁盘空间使用
【发布时间】:2016-10-08 00:18:35
【问题描述】:

我们最近决定为几个 Apache Storm 进程启用 GC 日志记录:Nimbus、UI、DRPC 服务器、主管和日志查看器。 (Storm 工作人员被另一个问题所覆盖:How to enable GC logging for Apache Storm workers, while preventing log file overwrites and capping disk space usage。)我们正在许多集群上执行此操作(具体版本不同),以帮助调查与 Storm 相关的内存和垃圾收集问题。在这样做的同时,我们希望避免两个我们知道可能会发生的问题:

  • 当服务器因任何原因重新启动时覆盖日志文件
  • 日志占用过多磁盘空间,导致磁盘被填满

当一个进程的 Java GC 日志记录开始时,它似乎会替换任何同名文件的内容。这意味着除非您小心,否则您将丢失 GC 日志记录,也许在您更可能需要它的时候。

如果您让集群运行足够长的时间,日志文件将填满磁盘,除非进行管理。即使 GC 日志记录目前并不庞大,我们也希望管理出现异常情况的风险,这种情况会导致日志记录率突然飙升。

【问题讨论】:

    标签: logging garbage-collection apache-storm diskspace


    【解决方案1】:

    我有这些解决方案,除了覆盖预防不适用于所有版本的 Java。欢迎提出建议。

    您需要在启动服务器时设置一些 JVM 参数。您可以通过以下storm.yaml 属性为Storm 进程设置JVM 选项(如果您通过Apache Ambari 管理Storm,请查看Storm 服务> 配置> 高级风暴站点> worker.childopts):

    • nimbus.childopts: Nimbus
    • supervisor.childopts:主管
    • ui.childopts:风暴用户界面
    • drpc.childopts:DRPC 服务器
    • logviewer.childopts:日志查看器
    • worker.childopts:Storm 工作人员(超出此问题的范围)

    现在让我们讨论要包含在这些参数中的 JVM 参数。

    要启用对文件的 GC 日志记录,您需要添加 -verbose:gc -Xloggc:<log-file-location>

    您需要特别考虑日志文件名以防止覆盖。显然,您会希望为不同类型的 Storm 进程使用不同的 GC 日志文件名。似乎您还需要为每次调用设置一个唯一的名称,并且添加时间戳似乎是最好的解决方案。在某些 Java 版本中,您可以在 Xloggc 值中添加“%t”,它将被进程启动时的时间戳替换,格式为 <YYYY>-<MM>-<DD>_<HH>-<MM>-<SS>。但是,在其他版本的 Java 中,“%t”将按字面意思包含在文件名中。

    到目前为止,JVM 选项是(以 Nimbus 为例)-verbose:gc -Xloggc:/var/log/storm/storm-nimbus-gc.log-%t(路径应该与您的 Storm 日志记录目录匹配,如果您愿意,可以为日志文件命名不同的名称,并且应该省略“-%t” Java 不支持的地方)。

    现在开始管理磁盘空间的使用。如果有比我所拥有的更简单的方法,我会很高兴。

    首先,利用 Java 内置的 GC 日志文件轮换。 -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M 是启用此轮换的一个示例,它拥有来自 JVM 的多达 10 个 GC 日志文件,每个文件的大小不超过大约 10MB。 10 x 10MB 是 100MB 的最大使用量。

    使用最多 10 个文件的 GC 日志文件轮换,“.0”、“.1”、...“.9”将添加到您在 Xloggc 中提供的文件名中。 .0 将是第一个,在达到 .9 之后它将替换 .0 并以循环方式继续。在某些版本的 Java 中,'.current' 会附加在当前正在写入的日志文件名称的末尾。

    由于我们显然必须避免覆盖的唯一文件命名,每个进程调用可以有 100MB,因此这不是管理 Storm GC 日志使用的磁盘空间的完整解决方案.在每次服务器调用时,您最终会得到一组多达 10 个 GC 日志文件——这可能会随着时间的推移而增加。最好的解决方案(在 *nix 下)似乎是使用 logrotate 实用程序(或其他一些实用程序)定期清理过去 N 天内未修改的 GC 日志。

    请务必进行计算并确保您有足够的磁盘空间。请注意,您的机器可能会有多个进程同时写入 GC 日志。

    人们经常希望他们的 GC 日志中的详细信息和上下文比默认的更多,因此请考虑添加 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps

    总的来说,您将在属性中添加类似这样的内容:

    • nimbus.childopts:-verbose:gc -Xloggc:/var/log/storm/storm-nimbus-gc.log-%t -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps
    • supervisor.childopts:-verbose:gc -Xloggc:/var/log/storm/storm-supervisor-gc.log-%t -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps
    • ui.childopts:-verbose:gc -Xloggc:/var/log/storm/storm-ui-gc.log-%t -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps
    • drpc.childopts:-verbose:gc -Xloggc:/var/log/storm/storm-drpc-gc.log-%t -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps
    • logviewer.childopts:-verbose:gc -Xloggc:/var/log/storm/storm-logviewer-gc.log-%t -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps

    执行此操作时,请检查其中一些 JVM 参数是否已经存在。还记得用 logrotate 或其他东西清除旧的 GC 日志。

    GC 日志将在进程重启时生效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      • 2015-10-22
      • 2016-08-18
      • 2017-05-24
      相关资源
      最近更新 更多