java - JVM 崩溃时 GC 日志被覆盖

标签 java apache-spark garbage-collection g1gc

我正在针对 G1GC 调整我们的产品,作为该测试的一部分,我的 Spark Worker 经常遇到段错误,这当然会导致 JVM 崩溃。发生这种情况时,Spark Worker/Executor JVM 会自动重启,然后覆盖为之前的 Executor JVM 写入的 GC 日志。

老实说,我不太确定 Executor JVM 如何自行重启的机制,但我通过 init.d 启动了 Spark Driver 服务,它又调用了一个 bash脚本。我确实在该脚本中使用了一个时间戳,该时间戳附加到 GC 日志文件名中:

today=$(date +%Y%m%dT%H%M%S%3N)

SPARK_HEAP_DUMP="-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${SPARK_LOG_HOME}/heapdump_$$_${today}.hprof"
SPARK_GC_LOGS="-Xloggc:${SPARK_LOG_HOME}/gc_${today}.log -XX:LogFile=${SPARK_LOG_HOME}/safepoint_${today}.log"

GC_OPTS="-XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:+PrintFlagsFinal -XX:+PrintJNIGCStalls -XX:+PrintTLAB -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=15 -XX:GCLogFileSize=48M -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy -XX:+PrintHeapAtGC -XX:+PrintGCCause -XX:+PrintReferenceGC -XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1"

认为问题是这个脚本将这些选项发送到 Spark Driver,然后将它们传递给 Spark Executors(通过 -Dspark.executor.extraJavaOptions 参数),它们都是独立的服务器,当 Executor JVM 崩溃时,它只是使用最初发送的命令来启动备份,这意味着 GC 日志文件名的时间戳部分是静态的:

SPARK_STANDALONE_OPTS=`property ${SPARK_APP_CONFIG}/spark.properties "spark-standalone.extra.args"`
SPARK_STANDALONE_OPTS="$SPARK_STANDALONE_OPTS $GC_OPTS $SPARK_GC_LOGS $SPARK_HEAP_DUMP"

exec java ${SPARK_APP_HEAP_DUMP} ${GC_OPTS} ${SPARK_APP_GC_LOGS} \
    ${DRIVER_JAVA_OPTIONS} \
    -Dspark.executor.memory=${EXECUTOR_MEMORY} \
    -Dspark.executor.extraJavaOptions="${SPARK_STANDALONE_OPTS}" \
    -classpath ${CLASSPATH} \
    com.company.spark.Main >> ${SPARK_APP_LOGDIR}/${SPARK_APP_LOGFILE} 2>&1 &

这让我很难调试段错误的原因,因为我失去了导致 JVM 崩溃的 Worker 的 Activity 和状态。关于如何处理这种情况并在 Worker 上保留 GC 日志,即使在 JVM 崩溃/段错误之后,我有什么想法吗?

最佳答案

如果您使用的是 Java 8 及更高版本,您可以考虑通过在日志文件名中添加 %p 来引入 PID,这在每次崩溃时都是唯一的。

关于java - JVM 崩溃时 GC 日志被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52225485/

相关文章:

java - 使用 Java 将 JSON 文档数组插入 MongoDB 时出错

hadoop - yarn 中的节点状态是什么?

garbage-collection - Lua 的 GC 和实时游戏

java - 执行 "m1=null; m2=null;"后有多少对象可以进行垃圾回收?

c++ - RAII 与垃圾收集器

java - 在 hibernate 中设置最大结果不按要求工作

java - 使用 java.util.Arrays 和 scala.concurrent.ops.par 的 Scala 并行排序

java - 格式化双Android

python - Pyspark dataframe 获取至少一行满足条件的列列表

python-3.x - Microsoft Azure Spark kusto 连接器 - 是否可以从 databricks 中获取 azure 存储的文件?