一步一步从Linux线程到MySQL慢sql定位

中午了,正在吃着黄焖鸡外卖,突然手机短信声音响了,一看一台mysql数据库服务器的cpu,IO使用率查过告警阀值了,都快到100%。赶紧放下黄焖鸡,快速登录到有问题的mysql数据库服务器。

下面模拟一下当时排查的步骤,使用的mysql5.7.26版本
用iostat看一下IO情况

[mysql@localhost ~]$ iostat -mxt 1
Linux 3.10.0-1062.9.1.el7.x86_64 (localhost.localdomain)        08/23/2020      _x86_64_        (1 CPU)

08/23/2020 03:32:41 PM
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           5.49    0.00   78.02    6.59    0.00    9.89

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00 3460.44    0.00    54.07     0.00    32.00     0.89    0.26    0.26    0.00   0.26  89.45
scd0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00 3460.44    0.00    54.07     0.00    32.00     0.90    0.26    0.26    0.00   0.26  89.56
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-2              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

用top看看一下cpu使用情况,看看什么进程导致cpu高

top - 15:37:21 up  8:50,  5 users,  load average: 0.45, 0.19, 0.12
Tasks: 144 total,   1 running, 143 sleeping,   0 stopped,   0 zombie
%Cpu(s): 99.0 us,  1.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2175376 total,   663640 free,   599256 used,   912480 buff/cache
KiB Swap:  2097148 total,  2096884 free,      264 used.  1417460 avail Mem 

   PID USER      PR   NI    VIRT    RES        SHR S      %CPU %MEM     TIME+ COMMAND                                                                              
 40474 mysql     20   0 1266400 324264   9496 S    96.7 14.9   3:42.00 mysqld                                                                               
 40916 root      20   0  204492  12108   4304 S       2.7  0.6   1:22.59 iotop                                                                                
     1   root      20   0  125520   3716   2344 S  0.0  0.2   0:05.60 systemd                                                                              
     2   root      20   0       0      0      0 S  0.0  0.0   0:00.01 kthreadd                                                                             
     4   root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kworker/0:0H                                                                         
     6  root      20   0       0      0      0 S  0.0  0.0   0:01.45 ksoftirqd/0                       

果然是mysql进程导致cpu使用高,知道了是mysql数据库导致的,可是还是不知道什么原因,如果是新手,这个时候是不是有点慌,无从下手的感觉,如果是老手,肯定知道大概率是慢sql的问题,其它的原因概率比较低,例如mysql的bug,业务qps暴增等等。

于是用show看看mysql线程情况

mysql> show full processlist;
+----+------+-----------+--------+---------+------+----------+-----------------------+
| Id | User | Host      | db     | Command | Time | State    | Info                  |
+----+------+-----------+--------+---------+------+----------+-----------------------+
|  8 | root | localhost | sbtest | Query   |    0 | starting | show full processlist |
| 10 | root | localhost | NULL   | Sleep   |   28 |          | NULL                  |
+----+------+-----------+--------+---------+------+----------+-----------------------+
2 rows in set (0.00 sec)

在实际的生产上,结果可能有好几十,上百个结果,甚至有上千,要从这么多的线程里排查出导致cpu高的那个,简直是折磨人,这个不仅仅要经验足,还得对跑的业务非常熟悉,知道那些业务,那些大表可能会导致cpu高,你想想公司里有多少人满足这个条件,估计屈指可数。

那么有没有更直接,更直观的工具进行精确定位呢,在mysql5.7以后的版本,performance_schema.threads这个性能视图中,就有linxu系统的的线程ID,有了这个ID,就把mysql和操作系统精密的关联在一起了,下面就带大家,一步一步从Linux线程到MySQL慢sql精确定位

1.找到mysql服务的进程PID
[mysql@localhost ~]$ ps -ef|grep -i mysqld|grep -v grep
mysql     39463  39441  0 14:21 pts/0    00:00:00 /bin/sh /u02/mysql/bin/mysqld_safe --defaults-file=/u02/conf/my3308.cnf
mysql     40474  39463  7 14:21 pts/0    00:07:57 /u02/mysql/bin/mysqld --defaults-file=/u02/conf/my3308.cnf --basedir=/u02/mysql --datadir=/u02/data/3308 --plugin-dir=/u02/mysql/lib/plugin --log-error=/u02/log/3308/error.log --open-files-limit=65535 --pid-file=/u02/run/3308/mysqld.pid --socket=/u02/run/3308/mysql.sock --port=3308

在这里mysql的PID为:40474

2.用top找到cpu消耗最大的线程ID
[mysql@localhost ~]$ top -H -p 40474
Threads:  33 total,   1 running,  32 sleeping,   0 stopped,   0 zombie
%Cpu(s):100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2175376 total,   670468 free,   592304 used,   912604 buff/cache
KiB Swap:  2097148 total,  2096884 free,      264 used.  1424364 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                              
 40624 mysql     20   0 1266400 324264   9496 R 99.3 14.9   5:14.97 mysqld                                                                               
 40474 mysql     20   0 1266400 324264   9496 S  0.0 14.9   0:05.29 mysqld                                                                               
 40475 mysql     20   0 1266400 324264   9496 S  0.0 14.9   0:00.00 mysqld                                                                               
 40476 mysql     20   0 1266400 324264   9496 S  0.0 14.9   0:00.00 mysqld                                                                               
 40477 mysql     20   0 1266400 324264   9496 S  0.0 14.9   0:00.00 mysqld 

消耗cpu资源最高的线程PID为:40624

3.根据系统的线程PID,精确定位慢sql

连接mysql数据库,使用以下sql语句,进行慢sql的精确定位

mysql> select PROCESSLIST_ID,THREAD_OS_ID,PROCESSLIST_USER,PROCESSLIST_HOST,PROCESSLIST_DB,PROCESSLIST_COMMAND,PROCESSLIST_INFO from performance_schema.threads where THREAD_OS_ID=40624;
+----------------+--------------+------------------+------------------+----------------+---------------------+-------------------------------------------+
| PROCESSLIST_ID | THREAD_OS_ID | PROCESSLIST_USER | PROCESSLIST_HOST | PROCESSLIST_DB | PROCESSLIST_COMMAND | PROCESSLIST_INFO                          |
+----------------+--------------+------------------+------------------+----------------+---------------------+-------------------------------------------+
|              8 |        40624 | root             | localhost        | sbtest         | Query               | select count(*) from sbtest1 a ,sbtest1 b |
+----------------+--------------+------------------+------------------+----------------+---------------------+-------------------------------------------+
1 row in set (0.00 sec)

“select count(*) from sbtest1 a ,sbtest1 b”这条sql语句就是导致cpu暴增的元凶,找到之后,该怎么办,当然是先快速恢复业务,将这个select语句的连接kill掉。

[mysql@localhost ~]$ /u02/mysql/bin/mysql -uroot -proot --socket=/u02/run/3308/mysql.sock
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.7.26-log Source distribution

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>kill 8;

到这里,整个cpu使用率100%导致业务响应速度变慢,定位到慢sql,恢复业务的全过程,这个技能你get了吗

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