垃圾收集—如何为apache storm进程启用gc日志记录,同时防止日志文件覆盖和限制磁盘空间使用

wyyhbhjk  于 2021-06-21  发布在  Storm
关注(0)|答案(1)|浏览(413)

我们最近决定为几个apachestorm进程启用gc日志:nimbus、ui、drpc服务器、supervisor和logviewer(storm workers还涉及另一个问题:如何为ApacheStorm workers启用gc日志记录,同时防止日志文件覆盖和限制磁盘空间使用。)我们在许多集群(具体版本不同)上这样做,以帮助研究storm相关的内存和垃圾收集问题。在执行此操作时,我们希望避免可能发生的两个问题:
在服务器因任何原因重新启动时覆盖日志文件
日志占用了太多的磁盘空间,导致磁盘被填满
当一个进程的javagc日志记录开始时,它似乎会替换任何同名文件的内容。这意味着除非您小心,否则您将丢失gc日志记录,可能是在您更需要它的时候。
如果集群运行的时间足够长,除非进行管理,否则日志文件将填满磁盘。即使gc日志记录目前不是大量的,我们也希望管理出现异常情况的风险,这种情况会导致日志记录速率突然上升。

biswetbf

biswetbf1#

我有解决这些问题的方法,除了覆盖预防不适用于所有版本的java。我欢迎你的建议。
在启动服务器时,需要设置一些jvm参数。您可以通过以下storm.yaml属性为storm进程设置jvm选项(如果您是通过apache ambari管理storm,请查看storm服务>配置>高级storm站点>worker.childopts):
nimbus.childopts:光圈
supervisor.childopts:主管
ui.childopts:风暴用户界面
drpc.childopts:drpc服务器
logviewer.childopts:日志查看器
worker.childopts:风暴工人(超出此问题的范围)
现在让我们来讨论要包含在这些参数中的jvm参数。
要启用文件的gc日志记录,您需要添加 -verbose:gc -Xloggc:<log-file-location> .
您需要特别考虑日志文件名以防止重写。显然,对于不同类型的风暴进程,您需要有不同的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日志目录匹配,如果愿意,可以用不同的名称命名日志文件,java不支持的地方应该省略“-%t”)。
现在开始管理磁盘空间的使用。如果有更简单的方法,我会很高兴的。
首先,利用java内置的gc日志文件循环。 -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M 是启用这种循环的一个例子,jvm中最多有10个gc日志文件,每个文件的大小不超过10mb左右。10x10MB是100mb的最大使用量。
随着gc日志文件轮换到位,最多有10个文件,“.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 .
主管.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日志记录将在进程重新启动时生效。

相关问题