排查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
),特别是数据量大的表之间的连接 - 使用子查询(
IN
或NOT IN
),导致数据库多长查询结果集
- 查询包含多表关联(
- 缺乏限制条件:
- 未使用
LIMIT
或条件过滤,导致返回大量无关数据
- 未使用
- 排序和聚合操作:
ORDER BY
和GROUP BY
操作未基于索引,导致全表扫描和排序
4.数据库资源问题
- 连接池不足:
- 数据库连接池耗尽,导致等待队列增加
- 锁等待:
- 并发事务导致锁竞争,如行锁、表锁等待时间过长
- 死锁问题导致查询阻塞
- 缓存失败:
- 查询未命中数据库缓存,必须从磁盘读取数据
5.表结构问题
- 表设计不合理:
- 表字段过多,查询返回冗余数据
- 数据库规范化设计过度,导致频繁的
JOIN
- 分区表未充分利用:
- 查询条件未命中分区键,导致扫描所有分区
优化建议
- 索引优化:设计合理的索引,避免索引失效
- 分库分表:将大表拆分为小表,减少数据量
- 慢查询优化:启用慢查询日志,针对耗时SQL进行调优
- 读写分离:通过主从架构分担查询压力
- 缓存使用:引入Redis、Memcached等缓存层,减少数据库访问
- 事务管理:缩短事务时间,避免长时间锁竞争
🍅系统资源问题
- CPU过载
- 高并发导致CPU使用率过高,线程池处理能力不足。
- 复杂计算任务(如加密解密、文件处理)占用大量CPU资源。
- 内存不足
- 服务内存泄漏或内存溢出,导致频繁GC(垃圾回收)。
- 使用不合理的数据结构,占用大量内存空间。
- 磁盘I/O瓶颈
- 日志写入、文件读写过于频繁,磁盘I/O压力过大。
- SSD或HDD性能不足,影响数据存取效率。
🍅 配置与架构问题
- 线程池配置不合理
- 线程池大小不足,导致请求堆积。
- 超大线程池导致上下文切换成本过高。
- 服务架构问题
- 单体架构无法承受高并发,导致瓶颈。
- 微服务之间调用链过长,服务依赖环节过多。
- 负载均衡策略问题
- 负载均衡未配置健康检查,流量分发到异常实例。
- 负载分配不均,部分节点过载。
🍅优化建议
-
代码层优化:梳理业务逻辑,优化算法与数据结构,移除阻塞代码。
-
数据库优化:索引设计、缓存策略、分库分表、历史数据归档。
-
缓存与队列优化:合理使用缓存,优化队列消费逻辑,监控积压情况。
-
架构优化:通过服务拆分、负载均衡、水平扩展等手段提升服务能力。
-
监控与诊断:通过监控工具或者监控埋点,识别瓶颈,优化慢点。
🍅通用的一些解决手段
- 清除应用缓存,重新登录
- 检查输入是否合理,比如大模型的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 注入方式(基于 XML 配置) 在传统的 Spring 中,依赖注入(DI)通常通过 XML 配置文件来进行管理。常见的方式有两种: 通过 <property> 元素进行属性注入: <bean id&qu…...

Flink集群搭建整合Yarn运行
Flink 集群 1. 服务器规划 服务器h1、h4、h5 2. StandAlone 模式(不推荐) 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 ##内容:## j…...

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

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

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

蓝桥杯系列---class1
🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 我们今天会再开一个系列,那就是蓝桥杯系列,我们会从最基础的开始讲起,大家想要备战明年蓝桥杯的,让我们一起加油。 工具安装 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:标记一个方法为测试方法BeforeEach:标记的方法会在每个测试方法执行前执行AfterEach:标记的方法会在每个测试方法执行后执行BeforeAll:标记的方法会在所有测试方法执行前执行一次AfterAll࿱…...

数字信号处理-数学基础
来源哪都有,个人复习使用 一 积分 常用积分公式: 基本积分方法 凑微分法(也称第一换元法): 换元: 分部积分: 卷积 这里有动图解释: 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 数据处理中,分桶表是一个极具实用价值的功能,它相较于非分桶表能够实现更高效的采样,并且后续还可能支持诸如 Map 端连接等节省时间的操作。不过,值得注意的是,在向表写入数…...

[小白系列]Ubuntu安装教程-安装prometheus和Grafana
Docker安装prometheus 拉取镜像 docker pull prom/prometheus 配置文件prometheus.yml 在/data/prometheus/建立prometheus.yml配置文件。(/data/prometheus/可根据自己需要调整) global:scrape_interval: 15s # By default, scrape targets ev…...

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

数据分析思维案例:游戏评分低,怎么办?
【面试题】 某款手游在应用市场评分相比同类型游戏处于劣势。 请分析可能的原因并给出相关建议。 【分析思路】 一、明确问题 1. 明确业务指标 定义:应用市场评分一般指某一应用在某个应用市场上线以来的总体平均评分。 除“总体平均评分”以外,部分应用…...

【学习总结|DAY012】Javabean书写练习
一、主要代码 public class Phone {public Phone() {}public Phone(String brand, int price, String color) {this.brand brand;this.price price;this.color color;}String brand;int price;String color;public String getBrand() {return brand;}public void setBrand(…...

Mac环境下brew安装LNMP
安装不同版本PHP 在Mac环境下同时运行多个版本的PHP,同Linux环境一样,都是将后台运行的php-fpm设置为不同的端口号,下面将已php7.2 和 php7.4为例 添加 tap 目的:homebrew仅保留最近的php版本,可能没有你需要的版本…...

openEuler 知:安装系统
文章目录 前言图形化安装文本方式安装 前言 本文只介绍安装过程中需要特别注意的地方,常规的内容需要参考其它文档。 图形化安装 自定义分区: 说明:anaconda 默认分区,在 OSNAME.conf 中进行了配置,openEuler 默认根…...

Zephyr 入门-设备树与设备驱动模型
学习链接:https://www.bilibili.com/video/BV1L94y1F7qS/?spm_id_from333.337.search-card.all.click&vd_source031c58084cf824f3b16987292f60ed3c 讲解清晰,逻辑清楚。 1. 设备树概述(语法,如何配置硬件,c代码如…...

点云标注软件SUSTechPOINTS的安装和使用,自测win10和ubuntu20.04下都可以用
点云标注软件SUSTechPOINTS的安装和使用 github项目源码:https://github.com/naurril/SUSTechPOINTS gitee源码以及使用教程:https://gitee.com/cuge1995/SUSTechPOINTS 首先拉取源码 git clone https://github.com/naurril/SUSTechPOINTS最好是在cond…...

etcd资源超额
集群内apiserver一直重启,重启kubelet服务后查看日志发现一下报错: Error from server: etcdserver: mvcc: database space exceeded 报错原因: etcd服务未设置自动压缩参数(auto-compact) etcd 默认不会自动 compa…...

AndroidStudio-常见界面控件
一、Button package com.example.review01import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Button import android.widget.TextViewclass Review01Activity : AppCompatActivity() {override fun onCreate(savedInstanceStat…...

网络协议(TCP/IP模型)
目录 网络初识 网络协议 协议分层 协议拆分 分层 协议分层的优势 1.封装效果 2.解耦合 TCP/IP五层模型 协议之间配合工作(详解) 网络初识 网络核心概念: 局域网:若干电脑连接在一起,通过路由器进行组网。 …...

python 清华pip镜像源报HTTP error 403
报错信息 ERROR: HTTP error 403 while getting https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/52/79/a64937a2185b91a96cc5406e3ea58120980c725543d047e112fb3084a972/fake_useragent-2.0.0-py3-none-any.whl (from https://mirrors.tuna.tsinghua.edu.cn/pypi/we…...