我不明白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/io
rchar
wchar
read
write
readv
writev
recv
send
- 全局“实际”值从 读取
/proc/vmstat
,特别是pgpgin
和pgpgout
值。它们测量内核和硬件之间交换的数据(更准确地说,这是由内核中的块设备层混洗的数据)。
每个进程的数据和块设备层数据不同的原因有很多。尤其:
- 缓存和缓冲意味着在一层发生的 I/O 可能不会在另一层同时发生或发生相同的次数。例如,从缓存中读取的数据被视为从访问它的进程中读取,但没有从硬件中进行相应的读取(之前已经发生过,可能代表另一个进程)。
- 进程级数据包括在管道、套接字和其他不涉及底层磁盘或其他块设备的输入/输出上交换的数据。
- 进程级数据仅考虑文件内容,不考虑元数据。
最后一个差异解释了您在这里看到的内容。删除文件只会影响元数据,不会影响数据,因此该过程不会写入任何内容。它可能正在读取目录内容以列出要删除的文件,但这足够小,以至于它可能会在不被注意的情况下滚动。
我认为 Linux 没有提供任何监视文件元数据更新的方法。您可以通过/sys/fs
某些文件系统下面的条目监视每个文件系统的 I/O。我认为您无法针对特定进程来计算元数据 I/O,在一般情况下这样做会非常复杂,因为多个进程可能会导致相同的元数据被读取或更改。