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


25

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

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_RBYTES或大量的细菌IO_WBYTES

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


5
我很好奇,为什么您认为它们应该算作I / O?
marcelm

1
@marcelm我认为任何输入/输出都应计为I / O,包括文件R / W,网络I / O等。
iBug

但是这些操作对硬件(分别是磁盘和网卡)执行I / O ,并且必须通过某些I / O总线(例如PCI-express)进行传输,所有这些都会成为很大的瓶颈。写,例如,/dev/null不要最终与此类硬件接口,也不要阻塞I / O总线。极端的 是对内存的读取/写入还是I / O?当然,对这些事情没有硬性描述,这全都取决于您对这些事情的看法,以及这种看法最终对您有用的程度。
marcelm

1
请注意,我的第一条评论旨在引起您(和其他人)对这些观点的思考,并找出您为什么采纳您的观点。我并不是要暗示你错了;我什至认为情况并非如此。但就我个人而言,我对实际硬件(很可能是瓶颈)的I / O统计信息要比对/dev/{null,zero}(通常不是瓶颈)感兴趣。不过,这只是我的观点:)
marcelm

1
@marcelm但我最初以为任何read(2)write(2)计数为I / O,这是它自己的意义非常合理的。
iBug

Answers:


54

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

htopIO_RBYTESIO_WBYTES示出了read_byteswrite_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


就是这样rcharwchar它计数了对read(2)和的调用中的字节write(2),对吗?
iBug

是的,这是正确的。
Stephen Kitt

9
谈论关于rchar描述的误导性措词。通过的read()所有内容绝对不是“从存储中读取”!
ilkkachu

2
@ilkkachu通过storage他们的意思是“任何可以想象的公交线路”,不论有关存储是否是物理的还是虚拟或mmap'd或L1高速缓存虚拟插座或-这是该程序的内存映射的一切事情之外包括共享
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.