恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Linux磁盘IO性能分析:iostat、iotop、fio实战
首页
资讯中心
/
Linux磁盘IO性能分析:iostat、iotop、fio实战
Linux磁盘IO性能分析:iostat、iotop、fio实战
发布时间:2026/10/16 3:07:20
系统卡顿排查到最后一层十有八九是磁盘 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% 是「谁在乱写」而不是「磁盘坏了」。日志暴涨、备份撞车、数据库全表扫描、临时表落盘这些应用层行为才是元凶。先找到那个进程再谈优化磁盘本身。