排查linux CentOS7.6的mysql磁盘 I/O 延迟过高问题

一,问题影响

磁盘 I/O 延迟过高会直接导致:

  1. 系统整体卡顿:所有依赖磁盘读写的操作(如日志写入、数据库读写、文件存储)都会变慢
  2. 业务响应超时:数据库查询、接口调用、服务启动等耗时大幅增加,甚至引发超时
  3. 服务稳定性下降:严重时会导致进程夯住、服务宕机,影响业务连续性

二,排查步骤(按优先级)

  1. 快速定位高 I/O 进程

    登录目标主机 ,执行以下命令:

    bash 复制代码
    # 实时查看I/O占用最高的进程(按%iowait排序)
    iostat -x 1 5
    # 或更直观的进程级I/O监控
    iotop -oP
  • 重点关注 %util(磁盘利用率,接近 100% 说明磁盘饱和)、r_wait/w_wait(读写等待时间)
  • 找到占用 I/O 最高的进程 PID,进一步排查对应服务(如 MySQL、日志服务、备份任务等)
  1. 分析磁盘分区与挂载

    bash 复制代码
    # 查看sda分区与挂载情况
    df -h /dev/sda*
    lsblk
    # 检查是否存在分区满、inode耗尽
    df -i
  • 若分区使用率 > 90%,会直接导致 I/O 飙升,需清理冗余数据
  • 检查挂载参数是否异常(如错误使用同步挂载、noatime 未配置等)
  1. 针对性排查常见场景
常见场景 排查命令 处理建议
数据库 I/O 过高 mysqladmin processlist / show processlist; 优化慢查询、调整 InnoDB 缓冲池、分库分表
日志 / 备份任务 du -sh /var/log/* / ps aux grep backup 清理过期日志、调整备份时间至业务低峰
磁盘硬件故障 smartctl -a /dev/sda 检查磁盘健康状态,若有坏道需更换磁盘
系统 IO 调度器问题 cat /sys/block/sda/queue/scheduler 机械盘用 mq-deadline/noop,SSD 用 none

三,分析iostat -x 1 5结果,查看I/O占用

bash 复制代码
[root@db ~]# iostat -x 1 5
Linux 3.10.0-957.el7.x86_64 (26) 	2026年04月13日 	_x86_64_	(52 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.90    0.00    0.17    0.86    0.00   98.07

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.02     0.76    0.23   55.51    12.83  3256.20   117.29     0.04    0.77   11.15    0.73   0.37   2.07
dm-0              0.00     0.00    0.02    0.10     1.29     0.95    39.42     0.00   29.63    6.73   33.72   9.91   0.11
dm-1              0.00     0.00    0.03    0.03     0.10     0.11     8.00     0.00   43.84   14.47   70.65   5.40   0.03
dm-2              0.00     0.00    0.21   56.14    11.43  3255.13   115.94     0.04    0.71   11.44    0.67   0.35   2.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.35    0.00    0.33    1.75    0.00   95.57

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    0.00   85.00     0.00  4072.00    95.81     1.53   18.09    0.00   18.09   9.24  78.50
dm-0              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-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   82.00     0.00  4144.00   101.07     1.53   18.73    0.00   18.73   9.56  78.40

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.89    0.00    0.27    0.87    0.00   96.98

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    0.00   54.00     0.00  3160.00   117.04     0.93   17.35    0.00   17.35   7.83  42.30
dm-0              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-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   53.00     0.00  2960.00   111.70     0.93   17.66    0.00   17.66   7.96  42.20

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.98    0.00    0.27    1.60    0.00   97.15

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    0.00   92.00     0.00  9036.00   196.43     2.32   24.62    0.00   24.62   7.01  64.50
dm-0              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-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   95.00     0.00  9084.00   191.24     2.32   23.82    0.00   23.82   6.80  64.60

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.33    0.00    0.40    1.75    0.00   95.51

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    0.00   89.00     0.00  3916.00    88.00     1.55   18.02    0.00   18.02   7.39  65.80
dm-0              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-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   86.00     0.00  3868.00    89.95     1.54   18.60    0.00   18.60   7.64  65.70

[root@db ~]# 
  1. 磁盘确实在持续高写压力
  • sda 利用率 %util 瞬间冲到 44% → 66% → 71%
  • 几乎全是写:r/s≈0,w/s 46~92,wkB/s 3000~5000
  • await 13~20ms
  1. 已排查系统盘空间、inode 都完全正常。mysql的库都在/home里

  2. 服务器是离线环境,没有安装iotop工具,若有网,可按照iotop排查

    先装 iotop:

bash 复制代码
yum install -y iotop

然后执行:

bash 复制代码
iotop -oP
  1. 更通用的工具排查
bash 复制代码
# 按IO排序看进程
ps aux --sort=-pcpu,-rss

# 看哪个目录在疯狂写
du -sh --exclude=/proc /home/* | sort -rh

或者

bash 复制代码
# 实时看文件写入
lsof | grep -E 'REG|DIR' | grep -E '/home' | head -20
  1. 排查出可疑进程后
  • 若存在非mysql的进程,比如python,可以看看这个 Python 脚本在干嘛,比如pid为455850
bash 复制代码
pstree -p 455850
ll /proc/455850/cwd
ls -l /proc/455850/fd | grep mysql
  • 看 MySQL 当前在跑什么 SQL
bash 复制代码
show processlist;

或者

bash 复制代码
SELECT * FROM information_schema.processlist WHERE Command != 'Sleep' ORDER BY Time DESC;
相关推荐
航Hang*4 小时前
Windows Server 配置与管理——第12章:配置数字证书服务器
运维·服务器·windows
Edward111111115 小时前
linux创建普通用户
linux·运维·服务器
Dream of maid6 小时前
Mysql(3)运算符
数据库·mysql·adb
絆人心6 小时前
Windows 下 MySQL sys 数据库误删恢复教程(mysql_upgrade 已废弃,新版适用)
mysql·数据库误删恢复·sys数据库恢复·mysql_upgrade
mzhan0176 小时前
Linux: rcu: 加速宽限期
linux·rcu
Fanfanaas6 小时前
Linux 基础开发工具(二)
linux·运维·服务器·c语言
雾岛听蓝7 小时前
Linux线程基础
linux·开发语言·经验分享
齐落山大勇7 小时前
Linux的文件IO
linux·运维·服务器
七七powerful7 小时前
运维养龙虾--Tmux 终端复用器完全指南:从入门到 AI Agent 远程操控
运维·服务器·人工智能