原标题:记一次服务器执行MySQL耗时问题

导读:本篇记录一次服务器执行MySQL耗时的问题,耗时的问题在于一句SQL执行,耗时超过1000ms,如何解决这个问题?通过这篇文章了解下。

大概过程

在测试环境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

JMC(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线程列表

showprocesslist;

从图中可以看出,有些线程的状态处于sending data,查阅资料:所谓的“Sending data”并不是单纯的发送数据,而是包括“收集 + 发送 数据”。

然后后面一列info显示的是具体信息,是查询用来生成主键ID的函数,之前速度都很快,为啥突然就这么慢呢,于是回过头去查看该函数:

selectnext_value intoret_val from`xxx`wheretable_name=tableName forupdate;

update`xxx`setcurrent_value=current_value+step,next_value=next_value+stepwheretable_name=tableName;

select for update,给这个表加了排它锁,阻止其它事务取得相同数据集的共享读锁和排他写锁,同时,这个序列表表中,用来检索的字段没有加索引,在InnoDB行锁机制中:

由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键(在我们的场景中,就是查询时用到的table_name),是会出现锁冲突的。

所以了解到其它团队因为查询这个表产生事务问题,造成死锁,这个序列表被锁住了。

由于这个自增序列表每个团队都在使用,所以当时测试环境中,经常有dao层超时错误,最终将这些阻塞的线程kill掉,为序列表加了索引,解决了问题。

小结

下次遇到MySQL执行耗时的情况,排除了代码问题之后,要去看数据库是否有死锁的情况存在,观察有没有被阻塞的线程,排查被阻塞的线程具体info,定位到具体问题。

具体排查过程是这样,其中还有些细节问题,思路或者方法有误,请在评论区指出。

出处:https://juejin.im/post/5ce906a3e51d455a2f2201dc

编辑:尹文敏

责任编辑:

mysql调用耗时_记一次服务器执行MySQL耗时问题相关推荐

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

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

  2. mysql++裸盘_记一次裸迁 MySQL 经历

    记一次裸迁MySQL经历 前言:博主企业有一台企业阿里云机器,因为安装了云锁,造成服务器动不动就给我所死服务器.(就是那种 chattr +i /bin/bash ,分分钟日死狗 )趁着周末,Boos ...

  3. mysql死锁语句_记一次神奇的Mysql死锁排查

    背景 说起Mysql死锁,之前写过一次有关Mysql加锁的基本介绍,对于一些基本的Mysql锁或者死锁都有一个简单的认识,可以看下这篇文章为什么开发人员需要了解数据库锁.有了上面的经验之后,本以为对于 ...

  4. mysql时区错乱_记一次线上mysql时区错乱

    Mysql查询时间和页面显示时间相差八个小时. 在一次线上程序调用mysql内部函数转化时间戳的时候的bug记录.在本地开发与测试环境都没得问题.但是上线后,程序总是不再状态. 遂开启审阅代码的过程, ...

  5. mysql 插入慢_记一次生产环境mysql数据库参数优化,值得收藏

    概述 最近在对各个系统的mysql做一些参数上的优化,也开了慢查询,准备后面针对特定sql再进一步优化.下面主要介绍一下一些优化的参数. 1.优化前mysql配置 可以看到基本上是没怎么做优化的. 2 ...

  6. 服务器多出mysql帐户_在一台服务器构建多mysql 服务

    作者博客:http://windychan.cublog.cn/ 欢迎转载,但务必在转载时注明出处.[/align] ***************************************** ...

  7. java mysql死锁_记一次线上mysql死锁分析(一)

    记录一次比较诡异的mysql死锁日志.系统运行几个月来,就在前几天发生了一次死锁,而且就只发生了一次死锁,整个排查过程耗时将近一天,最后感谢我们的DBA大神和老大一起分析找到原因. 诊断死锁 借助于我 ...

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

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

  9. mysql 最小配置_如何配置全世界最小的 MySQL 服务器

    配置全世界最小的 MySQL 服务器--如何在一块 Intel Edison 为控制板上安装一个 MySQL 服务器. 介绍 在我最近的一篇博文中,物联网,消息以及 MySQL,我展示了如果Parti ...

  10. 服务器安装mysql要密码_在阿里云服务器上安装mysql及重置密码

    参考链接:https://www.cnblogs.com/ljysy/p/10324854.html 下载与安装MySQL: 这里采用Yum管理好了各种rpm包的依赖,能够从指定的服务器自动下载RPM ...

最新文章

  1. python conn_python中conn是什么
  2. [导入]微软CSS,GCR半日游--学了一样东西,什么叫做灰头土脸
  3. 发送请求获取响应内容(c#)
  4. 数据库系统概念总结:第十一章 索引与散列
  5. IDE使用经验——阿里代码规范 Eclipse格式化代码配置
  6. 2013\Province_C_C++_A\7.错误票据
  7. 2018年10月28日宁波dotnet社区活动回顾及下次活动预告
  8. 第九十四期:GitHub 发布 2019 年年度报告
  9. c语言第八章函数程序设计,C语言程序设计-第八章 函数.ppt
  10. Android 中的线程池
  11. codeforces 742D Arpa's weak amphitheater and Mehrdad's valuable Hoses ——(01背包变形)
  12. 梁宏达:好记性是怎样训练出来的.
  13. 【源】ArrayDeque,Collection框架中不起眼的一个类
  14. 【笔记】分布式网络与分布式账本
  15. Face photo recognition using sketch (人脸画像合成)
  16. linux的通配符有哪些,Linux通配符
  17. 黑马程序员-黑马,人生的一个重要转折
  18. Angular 依赖注入框架里 useExisting 和 useClass 的使用场景
  19. 工具|2021年十大扫描漏洞工具
  20. pscc2018安装服务器无响应,强大的功能无法使用,大神教你一招解决PSCC2018无法安装扩展插件...

热门文章

  1. 批量将B站学习视频以MP4格式下载到本地
  2. character在mysql什么类型_character是什么字段类型
  3. python数据笔记分析_python数据分析入门学习笔记
  4. IT常用职位缩写总结
  5. 重装系统后计算机无法启动,重装系统后电脑为什么启动不了?云骑士告诉你怎么办?...
  6. 经济学中ppf计算机会成本例题,经济学中的PPF是什么
  7. 哔哩哔哩视频音频下载器批量下载器
  8. 计算机大赛横幅标语有趣的,有创意的横幅标语大全
  9. JavaScript数据类型 - Undefined类型
  10. 济南大学 计算机学院,于自强