当前位置: 首页 > news >正文

排查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!!如有问题,欢迎评论区批评指正😁

请添加图片描述

相关文章:

排查bug的通用思路

⭐️前言⭐️ APP点击某个按钮没有反应/PC端执行某个操作后,响应较慢,通用的问题排查方法: 从多个角度来排查问题 🍉欢迎点赞 👍 收藏 ⭐留言评论 🍉博主将持续更新学习记录收获,友友们有任何问题可以在评…...

如何利用Python爬虫获得商品类目

在当今数字化时代,获取和分析数据的能力对于任何希望在市场上保持竞争力的企业来说都是至关重要的。对于电子商务平台和市场研究公司而言,获取商品类目数据尤为重要,因为这些数据可以帮助他们更好地理解市场趋势、优化产品目录并制定有效的营…...

如何通过 Windows 自带的启动管理功能优化电脑启动程序

在日常使用电脑的过程中,您可能注意到开机后某些程序会自动运行。这些程序被称为“自启动”或“启动项”,它们可以在系统启动时自动加载并开始运行,有时甚至在后台默默工作。虽然一些启动项可能是必要的(如杀毒软件)&a…...

大模型学习有什么发展前景?

前景人工智能大模型是指拥有超大规模参数(通常在十亿个以上)、复杂计算结构的机器学习模型。它通常能够处理海量数据,完成各种复杂任务,如自然语言处理、图像识别等。 2024年政府工作报告提出“发展新质生产力”,并将…...

Excel技巧:如何批量调整excel表格中的图片?

插入到excel表格中的图片大小不一,如何做到每张图片都完美的与单元格大小相同?并且能够根据单元格来改变大小?今天分享,excel表格里的图片如何批量调整大小。 方法如下: 点击表格中的一个图片,然后按住Ct…...

独著与编著的区别是?

独著和编著主要有以下区别: 一、创作性质 - 独著 - 独著是作者完全独立进行创作的作品。其内容是作者自己的研究成果、观点见解或者经验总结。作者从最初的选题构思,到资料收集、分析研究,再到内容撰写、修改润色等全过程都是独立完成的。…...

vue中pdf.js的使用,包括pdf显示,跳转指定页面,高亮关键词

目录 一、下载pdf.js 二、引入到本地的项目中 三、实现预览pdf 四、跳转到指定页面 五、利用pdf里面的find查找关键词 六、修改页面大小为实际大小 一、下载pdf.js https://github.com/mozilla/pdf.js 里面有很多的版本, 高版本的可能浏览器不兼容或者还要考…...

【Spring Boot】自动装配机制详解

1. 传统的 Spring 注入方式&#xff08;基于 XML 配置&#xff09; 在传统的 Spring 中&#xff0c;依赖注入&#xff08;DI&#xff09;通常通过 XML 配置文件来进行管理。常见的方式有两种&#xff1a; 通过 <property> 元素进行属性注入&#xff1a; <bean id&qu…...

Flink集群搭建整合Yarn运行

Flink 集群 1. 服务器规划 服务器h1、h4、h5 2. StandAlone 模式&#xff08;不推荐&#xff09; 2.1 会话模式 在h1操作 #1、解压 tar -zxvf flink-1.19.1-bin-scala_2.12.tgz -C /app/#2、修改配置文件 cd /app/flink-1.19.1/conf vim conf.yaml ##内容&#xff1a;## j…...

Linux Ubuntu 安装配置RabbitMQ,springboot使用RabbitMQ

rabbit-Ubuntu 一篇文章学会RabbitMQ 在Ubuntu上查看RabbitMQ状态可以通过多种方式进行&#xff0c;包括使用命令行工具和Web管理界面。以下是一些常用的方法&#xff1a; 1-使用systemctl命令&#xff1a; sudo systemctl start rabbitmq-server sudo systemctl status ra…...

云数据库 MongoDB

MongoDB 是一个基于文档的 NoSQL 数据库&#xff0c;它与传统的关系型数据库不同&#xff0c;采用的是灵活的文档结构&#xff08;类似 JSON 格式&#xff09;。MongoDB 是开源的&#xff0c;且高度可扩展&#xff0c;通常用于处理大量的非结构化或半结构化数据。 云数据库 Mon…...

Ionic 8.4 简介

Ionic 是一个用于开发混合移动应用、渐进式Web应用&#xff08;PWA&#xff09;以及桌面应用的开源框架。它结合了 Angular、React 或 Vue.js 等现代前端框架与 Cordova/PhoneGap 的力量&#xff0c;允许开发者使用 Web 技术&#xff08;HTML, CSS, JavaScript&#xff09;构建…...

蓝桥杯系列---class1

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 我们今天会再开一个系列&#xff0c;那就是蓝桥杯系列&#xff0c;我们会从最基础的开始讲起&#xff0c;大家想要备战明年蓝桥杯的&#xff0c;让我们一起加油。 工具安装 DevC…...

vue3+elementPlus封装的一体表格

目录结构 源码 exportOptions.js export default reactive([{label: 导出本页,key: 1,},{label: 导出全部,key: 2,}, ])index.vue <template><div class"flex flex-justify-between flex-items-end"><div><el-button-group><slot name…...

Junit5 单元测试入门

基础知识 常用注解含义 Test&#xff1a;标记一个方法为测试方法BeforeEach&#xff1a;标记的方法会在每个测试方法执行前执行AfterEach&#xff1a;标记的方法会在每个测试方法执行后执行BeforeAll&#xff1a;标记的方法会在所有测试方法执行前执行一次AfterAll&#xff1…...

数字信号处理-数学基础

来源哪都有&#xff0c;个人复习使用 一 积分 常用积分公式&#xff1a; 基本积分方法 凑微分法(也称第一换元法)&#xff1a; 换元&#xff1a; 分部积分&#xff1a; 卷积 这里有动图解释&#xff1a; https://mathworld.wolfram.com/Convolution.html 欧拉公式 e i x…...

【Exp】# Microsoft Visual C++ Redistributable 各版本下载地址

Microsoft官方页面 https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads Redistributable 2019 X86: https://aka.ms/vs/16/release/VC_redist.x86.exe X64: https://aka.ms/vs/16/release/VC_redist.x64.exe Redistributable 201…...

Hive 分桶表的创建与填充操作详解

Hive 分桶表的创建与填充操作详解 在 Hive 数据处理中&#xff0c;分桶表是一个极具实用价值的功能&#xff0c;它相较于非分桶表能够实现更高效的采样&#xff0c;并且后续还可能支持诸如 Map 端连接等节省时间的操作。不过&#xff0c;值得注意的是&#xff0c;在向表写入数…...

[小白系列]Ubuntu安装教程-安装prometheus和Grafana

Docker安装prometheus 拉取镜像 docker pull prom/prometheus 配置文件prometheus.yml 在/data/prometheus/建立prometheus.yml配置文件。&#xff08;/data/prometheus/可根据自己需要调整&#xff09; global:scrape_interval: 15s # By default, scrape targets ev…...

Flask使用长连接

Flask使用flask_socketio实现websocket Python中的单例模式 在HTTP通信中&#xff0c;连接复用&#xff08;Connection Reuse&#xff09;是一个重要的概念&#xff0c;它允许客户端和服务器在同一个TCP连接上发送和接收多个HTTP请求/响应&#xff0c;而不是为每个新的请求/响…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...