必须用iotop、pidstat和lsof精准定位磁盘io进程:iotop -o实时显示活跃io进程并按io%排序;pidstat -d 1每秒采样读写速率;lsof排查长期持有块设备句柄的进程。

当系统磁盘指示灯常亮、响应迟缓或怀疑某程序偷偷写日志、同步文件时,必须精准定位正在执行磁盘读写的进程,而非仅看CPU或内存占用。
用iotop实时抓取活跃IO进程
iotop专为进程级IO监控设计,能直接显示每个线程的实时读写速率,且默认只列出有IO动作的项,避免信息干扰。
第一步:打开终端(Ctrl + Alt + T),执行安装命令:sudo apt install iotop。若提示已存在,则跳过此步。
第二步:以root权限运行并过滤静默进程:sudo iotop -o。-o参数是关键,它让界面只显示当前正在读或写的进程,否则你会被大量休眠进程刷屏。
第三步:观察“DISK READ”和“DISK WRITE”两列数值,单位为KB/s或MB/s——数值非零即代表该进程正在发起IO请求。注意顶部实时刷新的IO总量,可辅助判断是否为突发性写入。
第四步:按P键切换按IO%排序,最高者即为当前IO主力;按R键可反转顺序,快速对比读/写倾向。退出按q键。
【务必在sudo环境下运行,普通用户权限无法读取/proc/*/io等内核IO数据】
用pidstat按秒采样IO行为
如果你需要记录一段时间内的IO波动,或想避开iotop的交互式界面做脚本分析,pidstat更轻量、更易集成。
执行命令:pidstat -d 1。其中-d表示启用IO统计,1代表每秒采集一次。
输出中重点关注kB_rd/s(每秒读取千字节)和kB_wr/s(每秒写入千字节)两列,数值持续大于0的进程即为活跃IO源。
若需聚焦某类进程,例如只看用户uosi启动的程序,加参数:pidstat -d -U uosi 1。不加-U则默认统计所有用户进程。
按Ctrl+C终止采样。输出结果可重定向至文件便于后续比对:pidstat -d 1 60 > io_log.txt(采集60秒)。
用lsof查进程打开的块设备文件
当iotop和pidstat都未捕获到明显IO但磁盘仍持续忙时,可能是进程正持有设备文件句柄却未频繁发起请求,此时需查其打开的底层设备。
方法一:列出所有打开/dev/sd*或/dev/nvme*设备的进程:sudo lsof | grep -E "/dev/(sd|nvme)"。
方法二:针对特定设备深挖,例如查谁在用/dev/sdb1:sudo lsof /dev/sdb1。输出中COMMAND列为进程名,PID为进程号,TYPE列显示是CHR(字符设备)还是BLK(块设备)。
注意:lsof结果反映的是“已打开设备”,不等于“正在读写”,但它是排查后台服务(如数据库、备份工具)长期持锁或缓存刷盘的重要线索。











