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


18

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

在此处输入图片说明

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

iotop是使用启动的sudo iotop

Answers:


22

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

所有信息都是从proc文件系统中收集的。

  • 对于每个进程,iotop都会从中读取数据,特别是和值。这些都是在传递的字节数和系统调用(包括变体,如,,,,等等)。/proc/PID/iorcharwcharreadwritereadvwritevrecvsend
  • 从中读取全局“实际”值/proc/vmstat,特别是pgpginpgpgout值。这些度量了内核和硬件之间交换的数据(更确切地说,这是内核中的块设备层重新排列的数据)。

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

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

最后的区别解释了您在这里看到的内容。删除文件只会影响元数据,不会影响数据,因此该过程不会写入任何内容。它可能正在读取目录内容以列出要删除的文件,但是它很小,可能被不经意滚动。

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


1
很好的答案,谢谢。您会建议一种更可靠的方法来跟踪输出的变化吗?
Rui F Ribeiro 2015年

1
@RuiFRibeiro您可以通过查看它来查看rm -r当前正在处理的文件strace,但是由于每个目录中的遍历顺序有些不可预测,因此它不能为完成百分比提供非常有用的估计。如果该文件系统中仅执行一项大型操作,并且没有太多硬链接,那么观看将df -i告诉您已处理了多少文件。
吉尔斯(Gilles)'所以别再邪恶了'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.