我有这些解决方案,除了覆盖预防不适用于所有版本的 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 日志将在进程重启时生效。