如何在Linux系统中不使用iotop监控磁盘I/O?
嗨,我完全懂你说的iotop启动慢的痛点——磁盘被狂读写的时候,等它加载出来那几分钟真的急死人!不过不用愁,咱们有不少更直接的办法,不管是通过/proc文件系统用BASH脚本搞定,还是用其他轻量工具,都能快速拿到磁盘I/O的信息。
一、直接读取/proc文件系统(纯BASH方式)
Linux的/proc文件系统就是个活的系统状态数据库,磁盘I/O的核心数据都存在这里,不用等任何工具加载,直接读就行:
查看全局磁盘I/O统计:
/proc/diskstats记录了每个磁盘设备的详细I/O数据,包括读写次数、字节数、耗时等。你可以用cat /proc/diskstats直接看,也可以用awk过滤出你关心的设备,比如只看sda的关键指标:awk '/sda/ {print "设备: "$3", 读次数: "$4", 写次数: "$8", 读字节: "$6" B, 写字节: "$10" B"}' /proc/diskstats这里的字段对应关系可以自己调整,比如想加读写耗时的话,$7是读耗时,$11是写耗时,按需加就行。
查看单个进程的I/O情况:每个进程的PID目录下都有个
io文件,比如PID是1234,直接执行:cat /proc/1234/io里面的
rchar是进程读取的总字节数,wchar是写入的总字节数,syscr和syscw分别是发起的读写系统调用次数,能精准定位单个进程的I/O行为。如果想批量找最耗I/O的进程,用个简单的BASH循环就行:for pid in $(ls /proc | grep '^[0-9]'); do if [ -f /proc/$pid/io ]; then read -r rchar wchar < <(awk '/rchar|wchar/ {print $2}' /proc/$pid/io) echo "PID $pid: 读总字节=$rchar, 写总字节=$wchar" fi done | sort -k 5 -nr | head -10这个脚本会按写总字节倒序排列,输出前10个最耗磁盘的进程,启动瞬间就能出结果。
二、用轻量工具替代iotop
如果你觉得手动写脚本麻烦,还有几个启动快、资源占用极低的工具,比iotop靠谱多了:
iostat:几乎所有Linux发行版都自带(属于sysstat包),能快速显示系统整体和单个磁盘的I/O速率、响应时间等。实时监控的话,每秒刷新一次:
iostat -x 1-x参数会显示扩展统计,比如%util字段能告诉你磁盘的繁忙程度,接近100%的话说明磁盘已经满负荷了。pidstat:同样是sysstat包里的工具,专门聚焦进程级别的I/O统计,启动速度飞快。每秒刷新一次所有进程的I/O数据:
pidstat -d 1它会直接列出每个进程的PID、进程名、读写速率,一眼就能找到哪个进程在狂读写磁盘。
dstat:这个工具把磁盘、CPU、网络等统计整合在一起,输出更直观。如果没装的话,用包管理器装一下(比如
apt install dstat),然后只看磁盘I/O:dstat -d它会实时显示总读写速率,以及每个磁盘的具体情况,界面友好还不卡。
备注:内容来源于stack exchange,提问作者swwwww

