怎么查看是哪个进程在疯狂读写硬盘?
在 Linux 终端里找出持续占用磁盘 I/O 的进程,确认它是长期占用而不是偶尔突发,再用 iostat 验证磁盘已经安静下来。
快速开始
硬盘灯一直闪、CPU 明明很闲却很卡、load average 居高不下,多半是某个进程把磁盘占满了。下面这几步教你在终端里锁定这个进程、确认它确实是元凶,并在处理完之后检查磁盘是否已经恢复正常。
症状
先找出此刻正在读写的进程
iotop 相当于磁盘 I/O 版的 top:它按进程列出读写吞吐,加上 -o 就只显示真正有 I/O 的进程,不用在一屏空闲进程里翻找。记下第一行第一列的 PID,以及这个进程到底是什么——数据库、备份、同步客户端还是某个异常服务。-a 会把瞬时速率换成累计总量,对那种一阵一阵爆发的进程更好判断。如果列表始终是空的,说明压力来自内核回写或缓存刷盘,而不是普通用户进程。
确认这个进程是持续占用,而不是偶尔冒一下
pidstat 加 -d 会按进程输出 I/O 数据,再带上 -u -r 就能同时看到 CPU 和内存,方便判断它到底是不是卡在磁盘上。把命令里的 1234 换成你在上一步 iotop 第一列记下的 PID,末尾两个数字分别是采样间隔(秒)和采样次数。如果每次采样的 kB_rd/s、kB_wr/s 都很高,那就是它了;如果几乎为零,就回到 iotop 列表里看下一个进程。
pidstat 可按时间序列输出某个 PID(或全部任务)的 CPU、内存和 I/O 统计,适合长时间记录进程行为。
$ pidstat -u -r -d -p 1234 2 5确认磁盘已经安静下来
停掉、重启或调整完那个进程之后,再跑一次 iostat -x,盯着刚才繁忙的那块设备的 %util 和 await。%util 应该降到个位数,读写队列也应该清空。如果还是顶在 100% 附近,说明还有别的东西在压这块盘——可能是另一个进程、RAID 重建,或者磁盘本身快坏了,那就回到 iotop 再排查一轮。
iostat -x 按设备输出扩展统计——r/s、w/s、await 和 %util——并按间隔刷新,方便观察饱和度。
$ iostat -x 2 5如何确认已解决
停掉、重启或调整完那个进程之后,iostat -x 里的 %util 应该回落到个位数,await 也接近该设备平时的水平;再跑一次 iotop -o 时,应该只剩偶尔的短时突发。
来源
- iotop(8) — Debian manpage依据: Debian manpage for iotop documents -o (only show processes actually doing I/O) and -a (accumulated I/O) options
- iotop(8) — Arch Linux manual依据: Arch manual describes iotop's --only (-o) option to show only processes or threads actually doing I/O
- pidstat(1) - Report statistics for Linux tasks依据: pidstat reports statistics for Linux tasks (processes): -u CPU usage, -r memory, -d I/O, -p selects a task, with interval and count arguments.
- iostat(1) - Report CPU statistics and I/O statistics for devices依据: -x shows extended statistics; interval and count parameters report repeatedly; %util is the percentage of elapsed time during which the device was busy.
最后验证: 2026-09-22