Linux IO 过高怎么定位?iostat 和 iotop 使用详解

1. 前言

Linux 服务器变慢时,不一定是 CPU 不够。
很多时候真正的瓶颈是磁盘 IO。

常见现象:

  • CPU 使用率不高,但系统很卡;
  • Load Average 很高;
  • 接口响应慢;
  • 数据库查询慢;
  • 日志写入慢;
  • iowait 很高;
  • 磁盘读写延迟高。

排查 IO 问题常用工具:


iostat
iotop
vmstat
pidstat
dstat

本文重点讲解 iostatiotop


2. 什么是 IO

IO 指输入输出。
在服务器排查中,通常指磁盘读写。

例如:

  • MySQL 读写数据文件;
  • 日志写入磁盘;
  • 程序读取大文件;
  • Docker 写 overlay;
  • 备份压缩文件;
  • 大量小文件读写。

磁盘 IO 慢会拖慢整个系统。


3. 安装工具

iostat 来自 sysstat:

Ubuntu / Debian:


sudo apt install sysstat -y

CentOS / RHEL:


sudo yum install sysstat -y

iotop 安装:


sudo apt install iotop -y

或:


sudo yum install iotop -y


4. top 中先看 iowait

执行:


top

看 CPU 行:


%Cpu(s): 10.0 us, 5.0 sy, 80.0 id, 5.0 wa

其中:


wa

表示 iowait,也就是 CPU 等待 IO 的时间比例。

如果 wa 长期很高,说明系统可能卡在磁盘 IO 上。


5. iostat 基本用法

查看磁盘 IO:


iostat

更常用:


iostat -x 1

参数说明:

参数 作用
-x 显示扩展指标
1 每 1 秒输出一次

示例字段:


Device   r/s   w/s   rkB/s   wkB/s   await   %util
sda      10    100   1024    20480   30.5    95.0


6. iostat 关键字段

字段 含义
r/s 每秒读请求数
w/s 每秒写请求数
rkB/s 每秒读 KB
wkB/s 每秒写 KB
await IO 平均等待时间,毫秒
r_await 读等待时间
w_await 写等待时间
%util 设备繁忙程度

重点关注:


await
%util
rkB/s
wkB/s


7. 如何判断磁盘忙

一般判断:

指标 说明
%util 接近 100% 磁盘长期很忙
await 很高 IO 延迟较大
w/s 很高 大量写请求
r/s 很高 大量读请求
wa CPU 等 IO

注意:

%util 接近 100% 不一定绝对代表性能瓶颈,但如果同时 await 很高,基本要重点关注。


8. iotop 查看哪个进程在读写

iostat 能告诉你哪块磁盘忙。
iotop 能告诉你哪个进程在读写。

执行:


sudo iotop

只看正在进行 IO 的进程:


sudo iotop -o

常用字段:

字段 含义
TID 线程 ID
PRIO IO 优先级
USER 用户
DISK READ 读速度
DISK WRITE 写速度
SWAPIN 换入
IO> IO 等待比例
COMMAND 命令

如果看到某个进程写入特别高,就要进一步看它在写什么。


9. pidstat 查看进程 IO

也可以用:


pidstat -d 1

查看指定进程:


pidstat -d -p PID 1

字段:

字段 含义
kB_rd/s 每秒读取 KB
kB_wr/s 每秒写入 KB
kB_ccwr/s 取消写入 KB
Command 命令

10. 找进程打开了哪些文件

如果知道 PID,可以用:


sudo lsof -p PID

只看普通文件:


sudo lsof -p PID | grep REG

查看某个目录是否被频繁写:


sudo lsof +D /var/log

+D 在大目录下可能比较慢,线上谨慎使用。


11. 常见 IO 高场景

11.1 日志写入过多

表现:

  • iotop 中应用进程写入高;
  • /var/log 或应用日志目录增长快。

排查:


du -sh /var/log/*
tail -f app.log

处理:

  • 降低日志级别;
  • 配置日志切割;
  • 避免循环打印错误日志。

11.2 数据库 IO 高

MySQL、PostgreSQL 经常是 IO 大户。

排查:


iotop -o
iostat -x 1

结合数据库慢查询日志。

处理方向:

  • 优化索引;
  • 优化 SQL;
  • 增加缓存;
  • 调整 buffer pool;
  • 使用更快磁盘;
  • 分库分表或归档历史数据。

11.3 备份任务导致 IO 高

例如:


tar
rsync
mysqldump

这些任务可能占用大量读写。

查看:


ps aux | grep -E "tar|rsync|mysqldump"
iotop -o

可以调整备份时间到低峰期。


11.4 Swap 导致 IO 高

内存不足时频繁使用 Swap,也会导致磁盘 IO 高。

查看:


free -h
vmstat 1

如果 siso 持续不为 0,说明 Swap 活跃。


12. IO 排查流程


top
iostat -x 1
iotop -o
pidstat -d 1
lsof -p PID
du -sh 相关目录

流程:


top 看 wa 是否高
↓
iostat 看哪块磁盘忙
↓
iotop 找哪个进程读写
↓
pidstat 看进程 IO 趋势
↓
lsof 看进程打开文件
↓
结合业务日志定位原因


13. 小结

IO 排查核心命令:


top
iostat -x 1
sudo iotop -o
pidstat -d 1
sudo lsof -p PID

关键指标:


wa:CPU 等 IO
await:IO 等待时间
%util:磁盘繁忙程度
DISK READ/WRITE:进程读写速度

IO 高的问题,最终往往落在:


日志过多
数据库慢查询
备份任务
大文件读写
Swap 活跃
磁盘性能不足

排查时要先判断是哪个磁盘忙,再定位到哪个进程,最后结合业务判断为什么读写这么多。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐