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 htop
notar 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_WBYTES
parece bastante normal, pero IO_RBYTES
permanece 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_RBYTES
o IO_WBYTES
.
Creo que esto no es específico de ningún programa, pero ¿por qué no lee /dev/zero
y escribe para /dev/{zero,null}
contar como bytes de E / S?
/dev/null
para 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_RBYTES
yIO_WBYTES
mostrar laread_bytes
ywrite_bytes
campos de/proc/<pid>/io
, y esos campos miden bytes que van a través de la capa de bloque./dev/zero
no 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 camposrchar
y , que se muestran como y :wchar
/proc/<pid>/io
htop
RCHAR
WCHAR
Ver
man 5 proc
yman 1 htop
para más detalles.fuente
rchar
ywchar
eso cuenta bytes de llamadas aread(2)
ywrite(2)
, ¿verdad?read()
definitivamente no es "leído desde el almacenamiento "!storage
que 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