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

iBu*_*Bug 26 linux io devices null

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

sudo sh -c 'pv -pterb /dev/zero > /dev/sda'
Run Code Online (Sandbox Code Playgroud)

我打开另一个 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
Run Code Online (Sandbox Code Playgroud)

的值IO_WBYTES看起来很正常,但IO_RBYTES保持在 4 KiB 并且永远不会改变。

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

dd if=/dev/zero of=/dev/zero
cat /dev/zero > /dev/zero
Run Code Online (Sandbox Code Playgroud)

并且惊讶地发现它们中没有一个生成大量IO_RBYTESor IO_WBYTES

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

Ste*_*itt 55

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

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

要查看来自 的 I/O /dev/zero,您需要查看 中的rcharwchar字段/proc/<pid>/io,它们显示htopRCHARWCHAR

rchar : 读取的字符

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

wchar : 写入的字符

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

查看man 5 procman 1 htop了解详情。

  • 谈论对 _rchar_ 的描述的误导性措辞。通过 `read()` 传递的所有内容绝对不是“从 _storage_ 读取”! (9认同)
  • @ilkkachu 的`storage` 他们的意思是“任何可以想象的总线”,无论有问题的存储是物理的还是虚拟的,还是mmap'd,虚拟套接字或L1缓存——它只是该程序映射内存之外的任何东西,包括共享 (2认同)