Estoy vaciando un disco duro en algunos SO Linux 4.x usando este comando:
sudo sh -c 'pv -pterb /dev/zero > /dev/sda'
Y abrí otro tty y comencé a sudo htopnotar esto:
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
El valor de IO_WBYTESparece bastante normal, pero IO_RBYTESpermanece en 4 KiB y nunca cambia.
Ejecuté algunos otros programas, por ejemplo
dd if=/dev/zero of=/dev/zero
cat /dev/zero > /dev/zero
y me sorprendió ver que ninguno de ellos genera mucho IO_RBYTESo IO_WBYTES.
Creo que esto no es específico de ningún programa, pero ¿por qué no lee /dev/zeroy escribe para /dev/{zero,null}contar como bytes de E / S?

/dev/nullpara no terminar la interfaz con ese hardware y no obstruir los buses de E / S. Llevado al extremo; ¿son las lecturas / escrituras a / desde la memoria también E / S? Por supuesto, no hay una delineación difícil para estas cosas, y todo depende de la perspectiva que tome en estas cosas y de cuán útil esa perspectiva termine siendo para usted./dev/{null,zero}(que generalmente no es un cuello de botella). Sin embargo, esa es solo mi perspectiva :)read(2)ywrite(2)cuenta como E / S, lo cual es muy razonable en su propio sentido.Respuestas:
Cuentan como E / S, pero no del tipo medido por los campos que está viendo.
En
htop,IO_RBYTESyIO_WBYTESmostrar laread_bytesywrite_bytescampos de/proc/<pid>/io, y esos campos miden bytes que van a través de la capa de bloque./dev/zerono involucra la capa de bloque, por lo que las lecturas de ella no aparecen allí.Para ver las E / S desde
/dev/zero, debe mirar los camposrchary , que se muestran como y :wchar/proc/<pid>/iohtopRCHARWCHARVer
man 5 procyman 1 htoppara más detalles.fuente
rcharywchareso cuenta bytes de llamadas aread(2)ywrite(2), ¿verdad?read()definitivamente no es "leído desde el almacenamiento "!storageque quiere decir "cualquier línea de autobús concebible", independientemente de que el almacenamiento en cuestión es físico o virtual o mmap'd o una toma virtual o en la caché L1 - está justo fuera nada de memoria mapeada de ese programa, incluyendo compartida