我正在为G1GC调整我们的产品,作为测试的一部分,我在Spark Workers上遇到了常规的段错误,这当然会导致JVM崩溃.发生这种情况时,Spark Worker / Executor JVM会自动重新启动,然后会覆盖为以前的Executor JVM编写的GC日志.
说实话,我不太确定Executor JVM如何重启自己的机制,但是我通过init.d启动了Spark Driver服务,而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:+P