线上问题排查思路

该文章全部纯属抄袭 加上了自己的一些总结,纯属为了加深自己的印象,有兴趣可以看原文:https://juejin.cn/post/6844903816379236360

1,cpu问题
2,内存问题(GC问题、内存泄漏、OOM、coreDump)
3,I/O问题

工具介绍:
arthas:阿里非常强大的java诊断工具,可以做到实时监控jvm状态,动态跟踪代码,等
非常适合在线问题排查:https://arthas.aliyun.com/doc/sc.html
jvm:观察jvm信息
thread:定位线程问题
dashboard:观察系统情况
heapdump+jhat分析
jad:动态反编译
redeline:热替换
sc - search class 这个命令能搜索出所有已经加载到 JVM 中的 Class 信息
watch - watch method函数执行数据观测
MAT:java内存、线程分析工具,能够给出内存报告,适合分析OOM的dump文件
GCLogViewer:GC log的趋势分析工具,适合排查GC日志,能够检测出内存泄漏 gc前后比较
JProfiler:java性能瓶颈分析工具,分析cpu,thread,memory功能尤其强大,做性能优化的必备工具

cpu问题
top看cpu的情况,找出消耗cpu较大的异常进程,top -H -p pid找出哪些线程占用较高,使用jstack 查看占用最高的线程
总结一下经验:
内核态消耗cpu太高:cpu切换、锁、io等
用户态消耗cpu:计算、循环、GC等

coredump
发生coredump都会留下coredump文件,根据你启动参数 配置文件的位置
并且jvm会生成一个crash报告文件,这个文件反应当时的情况
使用gdb工具去调试coredump文件 就能找到具体的原因

系统内存飙高
1,导出堆内存 jmap
2,分析 jhat jvisualvm mat jprofiler

oom
观看oom后面跟着什么
1,栈:StsckOverflowError
观察启动参数 xss配置有没有问题 有问题则 去调整Xss大小
没有问题 那就是代码问题,一般情况是 递归,死循环等 导致栈不够
2,线程不够了:Unable to create new native thread
遇到这个,不用怀疑,百分之99.99是 线程池使用有问题,去看 各种线程池
3,堆:Java head space
看启动参数堆的配置:Xmx 是不是被谁 误改了,参数有问题 则 修改该参数 比如太小了
接下来,不用怀疑,百分之99.99是 内存泄漏
观察gc情况,一般内存泄漏与gc异常相伴随
jmap -dump:live,file=men.map pid 把内存dump下来
使用mat分析内存 和调用链 找到无法回收的对象
4.如果堆内内存,gc无一场,初步怀疑 是不是堆外内存
一般情况是使用unsafe或者buteBuffer申请 和使用native方式申请,
可以使用工具gperftools+brace组合基本能解决,实在不行 就是用trace等

GC问题排查

1,young gc太长
根据gc log 使用GCLogViewer 查询耗时在哪一块 root scanning、object copy、ref proc等
root scanning耗时 则去关注 线程数、跨代引用
object copy耗时 则去关注对象的生命周期 (可以使用jmap)
ref proc 耗时 则去关注引用的相关对象
2,young gc频次太高
查看-Xmn、-XX:SurvivorRatio等参数设置是否合理 能否通过调整jvm参数达到目的
如果参数正常,young gc频率还是太高,需要使用jmap,mat等工具查看业务代码
3,full gc时间太长
思路:看看old的区域配置,过大 可以适当调小一点
如果是cms,查看inital mark 阶段时间太久

STW优先:parNew + cms、G1 (低于8g的优先cms,但不绝对 需要实操)
吞吐量优先:Parallel Scavenge+ParrallelOld、G1 (追求低STW 并且吞吐量 也要高的可以选择G1)
需要实操 有一些经验

parNew+cms 如何不产生full gc
1,加大JVM内存
2,加大young比例
3,提高Y-O的年龄
4,提高S区域的比例
5,避免内存泄漏
G1产生full gc
1,扩大内存
2,提高cpu性能
3,降低MixedGc的触发阈值,让MixedGc提早发生(默认45%)

IO问题
使用iotop能看到 那些线程在做io,然后使用jstack去定位代码

问题的排查
一般Java服务发生问题可能伴随着多种现象,比如:cpu飙升,gc飙升等
需要遵循:现象-问题-原因-方案 这个步骤去解决
1,列举所有异常现象。比如:服务响应时间飙升、cpu飙升、fullGc飙升
2,列举所有问题 ,步骤1的所有现象不一定都有问题,有可能是犹豫A导致了B,B就不是我们主要排查的方向
3,查询原因,排查原因 由简单到难,例如cpu飙升 就不 fullGc好排查
4,确定原因,就可以给出具体的解决方案 然后验证它

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值