mysql服务端执行sql_服务器执行MySQL耗时问题解决全过程
正文
大概过程
在测试环境Docker容器中,在跨进程调用服务的时候,A应用通过Dubbo调用B应用的RPC接口,发现B应用接口超时错误,接着通过debug和日志,发现具体耗时的地方在于一句简单SQL执行,但是耗时超过1000ms。
通过查看数据库的进程列表,发现是有死锁锁表了,很多进程状态status处于'sending data',最后为锁住的表添加索引,并且kill掉阻塞的请求,解除死锁,服务速度恢复正常。
下面记录的是大致排查过程:
通过观察业务代码,确认没有内存溢出或者其它事务问题,于是只能考虑Docker环境的数据库和jvm底层详情了。
使用Druid监控SQL执行状态
通过日志,发现有一句SQL严重超时,一句简单SQL,原本是批量插入多条记录,为了定位问题,测试时Mybatis只插入一条记录,但即便如此,还是耗时10秒
于是打算使用阿里巴巴的数据库连接池Druid进行监控,监控SQL效果如下:
在SQL监控Tab中,可以看到执行SQL的具体情况,包括某条SQL语句执行的时间(平均、最慢)、SQL执行次数、SQL执行出错的次数等
上面显示的是正常情况下,时间单位是ms,正常的SQL一般在10ms之内,数据量大的控制在30ms之内,这样用户的使用体验感才会良好。
所以说之前的1000ms,是不可接受的结果。
通过JMC远程监控Tomcat
J****MC(java mission control)是jdk自带的一个监控工具,在jdk的bin目录下(java大法好,该目录下有很多实用的工具)。
此处加了一个tomcat无验证模式:
#在tomcat的conf目录下的catalina.sh增加如下java启动参数:
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=8888
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-XX:+UnlockCommercialFeatures -XX:+FlightRecorder
下面是自己本地调试的截图
然后打开jmc,创建一个JMX连接,输入对应的ip和JMX端口。
接着可以设定一段时间内的飞行监控,监测这一分钟内jvm具体参数
当时调试的时候,发现内存使用、CPU占用率、线程状态也挺正常的,没有发现明显的异常错误,效果如下图:
唯一比较耗时的是在代码tab页中,**当时发现了大量的I/O,比上图的比例还高,当时大概占了80%,查看调用树,很多循环tcp socket连接,**考虑到应用中本来就有很多需要io以及netty也需要tcp连接,所以大概排除了jvm虚拟机的问题,然后就去排查MySQL的问题。
排查MySQL
在了解MySQL锁概念的时候,由于现在使用的比较多的是InnoDB,所以可以着重看看InnoDB锁问题。
直接执行SQL语句 通过DEBUG代码,从mybatis中取出映射后的SQL语句,在MySQL客户款直接执行SQL和Explain查看执行计划,速度都很快,排除了SQL语句的问题。
查看MySQL线程列表show processlist;
从图中可以看出,有些线程的状态处于sending data,查阅资料:所谓的“Sending data”并不是单纯的发送数据,而是包括“收集 + 发送 数据”。
然后后面一列info显示的是具体信息,是查询用来生成主键ID的函数,之前速度都很快,为啥突然就这么慢呢,于是回过头去查看该函数:
select next_value into ret_val from `xxx` where table_name=tableName for update;
update `xxx` set
current_value=current_value+step,
next_value=next_value+step
where table_name=tableName;
select for update,给这个表加了排它锁,阻止其它事务取得相同数据集的共享读锁和排他写锁,同时,这个序列表表中,用来检索的字段没有加索引,在InnoDB行锁机制中:
由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键(在我们的场景中,就是查询时用到的table_name),是会出现锁冲突的。
所以了解到其它团队因为查询这个表产生事务问题,造成死锁,这个序列表被锁住了。
由于这个自增序列表每个团队都在使用,所以当时测试环境中,经常有dao层超时错误,最终将这些阻塞的线程kill掉,为序列表加了索引,解决了问题。
小结
下次遇到MySQL执行耗时的情况,排除了代码问题之后,要去看数据库是否有死锁的情况存在,观察有没有被阻塞的线程,排查被阻塞的线程具体info,定位到具体问题。
出处:https://juejin.im/post/5ce906a3e51d455a2f2201dc
编辑:尹文敏
mysql服务端执行sql_服务器执行MySQL耗时问题解决全过程相关推荐
- 命令行模式:MySQL服务端的登录和退出
登录 mysql [-h127.0.0.1] [-P3306] -uroot -p[密码] 参数:-h : MySQL服务所在的主机IP-P : MySQL服务端口号, 默认3306-u : MySQ ...
- epel源mysql版本_linux增加epel源,yum安装nignx,脚本安装mysql服务端,shell脚本监控网站页面...
epel是一种yum仓库,里面提供了更多.更丰富linux软件,但是,它不是默认yum仓库,我们需要手工添加这个yum源. 添加epel源 然后,找到fedora-epel, 在列表里找到:6serv ...
- linux增加epel源,yum安装nignx,脚本安装mysql服务端,shell脚本监控网站页面
epel是一种yum仓库,里面提供了更多.更丰富linux软件,但是,它不是默认yum仓库,我们需要手工添加这个yum源. 添加epel源 参考:http://freeloda.blog.51cto. ...
- NodeJS+Express+mySQL服务端开发详解
NodeJS+Express+mySQL服务端开发详解 随着NodeJS的发展,现在已经被很多人熟知,NodeJS已经成为了前端开发人员必备的技能.本文不会对NodeJS过多介绍 如果你感兴趣可以访问 ...
- windows环境下MySQL服务端和客户端安装,超详细
windows环境下MySQL服务端和客户端安装,超详细 MySQL简介 MySQL的安装步骤 服务端安装 客户端安装 MySQL简介 MySQL是关系型数据库,由n张互相关联的表组成.一般是c或c+ ...
- 服务端指南 数据存储篇 | MySQL(03) 如何设计索引
改善性能最好的方式,就是通过数据库中合理地使用索引,换句话说,索引是提高 MySQL 数据库查询性能的主要手段.在下面的章节中,介绍了索引类型.强制索引.全文索引. 原文地址:服务端指南 数据存储篇 ...
- MySQL服务端的安装
相信学计算机专业的朋友应该对MySQL数据库都不会陌生吧,如果连MySQL都不知道那么水平着实有待考量. MySQL是一个数据库,数据库的专业术语解释:数据库(Database)是按照数据结构来组织. ...
- mysql服务端下载安装详细教程
本地安装mysql服务端详细教程 下载地址:https://dev.mysql.com/downloads/mysql/ 下载成功后解压在本地,解压后内容如下 配置环境变量,高级系统设置–>系统 ...
- mac bash file密码_Mac系统 | 菜鸟程序员项目模拟数据迁移,会安装Mysql服务端吗
在中小公司做项目,关系型数据库一般用的比较多的是MySQL.项目从开发到上线的过程中,公司会提供虚拟机服务器数据库中的数据给自己进行本地开发和测试.在开发过程中,我也发现公司只是提供数据库服务端的ip ...
最新文章
- OpenKruise 如何实现 K8s 社区首个规模化镜像预热能力
- 开发海思3520a遇到的问题
- springMVC笔记系列——RequestParam注解
- java正则表达式判断手机号_正则表达式学习之简单手机号和邮箱练习
- java btrace_BTrace for Java应用程序简介
- python嵌入c代码_怎样把Python代码嵌入到C程序
- 课程目标 线程 java 1615387415
- 学习一下spring-cloud-function中官方修复的一个问题
- https://sysdig.com/
- html正方形对话框素材,10种展示效果的弹出层对话框插件method.js
- c语言变长数组参数,使用gdb跟踪C语言中变长数组的实现
- python百度关键词自动提交订单_百度链接提交-主动推送Python版
- 常见的Wi-Fi协议------802a/b/g/n/ac系列
- Vue监听浏览器刷新
- 计算机一级如何加脚注,用word添加脚注图文的方法是什么?这个计算机技能不会就晚了...
- python语言后缀_在Python语言中,可以作为源文件后缀名的是
- The Sandbox 与《足球小将》达成合作,将流行的足球漫画及动画带入元宇宙
- 成都梵羽汇:抖音任务中心如何操作呢?
- 手机百度打不开html网页,手机百度为什么打不开网页 网页打不开解决方法
- python 期货交易接口_期货数据接口(期货数据接口 python)
热门文章
- linux xmanager端口,6、Xmanager连接Linux桌面
- 常用表观遗传学数据库汇总
- 原来珠宝门店管理系统这么妙,你可能还不知道!
- mysql 设计超市订单图_利用maven模板写一个超市订单管理系统(1)项目基础搭建
- 计算机0和9代表什么,1至9在风水上有什么含义?0到9数字代表什么风水?
- Pr:导出页面之预览与摘要窗口
- 飞车老显示pvp服务器断开连接,lol客户端出现PVP.net断开临时解决方案公告
- 哆啦导航 哆啦A梦新番 剧场版 新番 中篇 哆啦A梦七小子 机器猫吧大全
- BGP防环,路由反射器,BGP联盟
- mysql8.0最低需要多少内存_MySQL8.0内存相关参数总结