东东
发布于 2025-03-10 / 3 阅读 / 0 评论 / 0 点赞

线上问题排查流程

线上问题排查流程

记录:

线上问题数据收集

记录下问题发生的场景,问题数据,操作流程等

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

此类问题多因加载至内存中的类过多或类体积过大所致。若在生产环境中遇到此问题,可通过调整元空间大小来解决