使用iostat看磁盘IO

面试官问:你提到系统页面响应时间变慢、服务异常可能是磁盘读写问题,那你怎么确认是磁盘的问题呢?

答:用iostat这个工具可以排查定位(服务器环境是CentOS7.9)。

再问:说下怎么看、具体看哪些指标呢?

考察目的:追问细节,看你是不是真的会看磁盘IO,从而能定位性能问题。

那就来实战下iostat。

1、安装

bash 复制代码
yum install -y sysstat
  • 所属包:sysstat。
  • 安装命令:yum install -y sysstat (CentOS/RHEL) 或 apt install sysstat (Debian/Ubuntu)。如果遇到镜像源问题,可以参考文末的附录章节。
  • 数据源:直接读取 Linux 内核的 /proc/diskstats 文件。
  • 核心统计:基于采样统计。首份报告是自系统启动以来的平均值;从第二次报告开始,显示的是上一段间隔内的瞬时平均值。

2、命令参数

iostat [ 选项 ] [ <时间间隔> <次数> ]

  • -c: 仅显示CPU统计信息
  • -d: 仅显示磁盘统计信息
  • -x: 显示扩展统计信息 (最重要)
  • -k, -m: 将统计单位转换为 KB/s 或 MB/s
  • -p: 显示设备分区的统计信息
  • -t: 在输出中包含时间戳
  • -y: 跳过首次报告,适用于只看当前负载
  • -z: 忽略没有活动的设备,让输出更清晰
  • -N: 显示LVM逻辑卷的映射名称
  • -o JSON: 以 JSON 格式输出,便于脚本处理
  • -h: 使 NFS 报告更易读

3、输出

举个例子详细说明,我最常用的命令【iostat -xdm 2】:

(1)命令详解

-x :扩展统计(显示 await、%util 等关键指标)

-d :只显示设备统计(不显示CPU段)

-m:以 MB/s 为单位显示吞吐量

2 每2秒采样一次

(2)实战

表头字段含义:

设备说明:

注意:dm-0/dm-1 是 sda 上的分区通过LVM/RAID映射出来的,所以 sda 的IO和 dm-* 的IO是同一物理IO的不同视角。看总量以 sda 为准,看业务分布看 dm-*

4、逐次采样解读

我们来看看例子中的每一次采样情况,分析具体有什么问题。①第1次采样(最上面一组)

sda(物理盘)分析:

发现:

  • 写是瓶颈:w_await 72ms 远超正常值(SSD应<5ms,机械盘应<10ms)
  • 队列堆积:avgqu-sz 6.79 说明请求在排队等待
  • 利用率不高但延迟高:%util 只有21%,但 await 72ms → 通常是机械硬盘的特征(单队列串行处理,即使利用率不高,随机IO也会很慢)

dm-0 vs sda 对比:

这个差异很正常:dm-0 是逻辑视图,sda 是物理视图。

②第2次采样

状态:明显好转

结论: 第1次采样的高负载是突发性的,第2秒已经回落。可能是某个批处理任务、日志刷盘、或数据库checkpoint。

③第3次采样

状态:持续低负载

  • w/s 13,轻微写活动
  • w_await 6.35ms,正常范围
  • avgqu-sz 0.08,几乎无排队
  • 系统处于空闲或低负载状态
    ④第4次采样

状态:几乎空闲

  • 只有零星写操作
  • 所有指标都很低
    ⑤第5次采样

⚠️ 再次出现高负载!

分析:

  • 纯写负载:r/s 为0,100%写操作
  • 顺序写特征:wrqm/s 197 很高,说明大块顺序写,但即便如此延迟仍极高
  • 队列深度破百:avgqu-sz 106+,说明应用层在疯狂灌数据,磁盘处理不过来
  • 机械硬盘瓶颈:%util 74% 不算满,但 await 177ms → 典型的机械硬盘随机/小IO排队特征,或者磁盘本身性能差(可能是老旧的SATA盘)
  • 周期性爆发:对比5次采样,负载是间歇性突发(第1次高→第2-4次低→第5次更高)
    整体分析:这是一个间歇性写突发的场景,可能是定时任务(cron)、日志轮转、数据库checkpoint、缓存刷盘、批处理作业。

接下来,自然是要确认到底谁是罪魁祸首,下篇文章见。

附录:安装iostat

一、检查是否已安装

检查命令是否存在:which iostat

或检查版本:iostat --version

有输出则已安装;提示 "command not found" 则需要安装。

二、安装 iostat(sysstat)

yum install -y sysstat

可能会遇到镜像源的问题:

解决:

  1. 备份原有源文件(防止出错)
bash 复制代码
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
  1. 下载阿里云 CentOS 7 源(国内稳定可用)
bash 复制代码
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
  1. 替换源中的 $releasever 为 7(解决版本变量问题)
bash 复制代码
sed -i 's/\$releasever/7/g' /etc/yum.repos.d/CentOS-Base.repo
  1. 清理旧缓存并重建(这一步会久一点,耐心等着,直到出现Complete!)
bash 复制代码
`yum clean all && yum makecache

三、安装后启用(可选)

启动 sysstat 数据采集服务:systemctl start sysstat

设置开机自启:sudo systemctl enable sysstat

四、验证安装

查看版本,有输出即安装成功:iostat -V

查看详细磁盘IO统计:iostat -x

相关推荐
kebidaixu2 小时前
VS Code Remote-SSH 远程开发:解决无法安装扩展、市场加载失败的问题
linux
颖火虫盟主2 小时前
Linux 系统分层架构:从硬件通电到 systemd 进程管理
linux·运维·架构
hehelm2 小时前
Linux 信号(Signal)
linux
cui_ruicheng3 小时前
Linux网络编程(九):应用层协议与序列化
linux·运维·服务器·网络
kobe_OKOK_3 小时前
ubuntu server 存儲空間占滿的原因
linux·运维·ubuntu
诸神缄默不语3 小时前
在Linux中使用Vim编辑文本
linux·vim
菜鸟是大神4 小时前
07-Claude Code 的常用命令和快捷键
linux·运维·服务器
hj2862514 小时前
Linux存储空间管理完整笔记
linux·运维·笔记
Championship.23.244 小时前
Linux 3.0 中断机制深度解析:从传统PIC到现代中断架构的转折点
linux·运维·架构·中断