定位问题的先决条件
需要有详细的日志记录,提前告警的监控平台,事发现场保留
日志 :业务日志,中间件日志
监控 :CPU、内存、磁盘、网络,类加载、GC、线程等
快照 :-XX:+HeapDumpOnOutOfMemoryError 和 -XX:HeapDumpPath
分析问题,解决问题的思路
经验+直觉,快速定位 > 逐一排查,传输链路 > 寻找规律
不要轻易怀疑监控。考虑资源。优先保证系统能正常运行。保留现场,事后排查定位问题。
逐一排查,传输链路,通过日志或工具逐一排查
- 内部原因,是否是客户端或者前端问题,程序发布后的Bug,回滚后可以立即解决
- 外部原因,比如服务,第三方服务,主机、组件的问题。
- 服务:错误日志邮件提醒或elk快速定位问题,查看gc日志
- 第三方服务:单独调用测试,联系第三方加急解决
- 主机: CPU相关问题,可以使用 top、vmstat、pidstat、ps 等工具排查; 内存相关问题,可以使用 free、top、ps、vmstat、cachestat、sar 等工具排查;IO 相关问题,可以使用 lsof、iostat、pidstat、sar、iotop、df、du 等工具排查;网络相关问题,可以使用 ifconfig、ip、nslookup、dig、ping、tcpdump、iptables等工具排查。
- 组件:查看日志输出,使用命令查看运行情况
- 因为系统资源不够造成系统假死的问题,通常需要先通过重启和扩容解决问题,之后再进行分析,系统资源不够,一般体现在 CPU 使用高、 内存泄漏或OOM 的问题、IO问题、网络相关问题这四个方面
分析问题的方法
1 | ini复制代码jps -v 查看java进程 |
线上cpu100%报警(找出最耗时CPU进程-线程-堆栈-代码)
1 | perl复制代码方法1:原生工具,慢 |
线上内存OOM
1 | bash复制代码某Java服务(假设PID=12084)出现了OOM,最常见的原因为: |
如何防止线上问题发生
数据库:上线一个定时监控和杀掉慢SQL的脚本。这个脚本每分钟执行一次,检测上一分钟内,有没有执行时间超过一分钟(这个阈值可以根据实际情况调整)的慢SQL,如果有大事务自己觉得该阈值的合理性,如果发现,直接杀掉这个会话
cpu或者内存的使用率上做报警,大于90%的时候可以dump和jstack一次,甚至jstat也可以做,然后95%的时候也同样执行一次,甚至98或者99的时候也可以做一次,这样不仅可以保留现场,同时还可以对比
完善的服务报错日志监控,可选elfk+日志监控或sentry
完善的流程机制。完善的主机,中间件监控报警机制
遇到过的线上问题以及解决思路
App打不开,请求超时,访问数据库超时,数据库cpu飙升有规律,在某个时间点才飙升,去调度中心找该时间断的的定时任务,排查是异步转账开多了线程导致的
工具汇总
- 去哪儿bistour
- mat 分析堆快照
- arthas arthas.aliyun.com/doc/quick-s…
- gceasy.io #在线gc日志,dump文件分析
- fastthread.io #在线gc日志,dump文件分析
- console.perfma.com #在线生成jvm参数
参考
本文转载自: 掘金