iotop 显示磁盘写入速度为 1.5 MB/s,但所有程序均为 0.00 B/s

iotop 显示磁盘写入速度为 1.5 MB/s,但所有程序均为 0.00 B/s

我不明白iotop输出:它显示大约 1.5 MB/s 的磁盘写入(右上角),但所有程序都有 0.00 B/s。为什么?

在此输入图像描述

该视频是在我删除包含数百万文件的文件夹内容时拍摄的使用 perl -e 'for(<*>){((stat)[9]<(unlink))}',在 Kubuntu 14.04.3 LTS x64 上。

iotop是使用sudo iotop.

答案1

iotop 显示的信息对于各个进程和整个系统的收集方式不同。 “实际”全局数据不是每个进程数据的总和(这就是“总计”)。

所有信息均收集自进程文件系统

  • 对于每个进程,iotop 从 读取数据,特别是和值。这些是传入的字节数和系统调用(包括、、、等变体)。/proc/PID/iorcharwcharreadwritereadvwritevrecvsend
  • 全局“实际”值从 读取/proc/vmstat,特别是pgpginpgpgout值。它们测量内核和硬件之间交换的数据(更准确地说,这是由内核中的块设备层混洗的数据)。

每个进程的数据和块设备层数据不同的原因有很多。尤其:

  • 缓存和缓冲意味着在一层发生的 I/O 可能不会在另一层同时发生或发生相同的次数。例如,从缓存中读取的数据被视为从访问它的进程中读取,但没有从硬件中进行相应的读取(之前已经发生过,可能代表另一个进程)。
  • 进程级数据包括在管道、套接字和其他不涉及底层磁盘或其他块设备的输入/输出上交换的数据。
  • 进程级数据仅考虑文件内容,不考虑元数据。

最后一个差异解释了您在这里看到的内容。删除文件只会影响元数据,不会影响数据,因此该过程不会写入任何内容。它可能正在读取目录内容以列出要删除的文件,但这足够小,以至于它可能会在不被注意的情况下滚动。

我认为 Linux 没有提供任何监视文件元数据更新的方法。您可以通过/sys/fs某些文件系统下面的条目监视每个文件系统的 I/O。我认为您无法针对特定进程来计算元数据 I/O,在一般情况下这样做会非常复杂,因为多个进程可能会导致相同的元数据被读取或更改。

相关内容