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

原创 o月牙数据库架构师o 2020-08-28 06:15:00

中午了,正在吃着黄焖鸡外卖,突然手机短信声音响了,一看一台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   %idle5.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 respectiveowners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>kill 8;

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

收藏

举报

13 条评论

评论

  • 一生只为GDP的李达康 1月前

    服务器到mysql问题排查 mysql排查

    回复  ⋅ 1条回复0

  • 艾舒祺2016 1月前

    点个赞

    回复  ⋅ 1条回复0

  • Silence153295380 29天前

    收藏忘记看系列

    回复  ⋅ 1条回复0

  • 东方欲晓0808 26天前

    Mysql慢sql

    回复0

  • 摩玄风 9天前

    古德

一步一步从Linux线程到MySQL慢sql定位相关推荐

  1. linux下执行mysql的sql文件

    linux下执行mysql的sql文件 mysql -uroot -proot 进入到mysql 然后执行source /var/ftp/pub/sogoodsoft.sql; 即可. www.2ct ...

  2. Linux中连接mysql执行sql文件

    Linux中连接mysql执行sql文件 数据量小的时候可以把sql语句内容粘贴执行,但是文件很大的时候,这样执行效率很慢很慢,需要使用source执行sql文件 1.客户端连接mysql数据库 [r ...

  3. Linux 线程占用CPU过高定位分析

    今天朋友问我一个Linux程序CPU占用涨停了,该如何分析, CPU占用过高,模拟CPU占用过高的情况 先上一段代码: 1 #include <iostream> 2 #include & ...

  4. Linux下导出MySQL为SQL文件_在linux命令下导出导入.sql文件的方法

    本文讲述了在linux命令下导出导入.sql文件的方法.分享给大家供大家参考,具体如下: 一.导出数据库用mysqldump命令(注意mysql的安装路径,即此命令的路径): 1.导出数据和表结构: ...

  5. Linux下导出MySQL为SQL文件_MySQL导入导出.sql文件步骤

    MySQL导入导出.sql文件步骤如下: 一.MySQL的命令行模式的设置: 桌面->我的电脑->属性->环境变量->新建-> PATH=":path\mysq ...

  6. linux mysql 运行sql文件命令大全_linux下执行mysql的sql文件

    linux下执行mysql的sql文件 mysql -uroot -proot 进入到mysql 然后执行source /var/ftp/pub/sogoodsoft.sql; 即可. www.2ct ...

  7. 【Linux】一步一步学Linux——make命令(259)

    00. 目录 文章目录 00. 目录 01. 命令概述 02. 命令格式 03. 常用选项 04. 参考示例 05. 附录 01. 命令概述 make命令是GNU的工程化编译工具,用于编译众多相互关联 ...

  8. 【Linux】一步一步学Linux——ulimit命令(218)

    00. 目录 文章目录 00. 目录 01. 命令概述 02. 命令格式 03. 常用选项 04. 参考示例 05. 总结 06. 附录 01. 命令概述 ulimit命令用来限制系统用户对shell ...

  9. 【Linux】一步一步学Linux——top命令(121)

    00. 目录 文章目录 00. 目录 01. 命令概述 02. 命令格式 03. 常用选项 04. 参考示例 05. top相关说明 06. 附录 01. 命令概述 top命令是Linux下常用的性能 ...

最新文章

  1. hdu 4831(线段树---待解决)
  2. MySQL查看和修改表的存储引擎
  3. mysql的事务语句_MySQL提供的事务控制语句
  4. eclipse项目里javascript总是验证,且出现最多的error是 Description Resource Path Location Type Syntax error on toke
  5. 喜欢 TypeScript 的人,一点都不比 Python 少
  6. 手机写python爬虫_零基础开始写Python爬虫心得
  7. 什么专业的会学python语言_还在纠结学什么编程语言吗?Python可能会“教”你做人...
  8. sql server存储过程解密
  9. Hiho----无间道之并查集
  10. F-Train Wreck_2021牛客暑期多校训练营10
  11. yuv图片旋转180度,镜像水平翻转
  12. vue一维码,二维码生成
  13. 九种电脑变慢的常见症状、原因、以及解决办法。
  14. Excel表格数据的下载
  15. 浅谈Windows API编程 (这个经典)
  16. A component is changing an uncontrolled input to be controlled. This is likely caused by the value
  17. UVALive 6657 GCD XOR
  18. 2022-2028年中国电源滤波器行业市场发展规模及未来趋势预测报告
  19. ins显示未连接到服务器,ins未能连接到服务器
  20. 进程互斥锁,队列,IPC进程间通信,生产者与消费者,线程,线程对象的属性,先行互斥锁...

热门文章

  1. pythonfor循环if中断怎么使用_如何在for循环中只运行一次if?
  2. python解析网页所有可点击_Python 解析网页
  3. 647. 回文子串(JavaScript)
  4. 威联通架设php网站_如何架设PHP服务器
  5. java 取栈顶元素_java集合系列(7)Stack
  6. 先序abdfcegh 中序bfdagehc 后序线索二叉树_二叉树的遍历(先序、中序、后序、层序)...
  7. 回填用土好还是砂石料好_养猪用颗粒料好还是自配料好?其实各有优劣,养猪人要会选择...
  8. python做图片-python做图
  9. android intent包装,Android 中的 Intent
  10. PDA服务器显示响应为空,jmeter 状态码为200,但是响应数据为何为空