Linux磁盘IO性能分析:iostat、iotop、fio实战
系统卡顿排查到最后一层十有八九是磁盘 IO。CPU 不忙、内存也够但wa就是下不去load莫名其妙地高——很可能有一堆进程卡在D状态等磁盘。磁盘是整台机器里最慢的部件也是最容易被后台任务拖垮的。这一篇用iostat、iotop、pidstat -d、fio四个工具教你看懂磁盘的四个核心指标并定位到具体是哪个进程在制造 IO。一、先搞懂四个核心指标看磁盘性能无论用什么工具都是围绕这四个数字转指标含义单位IOPS每秒完成多少次 IO 请求次/秒吞吐量带宽每秒读写多少数据MB/s延迟await每个 IO 平均耗时含排队ms队列深度aqu-sz排队等待处理的 IO 数量个它们的关系用生活比喻最好懂IOPS 是「收银台每秒服务几个人」吞吐是「每秒卖出多少货」延迟是「每个顾客平均等多久」队列深度是「队伍里排了多少人」。小文件、随机读写场景数据库、日志看IOPS 延迟大文件、顺序读写场景备份、视频看吞吐。别混。二、iostat磁盘全景统计iostat属于sysstat是最常用的磁盘性能工具。安装sudo apt install sysstat -y # Ubuntu sudo dnf install sysstat -y # Rocky/CentOS语法格式iostat [选项] [间隔] [次数]常用参数参数说明-d只看磁盘不显示 CPU-x显示扩展统计含 await、%util最常用-m以 MB/s 显示吞吐-k以 KB/s 显示默认-p显示分区级1 5每秒采样共 5 次示例与预期输出iostat -dxm 1 3预期输出Device r/s rMB/s rrqm/s %rrqm r_await rareq-sz w/s wMB/s wrqm/s %wrqm w_await wareq-sz aqu-sz %util sda 2.50 0.10 0.00 0.00 1.20 40.00 120.00 15.30 8.00 6.25 8.40 130.00 0.98 95.20 sdb 0.00 0.00 0.00 0.00 0.00 0.00 0.50 0.02 0.00 0.00 0.80 36.00 0.00 0.10重点列解读列含义判断信号r/sw/s每秒读/写请求数即 IOPSrMB/swMB/s读/写吞吐看带宽用r_awaitw_await读/写平均延迟ms关键高于设备基线就是有问题aqu-sz平均队列深度持续 1 说明排队严重%util设备忙碌时间百分比接近 100% 说明饱和rareq-szwareq-sz平均每次请求大小KB判断是随机小 IO 还是顺序大 IO⚠️ 关于 %util 的经典误区%util接近 100% 常被当作「磁盘满了」的铁证但对SSD/NVMe它非常具有误导性——SSD 内部能并行处理多个请求%util100% 时性能可能还很充沛。判断磁盘是否真饱和更可靠的是await延迟和aqu-sz队列深度范疇await明显高于设备正常水平 → 有压力aqu-sz持续大于 1 → 请求在排队单看%util机械盘还算靠谱SSD 上要结合延迟一起看。三、iotop看到底是谁在 IOiostat告诉你是「哪块盘」忙但不知道「哪个进程」在搞。iotop补上这一环类似top但按 IO 排序。安装sudo apt install iotop -y # Ubuntu sudo dnf install iotop -y # Rocky/CentOS语法格式与常用参数sudo iotop [选项]参数说明-o只显示正在进行 IO 的进程-b批处理模式适合写脚本-n N采样 N 次后退出-P只显示进程不显示线程-k用 KB/s 显示-a显示累计 IO而非实时速率示例与预期输出sudo iotop -oP预期输出Total DISK READ: 1.20 M/s | Total DISK WRITE: 15.30 M/s PID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND 1234 be/4 mysql 0.00 B/s 8.50 M/s 0.00% 0.30% mysqld 5678 be/4 root 800.0 K/s 6.00 M/s 0.00% 0.80% rsync --daemon-o过滤掉零 IO 的进程-P只看进程输出干净。第一行的Total是全局读写速率。IO列是该进程等待 IO 的时间占比越高越卡。注意iotop需要 root 权限要读/proc/*/io普通用户会报CONFIG_TASK_IO_ACCOUNTING或权限相关错误。四、pidstat -d无交互的进程级 IOiotop是交互式不适合记录。要做数据采集用pidstat -d同属 sysstat。pidstat -d 1 5UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command root 1234 0.00 8704.00 0.00 120 mysqld root 5678 800.00 6144.00 0.00 85 rsync其中iodelay较新内核是进程被 IO 阻塞的时钟节拍数是比速率更能反映「被 IO 拖累」的指标。五、fio磁盘基准测试上面三个是「看现状」fio是「测能力」——磁盘到底能跑多少 IOPS、多少带宽、延迟多高。换机器、调优前后对比都靠它。安装sudo apt install fio -y # Ubuntu sudo dnf install fio -y # Rocky/CentOS语法格式fio [选项] 作业文件常用参数参数说明--namexxx作业名--rwrandread随机读read/write/randwrite/rw等--bs4k块大小--iodepth32IO 队列深度--numjobs4并发作业数--size1G每个作业读写数据量--runtime60运行 60 秒--time_based到时间才停--direct1绕过 page cache测试真实磁盘--filename/dev/sdb目标设备或文件示例与预期输出测 4K 随机读的 IOPS数据库典型场景sudo fio --namerandread --ioenginelibaio --direct1 \ --rwrandread --bs4k --iodepth32 --numjobs4 \ --size1G --runtime60 --time_based --group_reporting预期输出节选read: IOPS98.5k, BW385MiB/s (403MB/s) lat (usec): min8, max2000, avg32.40 iops : min 95400, max101200, avg98520测顺序写带宽日志/备份场景sudo fio --nameseqwrite --ioenginelibaio --direct1 \ --rwwrite --bs1M --iodepth16 --size1G --runtime30 --time_basedwrite: IOPS520, BW520MiB/s⚠️ fio 使用禁忌绝对不要对生产盘直接跑写测试。--filename/dev/sdb会覆盖数据。测试前用空文件或专门的测试盘/测试分区或在文件系统上用--filename/tmp/testfile非裸设备并确认路径安全--direct1绕过缓存结果更真实不带它测的是「缓存速度」没有参考价值。六、一张表学会看懂 iostat把iostat -dx的输出和判断标准对应起来现象可能原因w/s高、wareq-sz小几 KB大量随机小写日志/数据库常见rMB/s高、rareq-sz大几百 KB顺序大读备份/视频await远高于设备基线磁盘压力大或队列深aqu-sz持续 1请求排队磁盘响应不过来%util100% 但await很低SSD 正常吞吐很可能没满%util100% 且await很高真饱和是瓶颈七、⚠️ 常见错误拿 %util 当唯一标准。SSD 上%util100% 不代表瓶颈要看await和吞吐是否达到设备上限。测磁盘不带--direct1。测出来的是 page cache 速度几个 GB/s跟真实磁盘无关。在生产盘上跑 fio 写测试。直接覆盖数据事故级别。测试要用专门介质。忽视D状态进程。ps里一堆D、load高但 CPU 闲这就是 IO 瓶颈的典型信号去查iotop。只盯平均延迟。await是平均值可能被大量快请求拉低。要结合分布看iostat看不了分布需bpftrace/blktrace或fio的延迟百分位。忽略文件系统层。磁盘快不代表文件系统快ext4的 journal、XFS的分配策略都会影响实际性能。八、原理探究机械盘 vs SSD以及 IO 调度器机械盘HDD的物理限制机械盘有一个转动的盘片和一个移动的磁头。每次读写要寻道seek把磁头移到目标柱面再旋转rotational latency等到扇区转到磁头下。这两步是纯机械动作毫秒级。这决定了 HDD随机 IO 极慢每次都要寻道100~200 IOPS 到头顺序 IO 快得多磁头不用大幅移动可达 100 MB/s所以 HDD 上把随机访问改成顺序访问是最大优化点比如 LSM 树 vs B 树、追加写日志。SSD 的特点SSD 没有机械动作靠闪存芯片随机和顺序差距没 HDD 那么大天生擅长随机 IO几万到几十万 IOPS。但有两个特性要注意写放大闪存以「块」为单位擦除改写要读-改-写实际写入量可能大于请求量。寿命TBW闪存有擦写次数上限fio 压测要适可而止。IO 调度器内核在块设备层有调度器决定 IO 请求怎么合并、排序、下发调度器适用特点nonenoopSSD/NVMe不排队不排序直接下发SSD 自己有内部调度mq-deadline通用保证请求在期限内处理防饿死kyber高性能 SSD按读/写/丢弃分别限流bfq桌面/低延迟按进程分配带宽交互友好查看和设置# 查看当前设备调度器 cat /sys/block/sda/queue/scheduler # 临时改成 noneSSD 推荐 echo none | sudo tee /sys/block/sda/queue/scheduler # 永久写 udev 规则或内核参数 elevatorSSD 上通常用none/mq-deadline把调度交给硬件机械盘可用bfq或mq-deadline优化交互。九、IO 排查实操流程# 1. 系统整体 IO 概况 iostat -dxm 1 5 # 2. 找制造 IO 的进程 sudo iotop -oP # 3. 记录进程级 IO可写脚本 pidstat -d 1 5 # 4. 看是否有进程卡在 D 状态 ps -eo state,pid,cmd | grep ^D # 5. 查看脏页回写压力 grep -E Dirty|Writeback /proc/meminfo # 6. 测设备真实能力非生产盘 sudo fio --namet --rwrandread --bs4k --iodelay... # 见上文一条经验磁盘问题里80% 是「谁在乱写」而不是「磁盘坏了」。日志暴涨、备份撞车、数据库全表扫描、临时表落盘这些应用层行为才是元凶。先找到那个进程再谈优化磁盘本身。

相关新闻

GEO实战:哪些平台真正认可AI引用?友好度分层与落地策略

GEO实战:哪些平台真正认可AI引用?友好度分层与落地策略

开篇先聊个真实场景。前两天有个做内容运营的朋友问我:现在大家都在说GEO,我到底该把精力花在哪个平台?发了那么多内容,怎么判断有没有被AI引用?这个问题其实问到了点子上。GEO(Generative Engine Optimiza…

2026/10/16 3:07:00 阅读更多 →
平台人员排查租户故障,怎样临时授权?最小访问范围、限时撤销与审计

平台人员排查租户故障,怎样临时授权?最小访问范围、限时撤销与审计

多租户系统上线后,平台运维迟早会遇到“客户说任务失败了,我们怎么排查”的问题。给平台人员一条“查看所有租户数据”的永久权限,确实方便,却把日常故障排查变成了长期越权入口;把支持人员临时写进客户管理员列表&…

2026/10/16 3:06:00 阅读更多 →
工业AI落地核心:感知-决策-执行闭环与物理世界耦合

工业AI落地核心:感知-决策-执行闭环与物理世界耦合

1. 工业AI不是“把算法搬进车间”,而是重新定义产线的呼吸节奏“他山之石可攻玉”这句老话,放在今天工厂里正被反复验证——但很多人没看清的是:那块“他山之石”,从来不是现成的通用大模型或云端API,而是一套在油污、…

2026/10/16 3:06:00 阅读更多 →

最新新闻

移动端H5开发与PC端Web的核心差异及实战指南

移动端H5开发与PC端Web的核心差异及实战指南

移动端 H5 开发这个话题,我最早接触是在功能机向智能手机过渡那段时间。当时大家还在争论“移动端是不是要单独做一套网站”,后来从自适应到响应式再到各种混合开发方案,折腾了这么多年,我发现很多同学其实对“移动端 H5 开发和 P…

2026/10/16 3:53:10 阅读更多 →
C# Winform连接SQL Server:从环境配置到增删改查完整指南

C# Winform连接SQL Server:从环境配置到增删改查完整指南

简介:这是一套面向C#初学者的WinformSQL Server数据库增删改查入门资源,适合刚接触桌面数据库开发、希望掌握本地与网络连接方式的读者。资源以完整VS工程形式提供,包含CrudTest项目源码、SQLQuery1.sql数据库查询脚本、说明文档及编译生成的…

2026/10/16 3:53:10 阅读更多 →
Unity WebGL构建报错unityLinker与IL2CPP排查指南

Unity WebGL构建报错unityLinker与IL2CPP排查指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:53:10 阅读更多 →
Wireshark实战入门:从抓不到包到定位TCP窗口缩放故障

Wireshark实战入门:从抓不到包到定位TCP窗口缩放故障

1. 为什么今天还要学Wireshark?——从“看不见的网络”到“可触摸的数据流”很多人第一次听说Wireshark,是在某次服务突然卡顿、接口返回超时、或者App连不上服务器的时候。运维同事皱着眉头说:“得抓个包看看”,然后打开一个蓝白…

2026/10/16 3:53:10 阅读更多 →
SpringBoot家具销售管理系统实战:从CRUD到库存并发设计

SpringBoot家具销售管理系统实战:从CRUD到库存并发设计

花了整整两天时间把这类基于SpringBoot的家具销售管理系统从头到尾梳理了一遍。单看标题,很多人会觉得这又是一个普通的CRUD练习项目,但真正把业务模块拆开之后你会发现,家具销售里那些大件、低频、高客单价带来的逻辑细节,它其实…

2026/10/16 3:53:10 阅读更多 →
CTF音频隐写解题指南:从‘啊哒~’看振幅、频谱与相位三重分析

CTF音频隐写解题指南:从‘啊哒~’看振幅、频谱与相位三重分析

1. 从一道CTF杂项题名看起:为什么“啊哒~”不是卖萌,而是信号“BugkuCTF-Misc:啊哒~”——第一次在某高校CTF训练平台看到这个标题时,我下意识点开想看看是不是新出的搞笑彩蛋题。结果发现它被归在Misc(杂项&#xff0…

2026/10/16 3:52:10 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →