Jim*_*and 4 logging garbage-collection diskspace apache-kafka
我们最近决定在许多集群上启用Apache Kafka代理的GC日志记录(确切版本不同),以帮助查看与Kafka相关的内存和垃圾收集问题.我们想要运行经纪人(不是像"kafka-topics.sh"这样的Kafka操作).我们还想避免我们知道可能发生的两个问题:
当Java GC日志记录开始进程时,它似乎替换了具有相同名称的任何文件的内容.这意味着除非您小心,否则您将失去GC记录,可能在您更可能需要它时.
GC_LOG_ENABLED在运行kafka-server-start.sh之前将环境变量设置为"true"启用GC日志记录,但不解决上述两个问题.这会添加这些固定的参数集:-Xloggc:<gc-log-file-loc> -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStampswhere gc-log-file-loc与.out文件位于同一目录和名称中,并带有"-gc.log"而不是".out".
Jim*_*and 10
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-env> kafka-env模板中设置.如果你在这里设置它,它似乎只用于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_HH-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
Run Code Online (Sandbox Code Playgroud)
从命令行,替换{{kafka_log_dir}}为Kafka日志目录的位置或GC日志的位置.您也可以更改日志文件命名.
在Ambari下,您可以将这些行(但不运行kafka-server-start.sh)添加到Ambari UI中的"kafka-env模板"字段. {{kafka_log_dir}}将自动替换为在该字段上方定义的Kafka日志目录.您需要重新启动代理以启动代理记录(考虑进行滚动升级).