我找到了一个 Linux 命令,可以实时显示哪个应用程序正在占用我的磁盘 I/O
无论我的 Linux 发行版或设置如何,总会有一个时刻,我在日常活动中开始感受到一些变慢或延迟。有时候,这会变得棘手,因为当我使用 top 时,CPU 和内存使用情况看起来正常。
我最近尝试了 iotop,它能够实时显示正在读取或写入我的磁盘的应用程序,这是我在面对性能问题时通常会忽视的一个方面。iotop 现在是我排查 Linux 问题时常用的命令之一。
几秒钟内安装 iotop
设置简单,但大多数指南都遗漏了一个细节
要在基于 Debian 的发行版(如 Ubuntu 或 Mint)上安装 iotop,请运行:
sudo apt install iotop
在 Fedora 上运行 sudo dnf install iotop;在 Arch 上运行 sudo pacman -S iotop。
这个工具有两个版本:常规的 iotop(基于 Python)和 iotop-c(用 C 编写)。iotop-c 是较新的版本,并且在一些现代的 Ubuntu 和 Debian 系统上安装 iotop 时会自动成为默认版本。尽管从界面上几乎无法区分它们,但 iotop-c 在日常使用中更顺畅。在提供 iotop-c 的发行版上,iotop-c 通常是更好的选择。
了解 iotop 真正告诉你的内容
实际显示磁盘压力的少数几个数字
整个 iotop 界面令人眼花缭乱,但一旦你认识到其中很多内容可能无关紧要,理解起来就容易多了。我通常参考四列来做诊断:
- 磁盘读取:显示每秒读取的字节数
- 磁盘写入:显示每秒写入的字节数
- IO%:进程/线程用于 I/O(等待 + 换入)的时间百分比
- 命令:显示进程名称
我经常跳过顶部部分,因为查看总磁盘活动并没有太大帮助,如果你需要追踪原因的话。我通过查看下面的列表获得更好的见解,最重要的标志是 -o 和 -a。使用 -o,我可以得到一个更精简的列表,只包括当前执行 I/O 的进程。-a 则带我进入累计模式,在那里我可以看到自 iotop 启动以来读取或写入的字节总数。
我的大多数诊断都是使用 -o 标志进行的。如果我觉得问题偶尔出现、偶尔卡顿、打开文件时有短暂延迟,或者在 iotop 的实时视图中找不到任何问题时,-a 是最后的选择。
拱门
我如何使用 iotop 捕捉确切的进程
一个将磁盘活动转化为清晰答案的真实工作流程
我意识到我需要 iotop 是在我的系统变慢时,而我平常使用的系统监控工具无法找到元凶。在安装它之后,我运行了命令:sudo iotop -o -d 2。几秒钟之内,一个进程就固定在了顶部。我建议降低刷新频率,这样更容易发现规律(这就是命令中的 -d 2 的作用)。当我观察这个进程时,我看到了在刷新周期内持续发生的磁盘写入。令人印象深刻的是持续的时间,因为短暂的峰值是正常的。
我的浏览器有一个进程不断地向我的磁盘写入兆字节的数据,通过这个观察,我可以排除其他可能的罪魁祸首。在其他情况下,我能够捕捉到导致长时间峰值的不同进程:
- 一个备份任务(rsync)正在持续写入
- 包管理器正在拉取更新
- 一个记录服务写入的内容超过预期
经验法则是,一旦你注意到某个进程持续位于顶部,为多个刷新周期产生 I/O,就应该进行调查。iotop 消除了任何猜测,因为它同时显示活动情况和精确的名称。
一旦找到肇事者该怎么办
将可见性转化为行动而不破坏任何东西
我不会立即终止正在向磁盘写入大量数据的进程。实际上,我采取的具体步骤取决于该进程是什么。当问题进程是用户应用程序时,调整应用程序的设置或完全关闭它都是合理的。你也可以调查是什么触发了该行为。以浏览器为例,可能是某个扩展导致了峰值写入,或者是激进的缓存策略。
然而,当这是一个我不熟悉的进程时,我不会立即结束它。我更倾向于通过谷歌搜索了解更多信息,并判断是否可以安全结束它。
另外,你在顶部看到的并非所有进程都是不可预测行为的迹象。像 kworker 和 jbd2 这样的内核线程可能是正常的——jbd2 与 ext4 日志相关,在大量写入时可能会很高;kworker 是一个通用的内核线程,可能因多种原因出现。要检查一个进程,可以运行 lsof -p PID 查看它访问的文件。将这些信息与 iotop 结合,有助于我了解触发因素。
补充 iotop 的工具
我不会单独使用 iotop。它显示了导致大量磁盘 I/O 的进程。不过,为了上下文,我会将它与其他一些工具结合使用:
|
工具 | 它显示的内容 | 何时使用它 |
|---|---|---|
iostat | 磁盘/设备统计 | 检查整体磁盘负载 |
lsof | 每个进程打开的文件 | 查看正在被访问的内容 |
htop | CPU 使用率 + I/O 等待 | 获取系统范围的上下文 |
通过将 iotop 与这些工具一起使用,我可以追踪涉及高磁盘读写的具体文件。对于大多数问题,故障排除通常不需要进一步深入。iotop 现在是我在终端上运行的最极其有用的命令之一。








