记压测环境数据表死锁导致接口长时间pending问题

news2024/9/21 2:34:25

背景

压测过程中测试小伙伴反映某个页面长时间loading无法打开,接下来我们排查一下,既然是压测环境,那么就需要排除服务器资源层面的因素,现在考验的就是在系统资源不足时系统的情况,那么我们就直接从代码层面开始排查。

排查思路

在浏览器中打开F12,复现问题,确定那个接口存在性能问题,接下来需要确定接口内部的实现逻辑是什么样,做了哪些事情,调用了哪些服务,分析接口存在性能问题的根本原因,在排查过程中,着重留意是否在for循环中执行数据库操作、调用第三方接口、调用第三方接口耗时,执行的SQL是否有性能问题。随后确定优化方案,验证效果发版。

MyBatis foreach 标签数据量较大时存在性能问题,在接口分析中按SQL性能问题处理。

随版本迭代以及需求变更,接口中的逻辑可能越来越臃肿,关联查询的表越来越多,查询的数据量越来越大,为保证业务闭环,新增与更新可能要同时操作N张表,以上均是影响接口性能的因素。

排查过程

复现排查过程中发现,有一条慢SQL执行时间过长,导致查询的对应表产生了死锁,那么这就是接口长时间pending的愿意了。

解决方案

由于对应表处于死锁状态,那么首先需要将死锁的表释放,杀掉对应的查询进程。那么需要执行以下命令:

#以下命令需要同时执行
show OPEN TABLES where In_use > 0;
​
SHOW PROCESSLIST;
​
SELECT * FROM information_schema.INNODB_TRX;
​
SELECT * FROM information_schema.INNODB_LOCKs;
 
 #根据进程号kill
  kill  pid

解除锁后,使用explain语句查询执行计划,确认由于业务变更,关联查询表过多,在数据量较大时导致SQL性能极具下降,该SQL所在的事务处理时间过长,导致其他事务等待锁的时间过长,最终导致死锁。

阿里巴巴开发手册中建议:查询时关联表不要超过三张。

基于此建议,我们将原SQL语句进行拆分,以避免在造成长事务造成数据库表死锁导致接口长时间pending的问题。经过测试问题得解。

知识扩展-如何避免死锁

引用什么是MySQL死锁?如何避免死锁?

MYSQL造成死锁的原因

  1. 并发访问:当多个事务并发访问同一资源时,容易出现死锁。
  2. 事务请求资源顺序不当:如果多个事务对相同的资源加锁的顺序不同,也容易引发死锁。
  3. 锁超时:如果一个事务持有锁的时间过长,例如有一个事务处理时间太长了,就可能导致其他事务等待锁的时间过长,最终导致死锁。
  4. 锁粒度过大:如果锁的粒度过大,例如一个事务锁住几十条数据,甚至表锁,那么在事务并发访问同一资源时,容易造成死锁。

如何分析死锁

  1. 错误日志: MySQL的错误日志中记录了死锁信息,包括死锁发生的时间、持有锁的线程、等待锁的线程等。
  2. SHOW ENGINE INNODB STATUS:可以使用该命令查看InnoDB引擎的状态信息,包括死锁的详细信息。其中,LATEST DETECTED DEADLOCK部分列出了最近的死锁事件,包括持有锁和等待锁的事务ID以及锁的详细信息。
  3. information_schema表: MySQL提供了一些用于查看锁和事务状态的系统表。例如,information_schema.INNODB_TRX表包含当前执行的事务列表,information_schema.INNODB_LOCKS表包含当前的锁列表,information_schema.INNODB_LOCK_WAITS表包含当前的锁等待列表等。
  4. 如果使用阿里云之类的云数据库,通常监控系统可以查询死锁信息。

如何解决MYSQL死锁

  1. 重试:当出现死锁时,可以重试该事务,让其重新尝试执行。重试的次数可以限制,超过一定次数后可以选择中止该事务。
  2. 加锁顺序:尽量保证不同的事务对锁的访问顺序一致,这样可以避免死锁的产生。比如,所有事务都按照相同的顺序获取锁,或者按照相反的顺序获取锁。
  3. 缩小事务范围:可以将一个大事务拆分成多个小事务,每个小事务只涉及部分数据,这样可以减少死锁的可能性。
  4. 提高隔离级别:如果业务允许,可以将隔离级别提高到SERIALIZABLE,这样可以保证读取数据时的一致性,并且避免了读取到其他事务正在修改的数据,减少死锁的可能性。
  5. 减少锁定时间:尽量减少事务占用锁的时间,比如可以在需要修改的时候再获取锁,而不是一开始就获取锁。
  6. 使用索引:合理的索引设计可以避免全表扫描,减少锁的竞争和等待时间,从而减少死锁的发生。

思考与建议

  • 任何排查方式都不如在写代码时多一些思考,多一个极限条件设想。我们不仅要想办法解决问题,更需要尽量避免可能出现的问题。
  • 编程要养成“分而治之”的习惯,以避免和解决大数据量下水桶最短板导致的问题。

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

在我的QQ技术交流群里(技术交流和资源共享,广告勿扰)

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

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

相关文章

PADS-LAYOUT菜单及工具说明

目录 1 材料清单输出 2 元件属性检查 3 材料清单制作 4 原理图生成PDF 4.1PDF文件生成 4.2PDF文件查阅 4.3PDF文件打印 5 PADS转Altium Designer 5 Altium Designer转PADS 5.1 直接导入法 5.2 软件生成法 6 PADS层定义 7 设计规则输出 7.1 PADS对象管理 7.2 PAD…

pandas---分箱(离散化处理)、绘图、交叉表和透视表

1. 分箱 分箱操作就是将连续型数据离散化。分箱操作分为等距分箱和等频分箱. 1.1 等宽分箱 pandas.cut(x, bins, rightTrue, labelsNone, retbinsFalse, precision3, include_lowestFalse, duplicatesraise, orderedTrue) x:要分箱的一维数组或者 Series。 bi…

分布式系统概念和设计——分布式共享内存

分布式系统概念和设计 分布式共享内存 分布式共享内存是在不共享物理内存的计算机之间实现数据的共享的一个抽象。 有一个底层运行的系统保证其透明性,但是进程还是根据内存的分布处理物理内存的分布式能力 DMS最关键点: 不需要关心数据的通信&#xff…

百家号热议排名代发

百家号热议排名代发,百度排名怎么做,有什么技巧或者方式方法吗#百度首页关键词排名#百度推广#百度竞价推广#百度关键词排名#百度首页关键词排名方法# 其实百度推广并不赚钱,也没有你想象中的那么好做。 我说三点, 99% 的用户都遇…

C语言之动态内存分配讲解(2)

动态内存函数的介绍 在开始本章节之前,我们来复习一下动态内存分配(1)中所讲到的知识,看下面目录一和目录二 为什么存在动态内存分配 我们已经掌握的内存开辟方式有 int val 20;//在栈空间上开辟四个字节 char arr[10] {0};/…

Go语言并发之扇入和扇出

1、Go语言并发之扇入和扇出 编程中经常遇到扇入和扇出两个概念,所谓的扇入是指将多路通道聚合到一条通道中处理,Go 语言最简单的扇入 就是使用 select 聚合多条通道服务;所谓的扇出是指将一条通道发散到多条通道中处理,在Go语言…

揭开视频识别(动作识别)的神秘面纱(附代码和demo)!

PaddleDetection 在计算机视觉中,视频识别和检测是一个重要的方向。历年来CVPR和ICCV等顶会文章中这类论文是最多的。视频识别和检测也是最有落地场景前景的,像人脸识别、动作检测、异常检测、行人重识别、行人计数等都是很有落地前景的应用方向。本文介…

shardingsphere第三课各种功能点及核心源码

一、功能点 1.审计功能 分片审计功能是针对数据库分片场景下对执行的 SQL 语句进行审计操作。分片审计既可以进行拦截操作,拦截系统配置的非法 SQL 语句,也可以是对 SQL 语句进行统计操作。 目前ShardingSphere内置的分片审计算法只有一个,…

C语言指针初进阶知识汇总

目录 1 指针 1.1 指针是乜嘢 1.2 指针的声明 1.3 运算符 1.4 简单的小例子们 1.5 指针的运算 1.5.1 指针加减运算 1.5.2 间址运算 1.5.3 指针的相减 两个地址之间的偏移量 2 指针与数组 2.1 指针和一维数组 2.1.1 定义数组及指针变量 2.1.2 能动手就不要瞎扯 2.…

当 Rokid 遇上函数计算

作者:王彬(阿里云解决方案架构师)、姚兰天(Rokid 技术专家)、聂大鹏(阿里云高级技术专家 ) 公司背景和业务 Rokid 创立于2014年,是一家专注于人机交互技术的产品平台公司。Rokid 通…

2023/6/18周报

目录 摘要 论文阅读 1、题目和现有问题 2、工作流程 3、图神经网络模块 4、注意力网络 5、实验结果和分析 深度学习 1、GNN和GRU的融合 2、相关公式推导 总结 摘要 本周在论文阅读上,对基于图神经网络和改进自注意网络的会话推荐的论文进行了学习&#…

DPdisPCA算法原理笔记

概要 本文简单理顺《Differentially Private Distributed Principal Component Analysis》论文中的算法原理,它主要提出了一种基于差分隐私的分布式PCA算法,研究了该算法在实验数据以及真实数据中的表现,在参数相同的情况下本算法取得了和没…

OpenGL之深度测试

文章目录 深度测试深度测试函数源代码 深度测试 深度缓冲就像颜色缓冲(Color Buffer)(储存所有的片段颜色:视觉输出)一样,在每个片段中储存了信息,并且(通常)和颜色缓冲有着一样的宽度和高度。深…

Python3 条件控制与循环语句 | 菜鸟教程(八)

目录 一、Python3 条件控制 (一)Python 条件语句是通过一条或多条语句的执行结果(True 或者 False)来决定执行的代码块。 (二)if 语句 1、Python中if语句的一般形式如下所示: 2、注意&#…

<Linux开发>驱动开发 -之-platform 驱动

<Linux开发>驱动开发 -之-platform 驱动 交叉编译环境搭建: <Linux开发> linux开发工具-之-交叉编译环境搭建 uboot移植可参考以下: <Linux开发> -之-系统移植 uboot移植过程详细记…

基于SpringBoot+Vue的民宿管理平台系统设计与实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

某音短视频评论采集翻页(移动安全篇)

本章测试一个作品的评论及翻页: 以及前面的抓x包方式,在专栏里也有很多,xposed抓包过sslping,通用版本等; https://codeooo.blog.csdn.net/category_11500477.html 翻页通过页码来控制: # -*- coding:…

Docker部署(1)——将jar包打成docker镜像并启动容器

在代码编写完成即将部署的时候,如果采用docker容器的方法,需要将jar包打成docker镜像并通过镜像将容器启动起来。具体的步骤如下。 一、首先下载java镜像 先使用docker search java命令进行搜索。 然而在拉取镜像的时候要注意不能直接去选择pull java ,…

kubernetes(k8s)理论篇

注意:kubeadm与docker是有版本要求的。 如果版本不兼容,初始化 kubeadm是会出现以下问题。 学习k8s掌握知识 基础概念 什么是 Pod 控制器类型 K8S 网络通讯模式 Kubernetes 构建 K8S 集群 资源清单 资源 掌握资源清单的语法 编写 Pod 掌握 Pod 的…

C国演义 [第四章]

第四章 全排列题目理解步骤树形图递归函数递归结束条件单层逻辑 代码 全排列II题目理解步骤递归函数递归结束条件单层逻辑 代码 全排列 力扣链接 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输…