我正在使用以下命令清空某些 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_RBYTES
or IO_WBYTES
。
我认为这不是特定于任何程序的,但为什么读取/dev/zero
和写入不/dev/{zero,null}
计为 I/O 字节呢?
答案1
它们确实算作 I/O,但不是您正在查看的字段所测量的类型。
在htop
、IO_RBYTES
和中IO_WBYTES
显示read_bytes
和字段,这些字段测量通过块层的字节。不涉及块层,因此从中读取的内容不会显示在那里。write_bytes
/proc/<pid>/io
/dev/zero
要查看来自 的 I/O /dev/zero
,您需要查看中的rchar
和字段,它们显示在as和 中:wchar
/proc/<pid>/io
htop
RCHAR
WCHAR
字符型: 读取的字符
此任务导致从存储中读取的字节数。这只是该进程传递给的字节总和
read(2)
和类似的系统调用。它包括终端 I/O 等内容,并且不受是否需要实际物理磁盘 I/O 的影响(读取可能已从页面缓存中得到满足)。字符型: 写入的字符
此任务已导致或应导致写入磁盘的字节数。与 rchar 类似的警告也适用于此。
看man 5 proc
和man 1 htop
了解详情。