为什么从 /dev/zero 读取的数据不计为 IO_RBYTES?

为什么从 /dev/zero 读取的数据不计为 IO_RBYTES?

我正在使用以下命令清空某些 Linux 4.x 操作系统上的硬盘驱动器:

sudo sh -c 'pv -pterb /dev/zero > /dev/sda'

我打开另一个 tty 并开始sudo htop并注意到这一点:

  PID USER      PRI  NI CPU%   RES   SHR   IO_RBYTES   IO_WBYTES S   TIME+  Command
 4598 root       20   0 15.5  1820  1596        4096    17223823 D  1:14.11 pv -pterb /dev/zero

的值IO_WBYTES看起来很正常,但IO_RBYTES仍保持在 4 KiB 并且从未改变。

我运行了一些其他程序,例如

dd if=/dev/zero of=/dev/zero
cat /dev/zero > /dev/zero

并惊讶地发现它们都没有生成很多IO_RBYTESor IO_WBYTES

我认为这不是特定于任何程序的,但为什么读取/dev/zero和写入不/dev/{zero,null}计为 I/O 字节呢?

答案1

它们确实算作 I/O,但不是您正在查看的字段所测量的类型。

htopIO_RBYTES和中IO_WBYTES显示read_bytes和字段,这些字段测量通过块层的字节。不涉及块层,因此从中读取的内容不会显示在那里。write_bytes/proc/<pid>/io/dev/zero

要查看来自 的 I/O /dev/zero,您需要查看中的rchar和字段,它们显示在as和 中:wchar/proc/<pid>/iohtopRCHARWCHAR

字符型: 读取的字符

此任务导致从存储中读取的字节数。这只是该进程传递给的字节总和read(2)和类似的系统调用。它包括终端 I/O 等内容,并且不受是否需要实际物理磁盘 I/O 的影响(读取可能已从页面缓存中得到满足)。

字符型: 写入的字符

此任务已导致或应导致写入磁盘的字节数。与 rchar 类似的警告也适用于此。

man 5 procman 1 htop了解详情。

相关内容