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

9lowa7mx  于 2021-06-07  发布在  Kafka
关注(0)|答案(1)|浏览(416)

我们最近决定在多个集群上为apachekafka代理启用gc日志记录(具体版本各不相同),以帮助研究与kafka相关的内存和垃圾收集问题。我们希望这样做是为了运行代理(不是为了kafka操作,比如“kafka topics.sh”)。我们还希望避免可能发生的两个问题:
当代理因任何原因重新启动时覆盖日志文件
日志占用了太多的磁盘空间,导致磁盘被填满(如果您让集群运行足够长的时间,日志文件将填满磁盘,除非管理)
当一个进程的javagc日志记录开始时,它似乎会替换任何同名文件的内容。这意味着除非您小心,否则您将丢失gc日志记录,可能是在您更需要它的时候。
设置环境变量 GC_LOG_ENABLED 如果在运行kafka-server-start.sh之前为“true”,则启用gc日志记录,但没有解决上述两个问题。添加这些固定参数集: -Xloggc:<gc-log-file-loc> -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps 哪里 gc-log-file-loc 与用“-gc.log”而不是“.out”放入的.out文件位于同一目录和名称中。

dz6r00yl

dz6r00yl1#

你可以设置 KAFKA_GC_LOG_OPTS 在运行kafka-server-start.sh之前使用以下特定的jvm参数。这是因为kafka-run-class.sh在jvm选项中明确地包含了该环境变量的内容,但只有在传递该环境变量时才有效 -loggc 在它的命令行上;kafka-server-start.sh确实传递了这个。
如果您是通过apache ambari启动kafka,那么 KAFKA_GC_LOG_OPTS 在“Kafka服务>配置>高级Kafka环境>Kafka环境模板”中。如果在这里设置,它似乎只用于kafka-server-start.sh。其他脚本当前未通过 -loggc 到kafka-run-class.sh。
现在让我们来讨论要包含在中的jvm参数 KAFKA_GC_LOG_OPTS .
要启用文件的gc日志记录,您需要添加 -verbose:gc -Xloggc:<log-file-location> .
您需要特别考虑日志文件名,以防止在重新启动代理时进行覆盖。似乎每次调用都需要一个唯一的名称,因此附加时间戳似乎是最好的选择。您可以添加类似于“date+'%y%m%d%h%m'”的内容来添加时间戳。在本例中,它的格式为yyyymmddhhmm。在某些版本的java中,可以将“%t”放在日志文件位置,它将被格式为yyyy-mm-dd\uhh-mm-ss的代理启动时间戳所替换。
现在开始管理磁盘空间的使用。如果有比我现有的更简单的方法,我会很高兴的。
首先,利用java内置的gc日志文件循环。 -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M 是启用这种循环的一个示例,jvm中最多有10个gc日志文件,每个文件的大小不超过100mb。10 x 100mb是1000mb的最大使用量。
随着gc日志文件轮换到位,最多有10个文件,“.0”、“.1”、“…”。9'将添加到您在xloggc中提供的文件名中。0将是第一个,在它到达.9之后,它将替换.0并以循环方式继续。在java的某些版本中,“.current”将另外放在当前正在写入的日志文件名称的末尾。
由于独特的文件命名,我们显然必须避免重写,每个代理进程调用可以有1000mb,因此这不是管理kafka代理gc日志使用的磁盘空间的完整解决方案。您将得到每个代理最多10个gc日志文件的集合——这可能会随着时间的推移而增加。最好的解决方案(在*nix下)似乎是使用logrotate实用程序(或其他一些实用程序)定期清理在过去n天内未被修改的代理gc日志。
一定要计算一下,确保你有足够的磁盘空间。
人们通常希望在gc日志中包含比默认日志更多的细节和上下文,因此考虑添加 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps 就像我做的那样 GC_LOG_ENABLED=true .

Putting all end parameters together into KAFKA_GC_LOG_OPTS and starting a broker you might have:
TIMESTAMP=`date +'%Y%m%d%H%M'`

# GC log location/name prior to .n addition by log rotation

GC_LOG_NAME="{{kafka_log_dir}}/kafka-broker-gc.log-$TIMESTAMP"

GC_LOG_ENABLE_OPTS="-verbose:gc -Xloggc:$GC_LOG_NAME"
GC_LOG_ROTATION_OPTS="-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M"
GC_LOG_FORMAT_OPTS="-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps"

export KAFKA_GC_LOG_OPTS="$GC_LOG_ENABLE_OPTS $GC_LOG_ROTATION_OPTS $GC_LOG_FORMAT_OPTS"
./kafka-server-start.sh server.properties

在命令行中,替换 {{kafka_log_dir}} 你的kafka日志目录的位置,或者任何你想要gc日志去的地方。您也可以更改日志文件的命名。
在ambari下,将这些行(但不运行kafka server start.sh)添加到ambari ui的“kafka env template”字段中。 {{kafka_log_dir}} 将自动替换为kafka日志目录,该目录在字段上方定义。您需要重新启动代理来启动代理日志记录(考虑进行滚动升级)。

相关问题