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过高(主从延迟高)的主要内容,如果未能解决你的问题,请参考以下文章