Estou esvaziando um disco rígido em alguns sistemas operacionais Linux 4.x usando este comando:
sudo sh -c 'pv -pterb /dev/zero > /dev/sda'
E eu abri outro tty e comecei sudo htop
e notei isso:
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
O valor de IO_WBYTES
parece bastante normal, mas IO_RBYTES
permanece em 4 KiB e nunca muda.
Eu corri alguns outros programas, por exemplo
dd if=/dev/zero of=/dev/zero
cat /dev/zero > /dev/zero
e ficou surpreso ao ver que nenhum deles gera muito IO_RBYTES
ou IO_WBYTES
.
Eu acho que isso não é específico para nenhum programa, mas por que não lê /dev/zero
e grava para /dev/{zero,null}
contar como bytes de E / S?
/dev/null
não terminam a interface com esse hardware e não obstruem os barramentos de E / S. Levado ao extremo; As leituras / gravações na / da memória também são de E / S? Obviamente, não há delineamento rígido para essas coisas, e tudo depende de qual perspectiva você adota e de quão útil essa perspectiva acaba sendo para você./dev/{null,zero}
(que geralmente não é um gargalo). Essa é apenas a minha perspectiva:)read(2)
ewrite(2)
conta como I / O, que é muito razoável em seu próprio sentido.Respostas:
Eles contam como E / S, mas não do tipo medido pelos campos que você está vendo.
Em
htop
,IO_RBYTES
eIO_WBYTES
mostre os camposread_bytes
ewrite_bytes
de/proc/<pid>/io
, e esses campos medem os bytes que passam pela camada de blocos./dev/zero
não envolve a camada de bloco; portanto, as leituras dela não aparecem lá.Para ver as E / S de
/dev/zero
, você precisa olhar para os camposrchar
e , que aparecem como e :wchar
/proc/<pid>/io
htop
RCHAR
WCHAR
Veja
man 5 proc
eman 1 htop
para detalhes.fonte
rchar
ewchar
isso conta bytes de chamadas pararead(2)
ewrite(2)
, certo?read()
definitivamente não é "lido do armazenamento "!storage
eles significam "qualquer linha de barramento concebível", independentemente de o armazenamento em questão ser físico ou virtual ou mmap'd ou um soquete virtual ou no cache L1 - é apenas algo fora da memória mapeada desse programa, incluindo compartilhada