点击上方“终端研发部”,选择星标

回复“资源”,领取全网最火的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耗时问题解决全过程相关推荐

  1. mysql服务端执行sql_服务器执行MySQL耗时问题解决全过程

    正文 大概过程 在测试环境Docker容器中,在跨进程调用服务的时候,A应用通过Dubbo调用B应用的RPC接口,发现B应用接口超时错误,接着通过debug和日志,发现具体耗时的地方在于一句简单SQL ...

  2. 记一次服务器执行MySQL耗时问题

    墨墨导读:本篇记录一次服务器执行MySQL耗时的问题,耗时的问题在于一句SQL执行,耗时超过1000ms,如何解决这个问题?通过这篇文章了解下. 大概过程 在测试环境Docker容器中,在跨进程调用服 ...

  3. #Tomcat# 本地正常但是部署到服务器后,mysql插入中文乱码问题解决!

    一百度,几乎都是大同小异的答案,全都是互相转载的文章.帮助很小 如果你遇到了**Tomcat本地正常!但是部署到服务器后,mysql插入中文乱码问题解决!**这样的问题. 常规的方式都无效,不妨试试下 ...

  4. Tomcat本地正常!但是部署到服务器后,mysql插入中文乱码问题解决!

    一百度,几乎都是大同小异的答案,全都是互相转载的文章.帮助很小 如果你遇到了**Tomcat本地正常!但是部署到服务器后,mysql插入中文乱码问题解决!**这样的问题. 常规的方式都无效,不妨试试下 ...

  5. php执行mysql insert,当执行mysql insert 时插入两条是咋回事

    当执行mysql insert 时插入两条是怎么回事? 本帖最后由 Eason_____________ 于 2013-07-25 11:25:44 编辑 //做了一个手机上传图片到服务器的功能.但是 ...

  6. windows下bat处理执行Mysql的sql语句

    这篇文章主要介绍了windows下bat批处理执行Mysql的sql语句,需要的朋友可以参考下 有时候我们需要用bat来定时执行mysql那么就可以参考下面的代码 直接上代码: @ECHO OFF S ...

  7. android与mysql数据库同步_android开发 如何通过web服务器访问MYSQL数据库并且使其数据同步到android SQLite数据库?...

    通过web服务器访问MYSQL数据库有以下几个过程: 1.在MySql下创建自己的数据库和自己的表单 2.连接数据库. 3.访问数据库 1.创建web工程 (服务器端) 在Myeclipse下新建一个 ...

  8. python自动化脚本实例100条-自动化运维基础实例解析-Python批量登录到服务器执行任务...

    开发背景: 根据信息系统安全等级保护的要求,需要对IDC所有数据库服务器进行安全检查,以确认服务器的安全设置是否符合等级保护要求,需要在所有数据库服务器上执行以下命令: wget http://10. ...

  9. ubuntu+终端不能启动mysql数据库_强制重启Ubuntu服务器后Mysql无法启动

    本文将为您描述强制重启Ubuntu服务器后Mysql无法启动,具体完成步骤: 强制重启服务器后启动mysql不断报错误"code=exited","failed" ...

  10. 远程连接云服务器的MySQL数据库

    目录 1.查询权限 2.更新权限 2.1执行该SQL语句: 2.2刷新权限 3.开放MySQL的端口(此方法仅适用于云服务器) 3.1打开服务器后台管理: 3.2查看防火墙是否开放了MySQL的330 ...

最新文章

  1. 由laravel 5.5无法获取url中的参数引发的apache的.htaccess文件问题
  2. AutoLayout框架之序言
  3. 看完Andoird9.0 Pie的隐藏特性,我买了SSL证书
  4. [转]notepad++ java编码,输出中文字符时,编译出错
  5. 如何高效管理BI报表的需求
  6. C#LeetCode刷题之#4-两个排序数组的中位数(Median of Two Sorted Arrays)
  7. spring-aop 的注释用法
  8. mybatis查询返回null解决方案
  9. drawio流程图软件_Win10 一般软件个人收集
  10. UOJ14 UER #1 DZY Loves Graph(最小生成树+并查集)
  11. 使用 sequelize 在 node 环境下操作 Mysql
  12. java计算机毕业设计校园流浪猫图鉴管理系统的设计与实现源码+数据库+系统+lw文档+部署
  13. u盘安全弹出有什么用?数据丢失还能恢复吗
  14. 通过示例理解数据库相关概念(五、无损连接,无损分解,依赖保持性等)
  15. python3实现base64编码
  16. VMware 配置局域网内访问
  17. 强烈安利:小顽简报,一款高效实用的PPT新插件
  18. 单片机课程设计-基于单片机直流电机控制器设计
  19. 2022年基础设施行业10大技术应用趋势
  20. 小型水库雨水情测报和大坝安全监测

热门文章

  1. 机器人布里茨哪个皮肤好看_LOL全英雄皮肤盘点推荐D32:蒸汽机器人布里茨 苹果机器人...
  2. 统计学习之第一天(可汗学院公开课:统计学)
  3. 号称“不限速“的阿里网盘,官宣要停止了,寿命仅仅1年
  4. 阿里云网盘资源免费分享论坛正式上线
  5. 奇偶性与魔术(一)——奇偶性的数学本质
  6. python爬虫:模拟登录新浪微博并实现cookies保存,详细讲一下rsa
  7. obs听到了自己的回音_直播连麦过程中回声回音解决方式
  8. 用opencv和python读取医学图片:mha
  9. MathType编辑的公式与文字不对齐
  10. linux 命令详解 大于号_linux 命令中的大于号、小于号的作用