排查bug的通用思路

在这里插入图片描述
⭐️前言⭐️

APP点击某个按钮没有反应/PC端执行某个操作后,响应较慢,通用的问题排查方法:

从多个角度来排查问题

🍉欢迎点赞 👍 收藏留言评论

🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言

🍉博客中涉及源码及博主日常练习代码均已上传GitHub


请添加图片描述

📍内容导读📍

  • 🍅综合排查流程
  • 🍅前端角度
  • 🍅网络层角度
  • 🍅后端应用层
  • 🍅数据层
  • 🍅系统资源问题
  • 🍅 配置与架构问题
  • 🍅优化建议
  • 🍅通用的一些解决手段

🍅综合排查流程

网络请求和响应的检查

  • 使用浏览器开发者工具F12,关注点击按钮后,捕获到的请求的方式(GET/POST)、请求头和请求体是否符合预期
  • 查看服务器的响应,检查响应状态码(如200成功、500服务器错误)以及返回的数据内容,确保响应数据符合预期

分离端复现问题

  • 前端单独测试:可以在浏览器中将开发者工具的网络连接调为“离线模式”来测试前端逻辑。模拟前端点击操作,查看是否存在接口调用。如果前端逻辑应该在无网络时拦截,但未拦截,说明前端存在问题。
  • 后端单独测试:通过工具(比如postman)模拟前端发起API请求,查看后端接口的响应是否符合预期。确保后端在接受到正确的请求时,返回符合业务逻辑的响应

分析慢点

  • 定位慢点:可以通过浏览器控制台抓请求或者记录时间戳的方式,分析延迟主要出现在前端、网络还是后端

    • 可以在前端和后端的关键节点记录时间错,通过时间戳的对比定位慢点

  • 分段日志埋点:在后端的关键逻辑处添加日志记录耗时(比如业务处理开始、结束,数据库查询开始、结束)

    • 使用System.currentTimeMillis()记录时间差,快速找到耗时长的部分

分阶段排查

  • 前端慢:关注请求发出前后的逻辑
  • 网络慢:检查网络传输与中间层
  • 后端慢:逐层检查应用层、数据库和其他依赖服务

协同调试

  • 将发现的问题详细记录,包括问题的复现步骤、请求和响应的具体内容、错误日志等,反馈到前后端团队。
  • 组织线上调试会议,前后端、测试共同协作,通过共享日志、实时调试来定位问题的根源。

🍅前端角度

1.请求问题

  • 网络延迟:浏览器F12控制台看请求,检查前端到后端的网络路径是否正常,有无高延迟或丢包现象。
  • 请求参数问题:确认发送的请求是否携带了过大的数据,或者请求的参数不符合接口要求,导致后端处理异常
  • 重复请求:检查前端代码是否因逻辑问题导致发送了重复或无意义的请求
  • 请求超时配置:检查前端是否配置了过长的超时时间,未能及时识别问题

2.静态资源问题:

  • 如果时静态资源请求慢,可能时前端资源服务器的CDN缓存未命中或者配置问题。

🍅网络层角度

  • 网络延迟
    • 网络带宽不足或延迟过高,特别是服务与数据库、缓存服务分布在不同区域时。
    • 数据包丢失或网络不稳定,导致重试或请求失败。
  • DNS解析延迟
    • 服务调用中依赖的域名解析慢,影响请求的实际发出时间。
  • 链路复杂
    • 多层代理(如网关、负载均衡)导致请求经过多个中间环节,增加响应时间。

🍅后端应用层

  • 业务逻辑复杂
    • 业务代码中嵌套调用过多、逻辑判断繁琐,导致请求处理耗时。
    • 不必要的循环或递归操作,特别是处理大规模数据时未优化算法。
  • 代码优化不足
    • 代码中存在未优化的阻塞操作(如线程等待、同步锁竞争)。
    • 不合理的数据结构选择(如线性搜索代替哈希表)。
  • 第三方接口调用慢
    • 调用外部服务(如支付接口、第三方API)时出现网络延迟或接口响应慢。
    • 第三方服务限流或超时未处理,导致阻塞。
  • 异常处理问题
    • 异常处理逻辑不完善,导致未捕获异常不断重试或抛出。
  • 缓存问题
    • 缓存未命中
      • 请求频率高但未利用缓存优化
      • 热数据未加载到缓存,直接从数据库读取数据
    • 缓存击穿、雪崩或穿透
      • 高并发时,缓存过期或被大量无效请求穿透
      • 缓存层压力过大,导致失效或阻塞
    • 缓存更新策略问题
      • 缓存未及时更新,导致大量请求命中无效数据并触发数据库查询
  • 队列与任务调度问题
    • 消息队列积压
      • 消息队列(如RabbitMQ、Kafka)中消费速度低于生产速度,导致请求延迟
      • 消费者线程数量不足或处理能力有限
    • 任务调度延迟
      • 定时任务频繁触发,导致线程资源耗尽
      • 分布式任务调度系统负载不均或出现故障

🍅数据层

1.索引问题

  • 未建立索引
    • 查询字段没有建立索引,导致数据库全表扫描
  • 索引未命中
    • 查询条件不符合索引最左前缀原则,联合索引被部分利用
    • 查询使用了LIKE '%xxx' 或函数计算等导致索引失效
  • 索引过多或过大
    • 索引数量过多增加了维护成本
    • 大量索引需要更新时,写操作性能降低

2.数据量问题

  • 表数据量过大:
    • 数据量超过百万行时,查询性能显著下降
    • 热点数据和冷数据混合,影响查询效率
  • 分页查询耗时:
    • 大偏移量分页(比如OFFSET 100000)导致性能问题,数据库依然扫描了大量无用数据
  • 历史数据未归档:
    • 查询需要扫描包含历史数据的大表

3.SQL语句问题

  • 复杂查询:
    • 查询包含多表关联(JOIN),特别是数据量大的表之间的连接
    • 使用子查询(INNOT IN),导致数据库多长查询结果集
  • 缺乏限制条件:
    • 未使用LIMIT或条件过滤,导致返回大量无关数据
  • 排序和聚合操作:
    • ORDER BYGROUP BY操作未基于索引,导致全表扫描和排序

4.数据库资源问题

  • 连接池不足:
    • 数据库连接池耗尽,导致等待队列增加
  • 锁等待:
    • 并发事务导致锁竞争,如行锁、表锁等待时间过长
    • 死锁问题导致查询阻塞
  • 缓存失败:
    • 查询未命中数据库缓存,必须从磁盘读取数据

5.表结构问题

  • 表设计不合理:
    • 表字段过多,查询返回冗余数据
    • 数据库规范化设计过度,导致频繁的JOIN
  • 分区表未充分利用:
    • 查询条件未命中分区键,导致扫描所有分区

优化建议

  • 索引优化:设计合理的索引,避免索引失效
  • 分库分表:将大表拆分为小表,减少数据量
  • 慢查询优化:启用慢查询日志,针对耗时SQL进行调优
  • 读写分离:通过主从架构分担查询压力
  • 缓存使用:引入Redis、Memcached等缓存层,减少数据库访问
  • 事务管理:缩短事务时间,避免长时间锁竞争

🍅系统资源问题

  1. CPU过载
    • 高并发导致CPU使用率过高,线程池处理能力不足。
    • 复杂计算任务(如加密解密、文件处理)占用大量CPU资源。
  2. 内存不足
    • 服务内存泄漏或内存溢出,导致频繁GC(垃圾回收)。
    • 使用不合理的数据结构,占用大量内存空间。
  3. 磁盘I/O瓶颈
    • 日志写入、文件读写过于频繁,磁盘I/O压力过大。
    • SSD或HDD性能不足,影响数据存取效率。

🍅 配置与架构问题

  1. 线程池配置不合理
    • 线程池大小不足,导致请求堆积。
    • 超大线程池导致上下文切换成本过高。
  2. 服务架构问题
    • 单体架构无法承受高并发,导致瓶颈。
    • 微服务之间调用链过长,服务依赖环节过多。
  3. 负载均衡策略问题
    • 负载均衡未配置健康检查,流量分发到异常实例。
    • 负载分配不均,部分节点过载。

🍅优化建议

  • 代码层优化:梳理业务逻辑,优化算法与数据结构,移除阻塞代码。

  • 数据库优化:索引设计、缓存策略、分库分表、历史数据归档。

  • 缓存与队列优化:合理使用缓存,优化队列消费逻辑,监控积压情况。

  • 架构优化:通过服务拆分、负载均衡、水平扩展等手段提升服务能力。

  • 监控与诊断:通过监控工具或者监控埋点,识别瓶颈,优化慢点。

🍅通用的一些解决手段

  • 清除应用缓存,重新登录
  • 检查输入是否合理,比如大模型的prompt是否符合要求
  • APP可以检查版本是否最新、是否在维护期间

⭐️最后的话⭐️
总结不易,希望uu们不要吝啬你们的👍哟(^U^)ノ~YO!!如有问题,欢迎评论区批评指正😁

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/63210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI 建站:Durable

网址:https://app.durable.co 步骤 1) 登录 2)点击创建新业务 3)填写信息后,点击创建 4)进入业务 5)生成网站 6)生成完成后不满意的话可以自己调整 7)点击保存 8)发布 …

部署kafka并通过python操作

目录 一、安装JDK1.81、检查服务器是否已安装JDK2、若已安装JDK,进行卸载3、更新yum源4、搜索JDK1.8安装包5、安装JDK1.86、查看是否安装成功7、配置环境变量 二、安装Kafka1、下载并解压kafka部署包至/usr/local/目录2、修改server.properties3、修改/etc/profile4…

【Linux】 进程池 一主多从 管道通信

目录 1.代码介绍 2.channel 类 3.进程池类编写 4.主函数及其他 5. 源码 1.代码介绍 本文代码采用一主多从式(一个主进程(master)多个子进程(worker))通过管道进行通信,实现主进程分发任务&…

Ubuntu环境安装RabbitMQ

1.安装Erlang RabbitMq需要Erlang语⾔的⽀持,在安装rabbitMq之前需要安装erlang # 更新软件包 sudo apt-get update # 安装 erlang sudo apt-get install erlang 查看erlang版本 : erl 退出命令:halt(). 2. 安装RabbitMQ # 更新软件包 sudo apt-get update # 安装 …

力扣--199.二叉树的右视图

题目 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 提示: 二叉树的节点个数的范围是 [0,100] -100 < Node.val < 100 代码 class Solution { public List rightSideV…

Ubuntu Server 22.04.5 LTS重启后IP被重置问题

Ubuntu Server 22.04.5 LTS重启后IP被重置问题 最近在使用Ubuntu Server 22.04做项目开发测试时发现每次重启和关机后&#xff0c;所设置的静态IP地址都会回复到安装系统时所设置的ip Ubuntu Server 22.04 官网下载地址&#xff1a;Ubuntu官方下载地址 对虚拟机下安装Ubuntu感…

kube-proxy的iptables工作模式分析

系列文章目录 iptables基础知识 文章目录 系列文章目录前言一、kube-proxy介绍1、kube-proxy三种工作模式2、iptables中k8s相关的链 二、kube-proxy的iptables模式剖析1.集群内部通过clusterIP访问到pod的流程1.1.流程分析 2.从外部访问内部service clusterIP后端pod的流程2.1…

华为网络设备配置文件备份与恢复(上传、下载、导出,导入)

在日常运维工作中&#xff0c;会经常存在网络割接的情况&#xff0c;为了保证网络割接失败时能重新回退至原有配置&#xff0c;从而不影响原有的办公环境&#xff0c;在网络割接前的备份工作就非常有必要了。 备份方式&#xff1a;FTP 备份技术&#xff1a;PC客户端<---&g…

清风数学建模学习笔记——Topsis法

数模评价类&#xff08;2&#xff09;——Topsis法 概述 Topsis:Technique for Order Preference by Similarity to Ideal Solution 也称优劣解距离法&#xff0c;该方法的基本思想是&#xff0c;通过计算每个备选方案与理想解和负理想解之间的距离&#xff0c;从而评估每个…

[软件工程]九.可依赖系统(Dependable Systems)

9.1什么是系统的可靠性&#xff08;reliability&#xff09; 系统的可靠性反映了用户对系统的信任程度。它反映了用户对其能够按照预期运行且正常使用中不会失效的信心程度。 9.2什么是可依赖性&#xff08;dependablity&#xff09;的目的 其目的是覆盖系统的可用性&#x…

减少30%人工处理时间,AI OCR与表格识别助力医疗化验单快速处理

在医疗行业&#xff0c;化验单作为重要的诊断依据和数据来源&#xff0c;涉及大量的文字和表格信息&#xff0c;传统的手工输入和数据处理方式不仅繁琐&#xff0c;而且容易出错&#xff0c;给医院的运营效率和数据准确性带来较大挑战。随着人工智能技术的快速发展&#xff0c;…

汽车一键启动开关 、一键启动按键 、一键启动按钮

‌汽车一键启动按钮是智能汽车的重要部分&#xff0c;通常用于启动和关闭引擎‌。 ‌具体功能‌&#xff1a; ‌启动引擎‌&#xff1a;在许多现代汽车中&#xff0c;一键启动按键取代了传统的钥匙启动方式。只需轻轻按下一键启动按钮&#xff0c;车辆电源即被接通&#xff0c…

.NET用C#导入Excel数据到数据库

将Excel文件中的数据导入到数据库中不仅能够提升数据处理的效率和准确性&#xff0c;还能极大地促进数据分析和决策制定的过程。尤其在企业级应用中&#xff0c;Excel作为数据输入和初步整理的工具非常普遍&#xff0c;但其功能对于复杂查询、大规模数据管理和跨部门的数据共享…

python中数组怎么转换为字符串

1、数组转字符串 #方法1 arr [a,b] str1 .join(arr)#方法2 arr [1,2,3] #str .join(str(i) for i in arr)#此处str命名与str函数冲突&#xff01; str2 .join(str(i) for i in arr) 2、字符串转数组 #方法一 str_x avfg st_list list(str_x) #使用list()#方法二 list_s…

国内管理咨询公司哪家落地辅导做的好?

在当今快速变化的市场环境中&#xff0c;企业面临着前所未有的竞争压力与转型挑战。为了在这场没有硝烟的战争中脱颖而出&#xff0c;许多企业开始寻求外部专业力量的帮助&#xff0c;以期通过科学的管理咨询实现战略升级和业绩突破。而在众多的管理咨询公司中&#xff0c;思博…

Cursor vs VSCode:主要区别与优势分析

Cursor - The AI Code Editor 1. AI 集成能力 Cursor的优势 原生AI集成&#xff1a; # Cursor可以直接通过快捷键调用AI # 例如&#xff1a;按下 Ctrl K 可以直接获取代码建议 def complex_function():# 在这里&#xff0c;你可以直接询问AI如何实现功能# AI会直接在编辑器中…

python+selenium的八大定位方式

1.id定位 元素的id属 driver.find_element_by_id(By.ID,"username")2.name定位 driver.find_element_by_id(By.NAME,"username")#一个login_btn_list webdriver.find_elements(By.CLASS_NAME,)#多个元素组成的列表&#xff0c; login_btn_list[1].click…

RTCMultiConnection 跨域问题解决

js套件地址 https://github.com/muaz-khan/RTCMultiConnection server套件地址 https://github.com/muaz-khan/RTCMultiConnection-Server 要解决的就是server代码的跨域问题 原装写法&#xff1a; 解决写法&#xff1a; // 喜欢组合语法的自己组 const io new ioServer.S…

【JavaEE】多线程(6)

一、用户态与内核态 【概念】 用户态是指用户程序运行时的状态&#xff0c;在这种状态下&#xff0c;CPU只能执行用户态下的指令&#xff0c;并且只能访问受限的内存空间 内核态是操作系统内核运行时的状态&#xff0c;内核是计算机系统的核心部分&#xff0c;CPU可以执行所有…

Ajax:回忆与节点

一点回忆 面对我的Ajax学习&#xff0c;实现前后端交互&#xff0c;最开始我采用的使用网络寻找intellij IDEA Ultimate破解方法&#xff0c;然后最终成功&#xff0c;然后按照相关教程配置java ee项目&#xff0c;然后中间又去配置了Tomcat服务器&#xff0c;然后又去学习了一…