mysql占用磁盘IO过高(主从延迟高)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql占用磁盘IO过高(主从延迟高)相关的知识,希望对你有一定的参考价值。

问题

mysql主从同步延迟大

排查

  • sar查看磁盘io占用cpu高
[root@zy-mysql-pre02 shide]#sar -d 1
Linux 5.18.2-1.el7.elrepo.x86_64 (zy-mysql-pre02)       02/14/2023      _x86_64_        (4 CPU)

02:45:47 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
02:45:48 PM    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
02:45:48 PM   dev8-16   4478.00  75912.00 370152.00     99.61      2.09      0.47      0.22     99.30
02:45:48 PM  dev253-0   4412.00  62664.00 370024.00     98.07      1.87      0.42      0.23     99.40

02:45:48 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
02:45:49 PM    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
02:45:49 PM   dev8-16   4050.00  65792.00 341168.00    100.48      1.99      0.49      0.24     97.20
02:45:49 PM  dev253-0   3982.00  65792.00 341037.00    102.17      1.79      0.45      0.24     96.60

02:45:49 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
02:45:50 PM    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
02:45:50 PM   dev8-16   4323.00  65536.00 368410.00    100.38      1.78      0.41      0.23     99.20
02:45:50 PM  dev253-0   4280.00  65536.00 368538.00    101.42      1.62      0.38      0.23     99.20

02:45:50 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
02:45:51 PM    dev8-0     25.00    352.00      0.00     14.08      0.02      0.92      0.48      1.20
02:45:51 PM   dev8-16   3930.00  65536.00 363983.00    109.29      1.84      0.47      0.25     99.90
02:45:51 PM  dev253-0   3880.00  65536.00 363855.00    110.67      1.92      0.50      0.25     96.20

  • iotop命令查看哪些进程占用磁盘高
Total DISK READ :       0.00 B/s | Total DISK WRITE :    1328.57 K/s
Actual DISK READ:       0.00 B/s | Actual DISK WRITE:    1304.00 K/s
   TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
 80584 be/4 mysql       0.00 B/s 1304.99 K/s  ?unavailable?  mysqld --basedir=/usr/local/mysql --datadir=/da~l-pre02.pid --socket=/usr/local/mysql/mysql.sock
 80587 be/4 mysql       0.00 B/s    3.93 K/s  ?unavailable?  mysqld --basedir=/usr/local/mysql --datadir=/da~l-pre02.pid --socket=/usr/local/mysql/mysql.sock
  • 发现是mysql进程占用高,进行mysql排查: 查看sync_binlog值(多少事务提交会将binlog缓存写入磁盘)
mysql> show variables like %sync_binlog%;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog   | 1     |
+---------------+-------+
1 row in set (0.01 sec)

#发现是每次事务提交都会刷盘,影响性能

查看innodb_flush_log_at_trx_commit参数值(innodb日志刷入磁盘频次)

mysql> show variables like %innodb_flush_log%;
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_timeout    | 1     |
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
2 rows in set (0.00 sec)
#设置为1说明每次事务提交,都会将innodb日志缓存写入磁盘,对磁盘效率影响很大

解决办法

  • 修改sync_binlog值
#调整为1000,即每1000次事务提交刷盘(提高了性能会带来风险,即mysql服务器宕机会丢失1000事务)
set global sync_binlog=1000;#临时修改
sync_binlog=1000   #永久修改,配置文件加入
  • 修改innodb_flush_log_at_trx_commit值
#将它设置为2,每次事务提交mysql都会把log buffer的数据写入log file,但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。
set global innodb_flush_log_at_trx_commit=2;  #临时修改
innodb_flush_log_at_trx_commit=2   #永久修改,配置文件加入

以上是关于mysql占用磁盘IO过高(主从延迟高)的主要内容,如果未能解决你的问题,请参考以下文章

Mysql磁盘IO占用过高的一种解决办法

Mysql磁盘IO占用过高的一种解决办法

主机sql数据库占用磁盘IO读写过高,怎么解决?

主机sql数据库占用磁盘IO读写过高,怎么解决?

mysql占用磁盘IO过高的解决办法

io等待为啥引发cpu过高