本文共 5684 字,大约阅读时间需要 18 分钟。
#! /bin/sh# 使用将下面添加注释去掉(markdown语法需要转义#,在使用时需要将转义符去掉)# GC 日志存放目录LOG_DIR=”/tmp/logs” # 打印GC日志JAVA_OPT_LOG=”-verbose:gc” # 打印GC详细信息JAVA_OPT_LOG=”${JAVA_OPT_LOG} -XX:+PrintGCDetails” # 打印GC日志带系统时间JAVA_OPT_LOG=”${JAVA_OPT_LOG} -XX:+PrintGCDateStamps” # 打印应用停顿(STW)时间JAVA_OPT_LOG=”${JAVA_OPT_LOG} -XX:PrintGCApplicationStoppedTime”# 打印对象年龄分布,对调优MaxTenuringThreshold参数帮助很大JAVA_OPT_LOG=”${JAVA_OPT_LOG} -XX:+PrintTenuringDistribution” #将以上GC内容输出到文件中,并指定gc日志文件的格式JAVA_OPT_LOG=”${JAVA_OPT_LOG} -Xloggc:${LOG_DIR}/gc_%p.log” # 指定堆内存溢出相关的日志存储目录,Dump文件保存路径,历史错误日志文件路径及命名格式JAVA_OPT_OOM=” -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOG_DIR} -XX:ErrorFile=${LOG_DIR}/hs_error_pid%p.log” JAVA_OPT=”${JAVA_OPT_LOG} ${JAVA_OPT_OOM}” # JVM缩简日志输出JAVA_OPT=”${JAVA_OPT} -XX:-OmitStackTraceInFastThrow”
#! /bin/sh # GC日志存储父目录LOG_DIR=”/tmp/logs” # 打印GC日志JAVA_OPT_LOG=” -verbose:gc”#将GC 引用、堆相关的debug日志输出到日志文件 JAVA_OPT_LOG=”${JAVA_OPT_LOG} -Xlog:gc,gc+ref=debug,gc+heap=debug,gc+age=trace:file=${LOG_DIR}/gc_%p.log:tags,uptime,time,level” # 将jvm安全点(用于锁降级机制)相关信息输出到日志文件JAVA_OPT_LOG=”${JAVA_OPT_LOG} -Xlog:safepoint:file=${LOG_DIR}/safepoint_%p.log:tags,uptime,time,level” # 打印OOM信息,指定Dump日志文件路径,错误日志文件JAVA_OPT_OOM=” -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOG_DIR} -XX:ErrorFile=${LOG_DIR}/hs_error_pid%p.log” # 配置JAVA_OPT_LOG及JAVA_OPT_OOMJAVA_OPT=”${JAVA_OPT_LOG} ${JAVA_OPT_OOM}” # 对jvm输出日志进行缩简JAVA_OPT=”${JAVA_OPT} -XX:-OmitStackTraceInFastThrow” # 打印jvm的最终配置参数Echo $JAVA_OPT
具体例子
上述例子解析
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 0.00 0.00 72.03 0.35 54.12 55.72 11122 16.019 0 0.000 16.0190.00 0.00 95.39 0.35 54.12 55.72 11123 16.024 0 0.000 16.0240.00 0.00 25.32 0.35 54.12 55.72 11125 16.025 0 0.000 16.0250.00 0.00 37.00 0.35 54.12 55.72 11126 16.028 0 0.000 16.0280.00 0.00 60.35 0.35 54.12 55.72 11127 16.028 0 0.000 16.028 说明:S0: 年轻代的survivor 0 S1: 年轻代的survivor 1 O: 年老代 M: MetaSpacke,即元空间(之前的方法区) YGC: 年轻代回收次数 YGCT: 年轻代回收耗时 FGC: FullGC回收次数 FGCT: FullGC回收耗时-gcutil位置的参数可有多种,最常见有gc,gcutil,gccause,gcnew
jstat -gc $pid 1000 : 显示和GC相关堆信息jstat -gcutil $pid 1000 : 显示垃圾回收信息jstat -gccause $pid 1000 : 显示垃圾回收相关信息(同 -gcutil),同时显示最后一次或当前发生垃圾回收的诱因jstat -gcnew $pid 1000 : 显示新生代信息jstat -gccapacity $pid 1000 : 显示各个代的容量即使用情况jstat -gcmetacapacity $pid 1000 : 显示元空间metaspace的大小jstat -gcnewcapacity $pid 1000 : 显示新生代大小和使用情况jstat -gcold $pid 1000 : 显示老年代和永久代信息jstat -gcoldcapacity $pid 1000 : 显示老年代大小jstat -printcompilation $pid 1000 : 输出JIT编译的方法信息jstat -class $pid 1000 : 显示类加载器classloader相关信息jstat -compiler $pid 1000 : 显示JIT编译相关信息
Jstat -gcutil -t 90542 1000 |awk ‘begin {pre=0} {if(NR>1) {print $0 “\t” ($12-pre) “\t” $12*100/$1 ; pre=$12 } else {print $0 “\tGCT_INC\tRate”} }’Timestamp S0 S1 E O M CCS YGC YGCT FGC FGC TGC TGC_INC Rate 18.7 0.00 100.00 6.02 1.45 84.81 76.09 1 0.002 0 0.000 0.0020 0.010695219.7 0.00 100.00 6.02 1.45 84.81 76.09 1 0.002 0 0.000 0.0020 0.0101523 ````
1. 问题:其中一套ES机器,在访问高峰,多个ES节点发生严重STW问题,有点节点停顿了7~8s。用户态420ms,真实停顿7.62s [Times: user=0.42 sys=0.03, real=7.62 secs] 2.使用iostat -x 1 看到具体I/O使用情况3.盘点资源后,唯一超额利用就是I/O资源(%util保持在90以上),GC可能在等I/O4.通过搜索,发现有类似问题,原因:写GC日志的write动作,是统计在STW的时间中,我们场景中,由于ES索引数据,和GC放置一个磁盘,GC时写日志的动作,就和写数据文件发生资源争用。解决:将ES日志文件,单独放到一块普通HDD磁盘
转载地址:http://bhjzb.baihongyu.com/