Mysql性能排查—主机资源排查方法
Posted 翔之天空
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql性能排查—主机资源排查方法相关的知识,希望对你有一定的参考价值。
当 mysql数据库主机服务器 遇到资源性能问题时的 一般排查方法:
从CPU 、IO 、内存三个方面排查问题:
如下:
mysql版本:5.6.34
--mysql运行一个数据量大sql 排序且无索引。 因为是无索引的大量数据 会造成IO和内存压力大,还有无索引的排序 会造成CPU很高
mysql> select time from table order by time limit 20;
+---------------------+
| time |
+---------------------+
| 2017-07-22 10:28:38 |
| 2017-07-22 10:28:41 |
| 2017-07-22 10:29:44 |
| 2017-07-22 10:29:47 |
| 2017-07-22 10:29:48 |
| 2017-07-22 10:29:58 |
| 2017-07-22 10:31:22 |
| 2017-07-22 10:31:52 |
| 2017-07-22 10:32:04 |
| 2017-07-22 10:32:42 |
| 2017-07-22 10:32:45 |
| 2017-07-22 10:32:58 |
| 2017-07-22 10:32:58 |
| 2017-07-22 10:32:59 |
| 2017-07-22 10:33:32 |
| 2017-07-22 10:33:44 |
| 2017-07-22 10:33:46 |
| 2017-07-22 10:33:46 |
| 2017-07-22 10:34:19 |
| 2017-07-22 10:35:12 |
+---------------------+
20 rows in set (2 min 28.48 sec)
--查看会话可以看出有sql在做排序操作 Creating sort index, 可以排查出来。 下面是从系统资源方面的查看
mysql> show processlist;
+----+-------------+-----------+--------------+---------+------+-----------------------------------------------------------------------------+---------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+-----------+--------------+---------+------+-----------------------------------------------------------------------------+---------------------------------------------+
| 16 | root | localhost | sysbendbtest | Query | 6 | Creating sort index | select time from table order by time limit 20 |
| 17 | root | localhost | NULL | Query | 0 | init | show processlist |
+----+-------------+-----------+--------------+---------+------+-----------------------------------------------------------------------------+---------------------------------------------+
4 rows in set (0.06 sec)
--1、查看cpu 用top工具 查看mysqld的cpu(%CPU)、IO(%wa)、内存(%MEM)都有点高
[root@hostmysql ~]# top
top - 17:33:56 up 3:31, 7 users, load average: 0.66, 0.23, 0.13
Tasks: 131 total, 1 running, 130 sleeping, 0 stopped, 0 zombie
Cpu0 : 4.2%us, 0.0%sy, 0.0%ni, 76.1%id, 19.4%wa, 0.4%hi, 0.0%si, 0.0%st
Cpu1 : 46.8%us, 8.6%sy, 0.0%ni, 0.0%id, 40.5%wa, 0.0%hi, 4.1%si, 0.0%st
Mem: 489600k total, 483356k used, 6244k free, 12112k buffers
Swap: 4095996k total, 308796k used, 3787200k free, 63644k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2137 mysql 20 0 1752m 285m 2524 S 70.5 59.7 8:16.63 mysqld
46 root 20 0 0 0 0 S 1.0 0.0 0:12.42 kswapd0
28 root 20 0 0 0 0 S 0.3 0.0 0:03.35 kblockd/0
--2、查看下整体IO情况 用iostat 查看r/s+w/s为IOPS 是500多、rkB/s+wkB/s是每秒的读写(kb) 也很大 、%util 是IO的使用率也不低
[root@hostmysql mysql_setup]# iostat -x -k -d 3
Linux 2.6.32-573.el6.x86_64 (hostmysql) 09/10/2019 _x86_64_ (2 CPU)
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.66 0.00 371.85 0.00 39470.20 0.00 212.29 1.81 4.90 2.03 75.60
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 27.15 0.99 358.94 1.66 39409.27 10.60 218.64 1.76 4.87 2.07 74.67
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 0.00 367.44 0.00 43518.94 0.00 236.88 1.18 3.22 1.89 69.27
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 0.32 512.66 0.65 61055.84 3.90 237.91 1.15 2.24 1.27 65.10
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 0.00 506.31 0.00 60006.64 0.00 237.03 1.03 2.03 1.26 63.72
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 0.33 512.83 0.66 60386.84 3.95 235.22 1.11 2.17 1.30 66.58
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 0.00 502.99 0.00 59817.94 0.00 237.85 1.10 2.19 1.30 65.38
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 0.33 448.50 1.00 53641.20 5.32 238.69 1.22 2.71 1.53 68.84
--3、用pidstat 综合查看 CPU、内存、IO的具体进程 mysqld的都高
[root@hostmysql ~]# pidstat -u -r -d 3
Linux 2.6.32-573.el6.x86_64 (hostmysql) 09/10/2019 _x86_64_ (2 CPU)
04:44:21 PM PID %usr %system %guest %CPU CPU Command
04:44:24 PM 28 0.00 0.33 0.00 0.33 0 kblockd/0
04:44:24 PM 46 0.00 1.00 0.00 1.00 0 kswapd0
04:44:24 PM 2137 49.17 14.95 0.00 64.12 1 mysqld
04:44:24 PM 5394 0.00 0.66 0.00 0.66 0 pidstat
04:44:21 PM PID minflt/s majflt/s VSZ RSS %MEM Command
04:44:24 PM 2137 0.00 0.66 1794348 292476 59.74 mysqld
04:44:24 PM 5394 132.89 0.00 101112 900 0.18 pidstat
04:44:21 PM PID kB_rd/s kB_wr/s kB_ccwr/s Command
04:44:24 PM 2137 54706.98 0.00 0.00 mysqld
04:44:24 PM PID %usr %system %guest %CPU CPU Command
04:44:27 PM 46 0.00 1.00 0.00 1.00 0 kswapd0
04:44:27 PM 2137 47.67 14.67 0.00 62.33 1 mysqld
04:44:27 PM 5376 0.33 0.00 0.00 0.33 1 top
04:44:27 PM 5394 0.33 0.00 0.00 0.33 1 pidstat
04:44:24 PM PID minflt/s majflt/s VSZ RSS %MEM Command
04:44:27 PM 1693 0.67 0.00 386136 692 0.14 automount
04:44:27 PM 2137 0.00 0.67 1794348 292484 59.74 mysqld
04:44:27 PM 5394 135.33 0.00 101112 932 0.19 pidstat
04:44:24 PM PID kB_rd/s kB_wr/s kB_ccwr/s Command
04:44:27 PM 2137 46729.33 0.00 0.00 mysqld
--4、用perf工具可以具体的看出 哪个函数占用cpu高,这里为mysqld的row_search_for_mysql(查找记录函数)和filesort(排序函数 说明有sql在做排序操作) 。
注:mysqld的buf_calc_page_new_checksum 函数是对page头的前四个字节checksum重新计算,耗时耗力
[root@hostmysql ~]# perf top -g -p 2137
Samples: 205K of event 'cpu-clock', Event count (approx.): 3547155648
Children Self Shared Object Symbol
+ 20.76% 19.56% mysqld [.] buf_calc_page_new_checksum
+ 13.25% 0.02% libaio.so.1.0.1 [.] io_submit
+ 9.37% 9.37% [kernel] [k] _spin_unlock_irqrestore
+ 8.78% 8.78% [kernel] [k] finish_task_switch
+ 8.19% 2.76% mysqld [.] row_search_for_mysql
+ 6.23% 0.86% mysqld [.] ha_innobase::general_fetch
+ 6.07% 0.68% mysqld [.] filesort
+ 6.05% 0.70% mysqld [.] ha_partition::rnd_next
以上是关于Mysql性能排查—主机资源排查方法的主要内容,如果未能解决你的问题,请参考以下文章
Mysql性能排查—结合操作系统线程 查看mysql中的sql资源消耗
Mysql性能排查—结合操作系统线程 查看mysql中的sql资源消耗