您有没有碰到过:没有运行任何程序,磁盘却不断执行读写动作,io指示灯常亮,各种操作迟缓甚至卡顿。碰到这种状况往往会感到束手无策,因为并不是 cpu 居高不下,可以立即结束相关进程。而突然结束进程中断磁盘 io 操作甚至可能导致正在写入的数据丢失。
什么进程在读写磁盘?
可能是 firefox,可能是 updatedb,也可能是正在运行的 pacman -Syu,一切皆有可能 ……
怎么查看是什么进程在不断的读写磁盘呢?
请使用 iotop 命令查看:
通过输出结果,我们可以清楚地知晓是什么程序在读写磁盘,速度以及命令行,pid 等信息。 |
从截图中可以看到,pacman 在升级系统的时候,io 竟然占到了 99.99%。因为 pacman 的数据库是零散的小文件,所以读取速率不大,但是 io 却很高。通过 iotop,我们可以轻松辨识频繁读写磁盘的程序。
进一步思考:该程序在读写什么文件?
这个问题其实很简单,通过 lsof 命令我们就可以达到目的:
1 |
|
同样,如果我们知道了被频繁读取的文件是哪个,也可以反查程序:
|
|
|
在 cpu(s) 一行,我们可以看到 wa 项,它就是 io waiting,如果该值过大且持续很久,就证明遇到了 io 瓶颈。需要对软件进行优化,或对硬件进行升级。
如何进行 io 瓶颈测试?
大文件 io 测试:
|
|
|
|
执行该 shell 脚本前,请先运行 iotop 等程序监控 io 状况。运行脚本:
|
为什么会产生 io 瓶颈?
原因是多种多样的,可能是坏道,也可能是程序 bug,甚至是电压不稳。。。
曾经碰到 io 100%,读写速率却只有 2m/s 的移动硬盘,经过检测,大概有 80% 以上区域是坏道部分;还有可能是因为 pv 的直线上升,服务器无法承受如此大的荷载而导致 io 增高;或者 gnome 的 tracker 正在制作索引;也许您忘记了后台正在 making 的程序
由于原因是多种多样的,在此不能一一列举。读者发现 io 瓶颈后,可以对症下药,先软后硬排除问题,使系统恢复到最佳状态。