mysql磁盘io高是什么造成_Mysql 磁盘IO过高

今天在spotlight上看到磁盘IO过高的报警,登录服务器查看具体磁盘IO情况:

[root@hbwb-008 ~]# iostat -dxk 1

1

磁盘util%使用率100%。首先怀疑是慢查询语句导致,查看MYSQL慢查询情况:

mysql> show processlist;

+-------+-------------+---------------------+------+---------+--------+-----------------------------------------------------------------------------+------------------+

| Id | User | Host | db | Command | Time | State | Info |

+-------+-------------+---------------------+------+---------+--------+-----------------------------------------------------------------------------+------------------+

| 1 | system user | | NULL | Connect | 674754 | Waiting for master to send event | NULL |

| 2 | system user | | NULL | Connect | 0 | Slave has read all relay log; waiting for the slave I/O thread to update it | NULL |

| 5504 | root | 192.168.5.161:38765 | wbdb | Sleep | 1 | | NULL |

| 5746 | root | 192.168.5.161:40800 | wbdb | Sleep | 1 | | NULL |

| 5891 | root | 192.168.5.161:41970 | wbdb | Sleep | 1 | | NULL |

| 7398 | root | 192.168.5.161:46172 | wbdb | Sleep | 1 |

并未发现有明显慢查询语句,继续往下分析,我的服务器是64G内存,用系统命令 free 看了下,发现大部分都在cached,而free的也不多。观察InnoDB相关的配置以及status,看能不能找到端倪:

mysql> show variables like '%innodb_buffer_pool_size%';

+-------------------------------------+----------------+

| Variable_name | Value |

+-------------------------------------+----------------+ |

| innodb_buffer_pool_size | 48169484288 |

+-------------------------------------+----------------+

1 row in set (0.00 sec)

mysql> show global status like '%innodb_log%';

+---------------------------+----------+

| Variable_name | Value |

+---------------------------+----------+

| Innodb_log_waits | 0 |

| Innodb_log_write_requests | 68744008 |

| Innodb_log_writes | 72154542 |

+---------------------------+----------+

3 rows in set (0.00 sec)

mysql> show global status like '%innodb_buffer_pool_wait%';

+------------------------------+-------+

| Variable_name | Value |

+------------------------------+-------+

| Innodb_buffer_pool_wait_free | 0 |

+------------------------------+-------+

1 row in set (0.00 sec)

并未发现日志相关等待时间,查看了下show engine innodb status的报告也未发现有任何异常,top看系统负载并不高,唯独磁盘IO高,并且mysql内存分配也没有异常,努力回忆了一下mysql与磁盘IO相关的参数,想起来有两个参数innodb_flush_log_at_trx_commit 和sync_binlog,看下这两个参数的值:

mysql> show variables like '%sync_bin%';

+--------------+-------+

| Variable_name | Value |

+---------------+-------+

| sync_binlog | 1 |

+---------------+-------+

1 row in set (0.00 sec)

mysql> show variables like '%innodb_flush%';

+--------------------------------+----------+

| Variable_name | Value |

+--------------------------------+----------+

| innodb_flush_log_at_timeout | 1 |

| innodb_flush_log_at_trx_commit | 2 |

| innodb_flush_method | O_DIRECT |

| innodb_flush_neighbors | 1 |

| innodb_flushing_avg_loops | 30 |

+--------------------------------+----------+

5 rows in set (0.00 sec)

到这里问题基本上就已经知道大概了,sync_binlog=1表示每次事务提交后MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘,频繁的写盘导致磁盘IO居高不下,将sync_binlog调整为500

mysql> set global sync_binlog=500;

Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'sync_binlog';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| sync_binlog | 500 |

+---------------+-------+

1 row in set (0.00 sec)

再次观察磁盘IO使用情况:

[root@hbwb-008 ~]# iostat -dxk 1

Linux 2.6.32-431.el6.x86_64 (hbwb-008) 03/29/2017 _x86_64_ (32 CPU)

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util

sda 0.01 38.92 0.42 35.17 6.43 300.15 17.23 0.06 1.63 4.36 15.52

sdb 0.00 51.45 0.33 33.19 26.97 338.58 21.81 0.01 0.27 0.07 0.23

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util

sda 0.00 28.00 0.00 13.00 0.00 188.00 28.92 0.08 6.15 6.15 8.00

sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util

sda 0.00 19.00 0.00 7.00 0.00 104.00 29.71 0.04 5.00 4.43 3.10

sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util

sda 0.00 25.00 0.00 3.00 0.00 112.00 74.67 0.01 5.00 5.00 1.50

sdb 0.00 1.00 0.00 2.00 0.00 12.00 12.00 0.00 0.00 0.00 0.00

可以看到磁盘IO显著降低,报警解除。

sync_binlog参数:

sync_binlog 的默认值是0,像操作系统刷其他文件的机制一样,MySQL不会同步到磁盘中去而是依赖操作系统来刷新binary log。

当sync_binlog =N (N>0) ,MySQL 在每写 N次 二进制日志binary log时,会使用fdatasync()函数将它的写二进制日志binary log同步到磁盘中去。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值