线上问题排查流程
记录:
线上问题数据收集
记录下问题发生的场景,问题数据,操作流程等
F12控制台信息收集
查看请求和返回是否正常
服务器日志
查看服务器日志,问题出现的时间节点的异常日志
尝试复现并记录问题
生产环境复现:
1、刷新页面
2、重新登录账号
3、清除浏览器缓存等方法
通过以上方法查看能否复现问题。
测试环境复现
在测试环境按照同样的流程和数据尝试复现,如果可以复现,就可以进一步debug进行定位
无法复现的问题
条件允许,可以在线上再次复现,这个时候可以从以下几个点:
1、先监控下服务器资源,CPU是否存在飙升
2、内存是否有问题,这里主要是指虚拟机的内存使用
3、数据库、缓存等数据存储方面是否异常
1、逐个分析-CPU问题
如果CPU一直过高,也会导致出现问题,可以从以下几个方面进行分析
死循环
代码中是不是有业务逻辑导致了死循环,这个死循环可能是某个特定数据、特定场景条件下引起的。
一次性获取了过多的数据,导致处理超时
当前问题是否设计到大量数据,比如说一次从硬盘中取出大量的数据,或者使用多线程导出超大的文件等?
耗时的计算
业务逻辑中是否涉及到复杂的运算,遇到大量数据需要进行排队计算的情况?
2、接口超时问题
原本可用的接口突然超时了,可能是以下原因造成的
死循环
入参或者返回数据过大
循环调用频率超过阈值
数据库查询出现问题
3、sql查询问题
测试环境查询正常,但是线上突然某个查询有问题,可能是线上的数据量激增,没有提前建索引,或者是数据问题或者sql问题导致索引失效
索引失效可能是以下问题引起:
不满足最左匹配原则
索引列上使用了函数或者存在计算
like关键字使用左%
select没有指定字段,使用了*
4、逐个分析-内存问题
堆内存OOM
可以从日志中看到 java.lang.OutOfMemoryError: Java heap space
这个可以通过调整JVM参数来调整内存溢出时增加输出定位分析,可以在下次出现问题的时候输出内存使用情况的dump文件,然后可以使用相应的工具来进行分析,定位到具体的代码部分
栈内存OOM
java.lang.OutOfMemoryError: unable to create new native thread
这通常意味着栈内存不足,导致无法创建新的线程。这种情况往往是因为创建了过多的线程,或者单个线程的栈内存占用过大所引起的。
为了解决这个问题,我们需要仔细检查服务的线程使用情况。推荐的做法是采用线程池来管理线程,这样可以有效减少线程的创建,从而控制服务中的线程数量。
栈内存溢出
java.lang.StackOverflowError
业务中是否存在递归导致递归深度太深,超过了JVM虚拟机限制
应仔细检查递归调用的逻辑,确保其正常终止,避免出现无限递归的情况。
垃圾回收OOM
java.lang.OutOfMemoryError: GC overhead limit exceeded
这一般是由于JVM在处理大量对象时,内存不足所导致。
为了解决这一问题,建议调整GC策略,确保在老代内存占用达到80%时启动GC,并合理设置-XX:SurvivorRatio和-XX:NewRatio参数。
这个具体问题要具体分析。
元空间
java.lang.OutOfMemoryError: Metaspace
此类问题多因加载至内存中的类过多或类体积过大所致。若在生产环境中遇到此问题,可通过调整元空间大小来解决