使用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

相关推荐
古城小栈18 小时前
Python 的主流Ai框架为什么优先适配 Linux 系统?
linux·人工智能·python
aFakeProgramer20 小时前
S-CORE Docker 环境
linux
error:(20 小时前
Ubuntu 22.04 GNOME远程桌面配置问题排查与解决全流程
linux·运维·ubuntu
wcy1008620 小时前
为 CentOS 7.6 (7.6.1810) 配置阿里云 Vault 源
linux·阿里云·centos
江华森20 小时前
Linux 运维新手入门课
linux·运维·服务器
载数而行52020 小时前
Linux 9 服务管理(进程的一种)
linux
追梦的小菜20 小时前
linux 下磁盘挂载
linux
izcll20 小时前
ubuntu系统安装软件的方法
linux·运维·ubuntu
暮云星影1 天前
全志linux开发屏幕适配(一)屏幕参数设置说明
linux·arm开发
swordbob1 天前
NIO 的 Channel 里有多个 BIO 吗?
linux·网络·nio