mysql调用耗时_记一次服务器执行MySQL耗时问题
原标题:记一次服务器执行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耗时问题相关推荐
- 记一次服务器执行MySQL耗时问题
墨墨导读:本篇记录一次服务器执行MySQL耗时的问题,耗时的问题在于一句SQL执行,耗时超过1000ms,如何解决这个问题?通过这篇文章了解下. 大概过程 在测试环境Docker容器中,在跨进程调用服 ...
- mysql++裸盘_记一次裸迁 MySQL 经历
记一次裸迁MySQL经历 前言:博主企业有一台企业阿里云机器,因为安装了云锁,造成服务器动不动就给我所死服务器.(就是那种 chattr +i /bin/bash ,分分钟日死狗 )趁着周末,Boos ...
- mysql死锁语句_记一次神奇的Mysql死锁排查
背景 说起Mysql死锁,之前写过一次有关Mysql加锁的基本介绍,对于一些基本的Mysql锁或者死锁都有一个简单的认识,可以看下这篇文章为什么开发人员需要了解数据库锁.有了上面的经验之后,本以为对于 ...
- mysql时区错乱_记一次线上mysql时区错乱
Mysql查询时间和页面显示时间相差八个小时. 在一次线上程序调用mysql内部函数转化时间戳的时候的bug记录.在本地开发与测试环境都没得问题.但是上线后,程序总是不再状态. 遂开启审阅代码的过程, ...
- mysql 插入慢_记一次生产环境mysql数据库参数优化,值得收藏
概述 最近在对各个系统的mysql做一些参数上的优化,也开了慢查询,准备后面针对特定sql再进一步优化.下面主要介绍一下一些优化的参数. 1.优化前mysql配置 可以看到基本上是没怎么做优化的. 2 ...
- 服务器多出mysql帐户_在一台服务器构建多mysql 服务
作者博客:http://windychan.cublog.cn/ 欢迎转载,但务必在转载时注明出处.[/align] ***************************************** ...
- java mysql死锁_记一次线上mysql死锁分析(一)
记录一次比较诡异的mysql死锁日志.系统运行几个月来,就在前几天发生了一次死锁,而且就只发生了一次死锁,整个排查过程耗时将近一天,最后感谢我们的DBA大神和老大一起分析找到原因. 诊断死锁 借助于我 ...
- ubuntu+终端不能启动mysql数据库_强制重启Ubuntu服务器后Mysql无法启动
本文将为您描述强制重启Ubuntu服务器后Mysql无法启动,具体完成步骤: 强制重启服务器后启动mysql不断报错误"code=exited","failed" ...
- mysql 最小配置_如何配置全世界最小的 MySQL 服务器
配置全世界最小的 MySQL 服务器--如何在一块 Intel Edison 为控制板上安装一个 MySQL 服务器. 介绍 在我最近的一篇博文中,物联网,消息以及 MySQL,我展示了如果Parti ...
- 服务器安装mysql要密码_在阿里云服务器上安装mysql及重置密码
参考链接:https://www.cnblogs.com/ljysy/p/10324854.html 下载与安装MySQL: 这里采用Yum管理好了各种rpm包的依赖,能够从指定的服务器自动下载RPM ...
最新文章
- python conn_python中conn是什么
- [导入]微软CSS,GCR半日游--学了一样东西,什么叫做灰头土脸
- 发送请求获取响应内容(c#)
- 数据库系统概念总结:第十一章 索引与散列
- IDE使用经验——阿里代码规范 Eclipse格式化代码配置
- 2013\Province_C_C++_A\7.错误票据
- 2018年10月28日宁波dotnet社区活动回顾及下次活动预告
- 第九十四期:GitHub 发布 2019 年年度报告
- c语言第八章函数程序设计,C语言程序设计-第八章 函数.ppt
- Android 中的线程池
- codeforces 742D Arpa's weak amphitheater and Mehrdad's valuable Hoses ——(01背包变形)
- 梁宏达:好记性是怎样训练出来的.
- 【源】ArrayDeque,Collection框架中不起眼的一个类
- 【笔记】分布式网络与分布式账本
- Face photo recognition using sketch (人脸画像合成)
- linux的通配符有哪些,Linux通配符
- 黑马程序员-黑马,人生的一个重要转折
- Angular 依赖注入框架里 useExisting 和 useClass 的使用场景
- 工具|2021年十大扫描漏洞工具
- pscc2018安装服务器无响应,强大的功能无法使用,大神教你一招解决PSCC2018无法安装扩展插件...
热门文章
- 批量将B站学习视频以MP4格式下载到本地
- character在mysql什么类型_character是什么字段类型
- python数据笔记分析_python数据分析入门学习笔记
- IT常用职位缩写总结
- 重装系统后计算机无法启动,重装系统后电脑为什么启动不了?云骑士告诉你怎么办?...
- 经济学中ppf计算机会成本例题,经济学中的PPF是什么
- 哔哩哔哩视频音频下载器批量下载器
- 计算机大赛横幅标语有趣的,有创意的横幅标语大全
- JavaScript数据类型 - Undefined类型
- 济南大学 计算机学院,于自强