排查bug的通用思路

news2025/2/25 16:56:51

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

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.coloradmin.cn/o/2256195.html

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

相关文章

前端路径“@/“的使用和配置

环境:vitets 需要安装types/node npm install types/node --save-dev在tsconfig.json中添加 如果有tsconfig.app.json和tsconfig.node.json文件,则在app.json中添加 "compilerOptions": {"baseUrl":".","paths&q…

node.js中实现GETPOST请求

创建基本的服务器 const express require(express); const indexRouter require(./router); // 引入路由 const app express(); const port 3000; // 挂载路由 app.use(/api, indexRouter); app.listen(port, () > {console.log(Server is running on http://localhost…

【Python】练习【24.12.8】

题目出处 《Python程序设计基础(第2版)》,李东方等 主编,电子工业出版社,北京,2020.1 第 3 章:《Python程序的基本流程控制》 题目描述 1、编写程序,从键盘输入两点的坐标(x1, y…

多项式拟合之Math.NET Numerics

**多项式拟合 今日新认识的工业编程思想之传感器测温;热敏电阻测温如何计算通过温度计算阻值的方式:多项式拟合,通常C#中使用Math.NET Numerics Math.NET Numerics 旨在为数值计算提供方法和算法 在科学、工程和日常使用中。涵盖的主题包括…

「Mac玩转仓颉内测版46」小学奥数篇9 - 基础概率计算

本篇将通过 Python 和 Cangjie 双语实现基础概率的计算,帮助学生学习如何解决简单的概率问题,并培养逻辑推理和编程思维。 关键词 小学奥数Python Cangjie概率计算 一、题目描述 假设有一个袋子中有 5 个红球和 3 个蓝球,每次从袋子中随机…

hhdb数据库介绍(10-45)

安全 数据加密 加密规则列表页 仅加载当前页面配置:添加、删除、编辑加密规则,触发局部同步加载。加载成功后,添加配置才能生效。同样也可以执行整体同步加载(页面右上角),来同步加密规则。 搜索&#x…

六安市第二届网络安全大赛复现

misc 听说你也喜欢俄罗斯方块? ppt拼接之后 缺三个角补上 flag{qfnh_wergh_wqef} 流量分析 流量包分离出来一个压缩包 出来一张图片 黑色代表0白色代表1 101010 1000 rab 反的压缩包 转一下 密码:拾叁拾陆叁拾贰陆拾肆 密文:4p4n5758…

深度学习入门课程学习笔记(第24周)

目录 摘要 Abstracts 一、何为决策树 1、决策树的组成 2、决策树的构建 二、基尼系数( CART 算法选用的评估标准) 三、决策树中的预剪枝处理(正则化) 1、限制决策树的深度 2、限制决策树中叶子结点的个数 3、限制决策树…

聊一聊常用类System

大家好,我是G探险者! 今天来聊一聊java常用类System。 事情的起因是项目里面使用了Jasypt 框架对配置项进行加密,主要是密码相关的配置,项目里面的application.yml有关密码的配置项,使用了占位符${PASSWORD}进行了占…

在windows系统用Anaconda搭建运行PyTorch识别安全帽项目的环境

一.背景 我期望基于开源项目实现工业场景中安全帽识别。之前的各种尝试,也不太顺利。发现安全帽识别的开源项目使用的是基于Python的PyTorch实现训练的。上一篇写了Python的安装,发现后续安装其他的并不方便。我为什么选择,下面再详细说原因。…

Elasticsearch入门之HTTP基础操作

RESTful REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在…

Unix、GNU、BSD 风格中 ps 参数的区别

注:本文为“不同风格中 ps 命令参数的区别”相关文章合辑。 未去重。 BSD 风格和 UNIX 风格中 ps 参数的区别 作者:Daniel Stori 译者:LCTT Name1e5s | 2017-06-17 10:53 One Last Question ps aux 以及 ps -elf 都是查看进程的方式&…

设计模式の单例工厂原型模式

文章目录 前言一、单例模式1.1、饿汉式静态常量单例1.2、饿汉式静态代码块单例1.3、懒汉式单例(线程不安全)1.4、懒汉式单例(线程安全,同步代码块)1.5、懒汉式单例(线程不安全,同步代码块&#…

深入理解Java的 JIT(即时编译器)

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…

重生之我在21世纪学C++—关系、条件、逻辑操作符

一、关系操作符 1、关系操作符介绍 用于比较的表达式,称为 “关系表达式”(relational expression),里面使用的运算符称为 “关系运算符”(relational operator),主要有下面 6 个: 运算符描述>大于运算符,用于比…

工作:SolidWorks从3D文件导出2D的DWG或DXF类型文件方法

工作:SolidWorks从3D文件导出2D的DWG或DXF类型文件方法 SolidWorks从3D文件导出2D的DWG或2D DXF类型文件方法(一)打开3D文件(二)从装配体到工程图(三)拖出想要的角度的图型(四&#…

Spring Cloud Alibaba:一站式微服务解决方案

一、简介 Spring Cloud Alibaba(简称SCA) 是一个基于 Spring Cloud 构建的开源微服务框架,专为解决分布式系统中的服务治理、配置管理、服务发现、消息总线等问题而设计。它集成了阿里巴巴开源的各种分布式服务技术,提供了一系列…

基于51单片机64位病床呼叫系统设计( proteus仿真+程序+设计报告+原理图+讲解视频)

基于51单片机病床呼叫系统设计( proteus仿真程序设计报告原理图讲解视频) 仿真图proteus7.8及以上 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0095 1. 主要功能: 基于51单片机的病床呼叫系统proteus仿…

windows10下,nvidia控制面板升级驱动后osgearth三维程序无法运行

osg系列文章目录 文章目录 osg系列文章目录一.前言二.解决办法 一.前言 windows10下,nvidia控制面板升级驱动后osgearth三维程序无法运行,情景如下: 笔者使用的是天选1笔记本,硬件配置如下 osgearth和osg对应的版本是: Osg3.4.1…

【计算机学习笔记】GB2312、GBK、Unicode等字符编码的理解

之前编写win32程序时没怎么关注过宽字符到底是个啥东西,最近在编写网络框架又遇到字符相关的问题,所以写一篇文章记录一下(有些部分属于个人理解,如果有错误欢迎指出) 目录 几个常见的编码方式Unicode和UTF-8、UTF-16、…