概述
GC问题排查实战一
- 前言
- GC信息
- 参数配置信息
- gceasy分析
- 内存使用
- GC时间指标
- 交互图信息
- GC之后的堆情况分析
- GC过程的持续时间分析
- GC暂停时间分析
- 缺失的数据问题
- 回收的容量分析
前言
最近在进行GC的相关调优和问题排查,进行了一个全用例的场景压测,可以抽象为5W用户连接,500QPS并发,然后持续大致24个小时。随后进行一些分析,并找出其中可能存在的问题,以及可以优化的方向。
GC信息
参数配置信息
-Xms12G -Xmx12G -Xmn4G -XX:MetaspaceSize=300M -XX:SurvivorRatio=10 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:CMSMaxAbortablePrecleanTime=500 -XX:+CMSClassUnloadingEnabled -XX:+CMSScavengeBeforeRemark -XX:CMSInitiatingOccupancyFraction=50 -XX:+UseCMSInitiatingOccupancyOnly -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data/log/gc/gc.log -XX:ErrorFile=/data/log/error/error.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/log/heap/heap_hprof.bin -Dfile.encoding=UTF-8
可以看到幸存者区大小为350M左右,eden区为3.5G左右,每秒大约有600M的对象在eden分配,然后满了进行young gc,但是幸存区只有30M左右,利用率10%左右很低,而老年代了在增加,可以看到老年代会增加1M左右内存,说明有每6秒有1m左右进入老年代,而默认是15次回收还在的话就晋升,说明有1M的对象生命周期超过了90s,大致这么个情况,当然看GC具体日志是比较直接一种做法,但是太多的话就效率低了,所以把gc文件下下来,去gceasy上进行分析。
gceasy分析
内存使用
GC时间指标
交互图信息
GC之后的堆情况分析
发现还是挺稳定的,貌似不存在内存泄露,但是第4个之前有2个时间段好像有点问题,貌似没有GC触发
GC过程的持续时间分析
可以看到有2个时间段的young gc是空的,这个也符合上面那张图的问题:
GC暂停时间分析
也是有2段时间是缺失的
缺失的数据问题
从上面的GC过程的持续时间以及暂停时间来看,确实是有2段时间是没有数据的,那就有2种猜想:
- 是否那段时间没有请求了,网络出问题了,或者施压机出问题了,还是服务器有问题
- 是不是gc日志有缺失,磁盘满了么
于是先排查那段时间的监控情况,以及施压机是否有请求,查看压测报告,发现请求和响应一直很稳定,也没有报错,那不是第一种猜想的原因
再看ELK日志,发现确实没有记录啊,这个很奇怪了,于是就怀疑是不是统计的问题:
于是看了下日志,确实少了部分数据,而且可以发现日志好像有点问题,没写完,中间断了,然后又接上了,于是怀疑磁盘是不是满了,后来运维又清理了:
然后看了下警报,确实有,当时没注意,又跟运维确认了下,他确实是删过了,而且ELK就是根据日志上传的,所以ELK上也没有,最后发现我们的日志太多了,可能要调整下级别了,不过正常情况下压力没那么大,日志滚动删除,应该会好点。
回收的容量分析
这个就有意思了,发现好像有异常,在0点和13点附近居然有young gc回收,而且回收的数量很小。
放大来看看,确实是有,而且回收很小一部分,这个就很奇怪,到时候得看看日志详细:
查看日志,发现出现了这个GCLocker Initiated GC:
然后又看了下其他的点:
也是这个问题:
由于篇幅原因,下一篇继续说这个问题。
好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限。
最后
以上就是无语超短裙为你收集整理的GC问题排查实战一前言GC信息gceasy分析的全部内容,希望文章能够帮你解决GC问题排查实战一前言GC信息gceasy分析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复