【故障诊断】Mysql数据库CPU占用高

运维同事监测到生产环境数据库CPU占用过高,业务系统反应卡慢,记录一下排查过程。

最后检查结果:非SQL性能导致的,原因是业务代码的BUG,导致每秒发送几千条SQL到数据库,导致CPU占用搞

排查过程如下

第一步,开启慢查询日志

一般情况,数据库CPU占用过高一般是SQL执行太慢,如数据量大,没有索引,语句不合理等问题导致。
慢查询日志是mysql本身就支持的功能,可以将超过指定时间的查询请求记录下来,方便排查故障

-- 开启慢查询日志
set global slow_query_log ='ON';
-- 开启慢查询日志的时间阀值,超过此时间被记录,,0代表记录所有,0.1代表100毫秒
set global long_query_time = 0.1;
-- 输出日志到文件或,【TABLE】为表,【FILE】为文件,【FILE,TABLE】为同时输出表和文件
set GLOBAL log_output = 'TABLE';
-- 查看慢查询相关变量是否生效
show VARIABLES like '%slow%';
-- 查看慢查询时间的设置(set之后要重新连接才会看到值的变化)
show VARIABLES like '%long_query_time%';

运行一段时间后,查看慢查询日志

-- sql_text为sql语句,我这边的Navicat显示为 BLOB,所有使用CONVERT函数转换为字符串显示
 select a.*,CONVERT(sql_text USING utf8) from `mysql`.slow_log a

此时查看慢查询日志结果,没有数据!说明sql的执行都低于100ms,没有异常的SQL

image.png

第二步,开启一般日志,尝试找出异常SQL

 SET GLOBAL general_log = 'ON'; -- 开启一般日志
 SET GLOBAL slow_query_log = 'OFF'; -- 关闭慢查询日志

-- (一般日志存放在`mysql`.general_log表中)
-- 未了方便分析本次的问题,先清空【一般日志表】
truncate mysql.general_log;
-- 运行一段时间后,在关闭一般日志,此时表中只有最近的一般日志
 SET GLOBAL general_log = 'OFF'; -- 开启一般日志

-- 查询日志,argument 为sql语句
 select a.*,CONVERT(argument USING utf8) from mysql.general_log a
image.png

可以看到日志非常多,且在11:25:02执行了很多的日志,怀疑同一秒执行大量SQL,并发量太高导致CPU过高

-- 按秒 分组查询一下数量
 select left(event_time,19),count(1) from  mysql.general_log
 group by left(event_time,19)
image.png

每秒执行7千~9千多条SQL,确诊了,并发量导致的CUP过高!!!
一般情况来说,没有慢查询日志,只是并发量高,说明SQL语句本身没有什么问题,工作情况也是正常的,只是业务代码调用的问题。但我们业务量平时没那么大,肯定不正常,因此需要继续排查

第三步,找出发送SQL的主机、端口、程序

mysql.general_log表中user_host字段就是SQL执行用户和连接的IP地址,可以直接定位到机器
但本次我们还需要定位到程序,所以使用mysql.general_log表的thread_id字段定位到执行的mysql进程ID(mysql内部的进程,非操作系统的进程),连接information_schema.PROCESSLIST表查询进程信息

select * from (
 select thread_id,count(1) cnt  from  mysql.general_log
 group by thread_id
) a
left join information_schema.`PROCESSLIST` b on a.ID=b.thread_id
order by `HOST` DESC
图5

HOST字段就是连接数据库的客户端IP和端口,(ID等字段为NULL的则是已经关闭的连接,不用理会)
linux 上执行netstat命令查看TCP连接,通过grep命令搜索,HOST字段的值
注意:netstat命令的执行机器的IP,需匹配HOST字段(如图5的第一条数据,HOST为192.168.1.51:38610,则在机器192.168.1.51上面执行netsta命令来搜索)

# grep 命令搜索HOST字段,注意在192.168.1.51机器上执行
# 使用\|分隔多个字符串,表示OR的关系,匹配到其中的任意字符串则输出
netstat -apn|grep "192.168.1.51:38610\|192.168.1.51:38474\|192.168.1.51:38470"
image.png

可以看出这几个连接,都是一个PID为6834点java进程
此进程的3个连接连接了数据库,其中192.168.1.51:38474这个连接发送了5214条SQL,根据图5,此连接的Mysql进程ID15

执行jcmd |grep 6834查看java进程

image.png

此时已定位到程序级别,此为我们的业务应用,因此可以继续往下,定位到代码级别

第四步,定位到代码

根据刚才的排查结果,选择Mysql进程ID15的连接,看一下他执行的什么SQL
然后将SQL拿到JAVA程序的日志中去查找SQL,定位到JAVA程序的执行线程

 select a.*,CONVERT(argument USING utf8) from mysql.general_log a
 where thread_id=15
 limit 1000
image.png

可以看出,基本是同样的SQL,只是参数可能不一样,经过人工分析,发现此连接多次发送同一个SQL,参数都是一样的,显然是不正常的(同一连接,同一SQL,短时间内发送多次)

抓取SQL,然后查询JAVA程序的日志,找到线程名称: nioEventLoopGroup-5-1

image.png

使用jstack命令dump线程堆栈,搜索刚刚的线程名称

# dump线程情况到tdump.log文件,方便查询,其中6834为java进程ID  
jstack -l 6834 > tdump.log

此时在tdump.log文件中搜索nioEventLoopGroup-5-1,即可定位到代码行
最后检查业务代码后,确定是一个代码BUG,修复之后,CPU变为正常情况
(下图是问题解决之后,后期补充的图片,故没有我们的业务代码行号)

image.png

清理排查问题时临时配置、文件等

mysql:关闭慢查询日志和一般日志,清空日志表数据

set global slow_query_log ='OFF;
set global general_log='OFF';

truncate mysql.slow_log;
truncate mysql.general_log;

linux: 删除临时文件

rm -f tdump.log
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容