服务器执行MySQL耗时问题解决全过程
点击上方“终端研发部”,选择“星标”
回复“资源”,领取全网最火的Java核心知识总结~
正文
大概过程
在测试环境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` setcurrent_value=current_value+step,next_value=next_value+stepwhere table_name=tableName;
select for update,给这个表加了排它锁,阻止其它事务取得相同数据集的共享读锁和排他写锁,同时,这个序列表表中,用来检索的字段没有加索引,在InnoDB行锁机制中:
由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键(在我们的场景中,就是查询时用到的table_name),是会出现锁冲突的。
所以了解到其它团队因为查询这个表产生事务问题,造成死锁,这个序列表被锁住了。
由于这个自增序列表每个团队都在使用,所以当时测试环境中,经常有dao层超时错误,最终将这些阻塞的线程kill掉,为序列表加了索引,解决了问题。
小结
下次遇到MySQL执行耗时的情况,排除了代码问题之后,要去看数据库是否有死锁的情况存在,观察有没有被阻塞的线程,排查被阻塞的线程具体info,定位到具体问题。
出处:https://juejin.im/post/5ce906a3e51d455a2f2201dc
编辑:尹文敏
2019,我迟来的总结
为什么说重启能解决90%的问题
重磅!Tomcat 爆出高危漏洞,你升级了没?
32岁程序员,失业4个月45次面试经历,与君共勉
重磅!Android Studio 3.6 发布,究竟有什么新功能?
IntelliJ IDEA 快捷键终极大全,速度收藏!
相信自己,没有做不到的,只有想不到的
在这里获得的不仅仅是技术!
喜欢就给个“在看”
服务器执行MySQL耗时问题解决全过程相关推荐
- mysql服务端执行sql_服务器执行MySQL耗时问题解决全过程
正文 大概过程 在测试环境Docker容器中,在跨进程调用服务的时候,A应用通过Dubbo调用B应用的RPC接口,发现B应用接口超时错误,接着通过debug和日志,发现具体耗时的地方在于一句简单SQL ...
- 记一次服务器执行MySQL耗时问题
墨墨导读:本篇记录一次服务器执行MySQL耗时的问题,耗时的问题在于一句SQL执行,耗时超过1000ms,如何解决这个问题?通过这篇文章了解下. 大概过程 在测试环境Docker容器中,在跨进程调用服 ...
- #Tomcat# 本地正常但是部署到服务器后,mysql插入中文乱码问题解决!
一百度,几乎都是大同小异的答案,全都是互相转载的文章.帮助很小 如果你遇到了**Tomcat本地正常!但是部署到服务器后,mysql插入中文乱码问题解决!**这样的问题. 常规的方式都无效,不妨试试下 ...
- Tomcat本地正常!但是部署到服务器后,mysql插入中文乱码问题解决!
一百度,几乎都是大同小异的答案,全都是互相转载的文章.帮助很小 如果你遇到了**Tomcat本地正常!但是部署到服务器后,mysql插入中文乱码问题解决!**这样的问题. 常规的方式都无效,不妨试试下 ...
- php执行mysql insert,当执行mysql insert 时插入两条是咋回事
当执行mysql insert 时插入两条是怎么回事? 本帖最后由 Eason_____________ 于 2013-07-25 11:25:44 编辑 //做了一个手机上传图片到服务器的功能.但是 ...
- windows下bat处理执行Mysql的sql语句
这篇文章主要介绍了windows下bat批处理执行Mysql的sql语句,需要的朋友可以参考下 有时候我们需要用bat来定时执行mysql那么就可以参考下面的代码 直接上代码: @ECHO OFF S ...
- android与mysql数据库同步_android开发 如何通过web服务器访问MYSQL数据库并且使其数据同步到android SQLite数据库?...
通过web服务器访问MYSQL数据库有以下几个过程: 1.在MySql下创建自己的数据库和自己的表单 2.连接数据库. 3.访问数据库 1.创建web工程 (服务器端) 在Myeclipse下新建一个 ...
- python自动化脚本实例100条-自动化运维基础实例解析-Python批量登录到服务器执行任务...
开发背景: 根据信息系统安全等级保护的要求,需要对IDC所有数据库服务器进行安全检查,以确认服务器的安全设置是否符合等级保护要求,需要在所有数据库服务器上执行以下命令: wget http://10. ...
- ubuntu+终端不能启动mysql数据库_强制重启Ubuntu服务器后Mysql无法启动
本文将为您描述强制重启Ubuntu服务器后Mysql无法启动,具体完成步骤: 强制重启服务器后启动mysql不断报错误"code=exited","failed" ...
- 远程连接云服务器的MySQL数据库
目录 1.查询权限 2.更新权限 2.1执行该SQL语句: 2.2刷新权限 3.开放MySQL的端口(此方法仅适用于云服务器) 3.1打开服务器后台管理: 3.2查看防火墙是否开放了MySQL的330 ...
最新文章
- 由laravel 5.5无法获取url中的参数引发的apache的.htaccess文件问题
- AutoLayout框架之序言
- 看完Andoird9.0 Pie的隐藏特性,我买了SSL证书
- [转]notepad++ java编码,输出中文字符时,编译出错
- 如何高效管理BI报表的需求
- C#LeetCode刷题之#4-两个排序数组的中位数(Median of Two Sorted Arrays)
- spring-aop 的注释用法
- mybatis查询返回null解决方案
- drawio流程图软件_Win10 一般软件个人收集
- UOJ14 UER #1 DZY Loves Graph(最小生成树+并查集)
- 使用 sequelize 在 node 环境下操作 Mysql
- java计算机毕业设计校园流浪猫图鉴管理系统的设计与实现源码+数据库+系统+lw文档+部署
- u盘安全弹出有什么用?数据丢失还能恢复吗
- 通过示例理解数据库相关概念(五、无损连接,无损分解,依赖保持性等)
- python3实现base64编码
- VMware 配置局域网内访问
- 强烈安利:小顽简报,一款高效实用的PPT新插件
- 单片机课程设计-基于单片机直流电机控制器设计
- 2022年基础设施行业10大技术应用趋势
- 小型水库雨水情测报和大坝安全监测
热门文章
- 机器人布里茨哪个皮肤好看_LOL全英雄皮肤盘点推荐D32:蒸汽机器人布里茨 苹果机器人...
- 统计学习之第一天(可汗学院公开课:统计学)
- 号称“不限速“的阿里网盘,官宣要停止了,寿命仅仅1年
- 阿里云网盘资源免费分享论坛正式上线
- 奇偶性与魔术(一)——奇偶性的数学本质
- python爬虫:模拟登录新浪微博并实现cookies保存,详细讲一下rsa
- obs听到了自己的回音_直播连麦过程中回声回音解决方式
- 用opencv和python读取医学图片:mha
- MathType编辑的公式与文字不对齐
- linux 命令详解 大于号_linux 命令中的大于号、小于号的作用