
当网站响应突然变慢、数据库查询排队、备份任务拖垮整台服务器时,问题不一定出在 CPU 或内存,也可能是 Linux 磁盘 I/O(输入输出)瓶颈。本文是一份面向运维和站长的排查指南,教你如何用 iostat、pidstat 与 fio 把“感觉磁盘慢”拆成可验证的数据:磁盘是否忙、哪个进程在读写、真实存储能力是否低于业务需求。
如果你的业务运行在 VPS(虚拟专用服务器) 或独立服务器上,磁盘 I/O(输入输出)通常会直接影响数据库、日志、缓存和文件上传。排查时不要先急着重启服务,也不要只看 top 里的 CPU(中央处理器)占用。更稳妥的思路是:先确认设备层是否繁忙,再定位进程层读写行为,最后用可控测试验证磁盘能力边界。
先判断是不是磁盘 I/O 问题
Linux 服务器变慢时,常见表象包括页面打开超过 3 秒、数据库慢查询变多、SSH 命令回显卡顿。这些现象可能来自网络、CPU、内存回收,也可能来自磁盘队列堆积。排查第一步,是用系统指标把范围缩小到 I/O(输入输出)。
可以先安装 sysstat 工具包,它包含 iostat 和 pidstat。不同发行版命令略有差异:
# Debian / Ubuntu
sudo apt update
sudo apt install -y sysstat
RHEL / Rocky / AlmaLinux:
sudo dnf install -y sysstat
安装后先观察 5 轮,每轮间隔 1 秒:
iostat -xz 1 5
这里不要只盯一个数。%util 接近 100% 说明设备很忙,但不等于“性能已经耗尽”;await 表示请求平均等待时间,若长期高于 20ms,数据库和动态网站通常会明显变慢;r/s、w/s、rkB/s、wkB/s 能区分小文件高频读写和大文件连续吞吐。

用 iostat 看设备层:忙不忙、慢在哪里
iostat -xz 的价值在于快速回答“磁盘设备层是否已经成为瓶颈”。实用做法是连续观察业务高峰期 1-3 分钟,而不是截取某一秒峰值。短暂尖峰未必需要扩容;如果 await 长时间升高,同时应用响应变慢,就要继续定位。
建议按下面 4 个维度读取输出:
await:请求平均等待时间。Web 应用常见目标是保持在 10-20ms 以内,超过 50ms 通常会拖慢数据库提交和文件读取。r/s与w/s:每秒读写请求数。数值高但吞吐不高,可能是大量小文件或随机 I/O(输入输出)。rkB/s与wkB/s:每秒读写吞吐。持续接近套餐或磁盘上限时,要考虑业务是否需要更高规格存储。%util:设备忙碌比例。单块传统磁盘接近 100% 风险很高;虚拟化环境要结合await和业务延迟一起看。
假设晚间备份时 wkB/s 达到 180000,await 从 3ms 升到 80ms,数据库写入延迟同步上升。核心问题不是“Linux 慢”,而是备份占用连续写入能力。可以先限速、错峰,再观察 await 是否回落。
如果你正在排查 服务器性能 问题,可以把 iostat 输出与应用日志时间线放在一起看。比如 14:05 出现大量 5xx,而 14:04-14:10 的 await 持续高于 60ms,这就是可执行证据。
用 pidstat 找到具体进程:谁在读写磁盘
确认设备层繁忙后,下一步要回答“是谁造成的”。pidstat 可以按进程显示 I/O(输入输出)读写速度,比只看 iotop 更适合记录。常用命令如下:
pidstat -d 1 10
输出中的 kB_rd/s、kB_wr/s 分别代表进程每秒读写量,Command 是进程名。常见模式包括:数据库持续写入、日志采集读取大量文件、备份脚本连续写归档包、图片处理产生临时文件。
当某个 PID(进程编号)持续写入异常,可以继续查看它打开了哪些文件:
sudo ls -l /proc/<PID>/fd
sudo lsof -p <PID> | head -50
这一步能把“某个进程写很多”推进到“写的是哪个目录”。例如 mysqld 每秒写入 40MB,且文件落在数据库目录,通常与业务写入、索引更新或慢事务有关;若是备份脚本写入 /backup,则优先调整备份策略。

用 fio 做可控测试:验证存储能力边界
iostat 和 pidstat 解决线上定位,fio 解决“这块磁盘大概能跑到什么水平”。测试前要避免生产高峰和破坏性写入。更安全的做法是在非业务目录创建临时文件,控制时长,并在低峰期执行。
先安装 fio:
# Debian / Ubuntu
sudo apt install -y fio
RHEL / Rocky / AlmaLinux:
sudo dnf install -y fio
一个相对温和的随机读写测试可以这样执行:
mkdir -p /tmp/fio-test
fio --name=randrw-test --directory=/tmp/fio-test --size=1G --rw=randrw --rwmixread=70 --bs=4k --iodepth=16 --numjobs=2 --runtime=60 --time_based --group_reporting
这组参数模拟 70% 读取、30% 写入的小块随机 I/O(输入输出)。bs=4k 是 4KB 块大小,iodepth=16 是队列深度,runtime=60 是运行 60 秒。测试后重点看 IOPS(每秒输入输出次数)、带宽和延迟分位数。
如果你只想测试连续写入能力,可以改用:
fio --name=seqwrite-test --directory=/tmp/fio-test --size=2G --rw=write --bs=1M --iodepth=8 --numjobs=1 --runtime=60 --time_based --group_reporting
测试完成后及时清理文件:
rm -rf /tmp/fio-test
这里的目的不是追求漂亮分数,而是建立基线。比如空载随机读写 12000 IOPS,高峰只有 2500 IOPS,同时 await 升高,就能判断业务压力或同盘任务吃掉了可用 I/O(输入输出)。

把三类工具串成排查流程
单个命令只能说明一个侧面,排查时更推荐按固定流程推进。每一步都有证据,就不会在“重启服务、清缓存、换配置”之间反复试错。对于 网站性能优化 场景,磁盘 I/O(输入输出)适合和 TTFB(首字节时间)、慢查询一起分析。
可以采用下面的最小流程:
- 记录故障时间:例如 20:10-20:25 页面响应从 800ms 升到 5s,并保存应用日志片段。
- 运行
iostat -xz 1 60:确认await、吞吐和%util是否在同一时间异常。 - 运行
pidstat -d 1 60:找出持续读写最高的进程,并记录 PID(进程编号)和命令名。 - 用
lsof -p <PID>查文件路径:判断是数据库、备份、日志、上传目录还是临时文件。 - 低峰期用
fio建立基线:对比业务高峰和空载测试,判断是否需要调度优化或资源升级。
例如某站点每天 02:00 做全量备份,30GB 归档写入系统盘,02:10 左右后台保存频繁超时。排查发现 await 峰值超过 100ms,pidstat 显示压缩进程持续写入。此时优先把备份改为增量、限制并发,并把归档输出迁移到独立数据盘。
常见误判与处理建议
很多 I/O(输入输出)问题拖很久,是因为一开始就误判方向。看到 %util 高就升级套餐,可能忽略备份脚本无限写入;看到数据库慢就改 SQL(结构化查询语言),可能漏掉磁盘等待时间;看到 fio 分数低就下结论,也可能是测试目录选错了磁盘。
更稳妥的方式是先区分 3 类问题:任务调度冲突、应用写入异常、资源规格不足。前两类通常先靠错峰、限速、清理缓存目录和优化慢查询解决;只有持续写入量接近磁盘基线,才进入存储升级或迁移评估。
如果你需要部署高写入业务,建议先按模型选择资源:企业站关注稳定响应,数据库应用关注随机 I/O(输入输出)和延迟,下载站还要评估 带宽(网络传输能力) 与磁盘吞吐。

排查后的优化顺序
完成定位后,不建议马上做大规模迁移。先从低风险动作开始,观察指标是否回落,再决定是否进入架构调整。这样既能减少业务中断,也能避免把短期异常误当成长期容量不足。
建议按这个顺序处理:
- 错峰:把备份、压缩、批量导入从 20:00 高峰改到 03:30,并保留 7 天日志。
- 限速:对
rsync或备份脚本设置 I/O(输入输出)优先级,例如使用ionice -c2 -n7。 - 拆分目录:把数据库、上传文件、备份归档放到不同磁盘或挂载点,减少同盘竞争。
- 优化应用:检查慢查询、日志级别和缓存清理策略,降低每分钟小文件写入量。
- 评估扩容:当业务峰值长期超过磁盘基线的 70%-80%,再考虑升级或迁移。
例如后台备份可以这样降低优先级:
ionice -c2 -n7 nice -n 10 /usr/local/bin/backup.sh
调整后继续观察:
iostat -xz 5 12
pidstat -d 5 12
如果 await 从 80ms 降到 8ms,业务响应也恢复,就说明主要矛盾是任务调度;如果优化后仍长期高延迟,就需要继续看数据库写入模式和存储规格。对于承载关键业务的网站,Hostease 的技术支持和服务器方案可以作为后续评估的一部分,但具体选择仍要以你的业务读写模型、峰值时间和数据增长速度为依据。
总结:用数据闭环,而不是靠猜
Linux 磁盘 I/O(输入输出)瓶颈排查的核心,是把现象拆成三层证据:iostat 判断设备是否繁忙,pidstat 找到具体进程,fio 验证存储能力边界。三者配合起来,能帮助你区分任务调度、应用写入和资源规格三类问题。
如果你需要处理线上慢请求,推荐先保存故障时间线,再执行 1-3 分钟采样,并把命令输出与应用日志放在同一张排查记录里。这样无论是调整备份策略、优化数据库,还是评估新的 独立服务器 或 VPS(虚拟专用服务器)方案,都有清晰依据。总结起来,不要只问“磁盘是不是慢”,而要问“哪一类 I/O(输入输出)在什么时间、由哪个进程、以多大延迟影响了业务”。