java - JVM 崩溃时覆盖的 GC 日志
问题描述
我正在为 G1GC 调整我们的产品,作为测试的一部分,我的 Spark Workers 经常遇到段错误,这当然会导致 JVM 崩溃。发生这种情况时,Spark Worker/Executor JVM 会自动重启,然后覆盖为之前的 Executor JVM 编写的 GC 日志。
老实说,我不太确定 Executor JVM 如何自行重启的机制,但我通过 启动 Spark 驱动程序服务init.d
,该服务又调用 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 崩溃的 Workers 的活动和状态。关于如何处理这种情况并将 GC 日志保留在 Worker 上的任何想法,即使在 JVM 崩溃/段错误之后也是如此?
解决方案
如果您使用的是 Java 8 及更高版本,则可以考虑通过在日志文件名中添加 %p 来引入 PID,该 PID 在每次崩溃时都是唯一的。
推荐阅读
- c++ - 在 C++ 中返回新的构造函数(*this)工厂
- node.js - 如何根据一天中的时间显示消息?
- .net - 在 vb.net 中过滤来自网络浏览器的坏词
- go - 如何在 GO 中处理全局状态
- html - 调整所有 DIV 内容的大小
- android - 将 Android Studio 配置为仅显示特定级别的 API
- java - 如何按第二个单词对列表进行排序?
- authentication - ZAP 中的 NTLM 身份验证
- android - 即使手机处于静音模式 android 也会振动的功能
- python-3.x - pip install 给出 (ImportError: DLL load failed: %1 is not an valid Win32 application) 错误