Je vide un disque dur sur un système d'exploitation Linux 4.x à l'aide de cette commande:
sudo sh -c 'pv -pterb /dev/zero > /dev/sda'
Et j'ai ouvert un autre tty et j'ai commencé sudo htop
et remarqué ceci:
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
La valeur de IO_WBYTES
semble tout à fait normale, mais IO_RBYTES
reste à 4 Ko et ne change jamais.
J'ai exécuté quelques autres programmes, par exemple
dd if=/dev/zero of=/dev/zero
cat /dev/zero > /dev/zero
et a été surpris de voir qu'aucun d'entre eux ne génère beaucoup de IO_RBYTES
ou IO_WBYTES
.
Je pense que cela n'est spécifique à aucun programme, mais pourquoi ne lit-il pas /dev/zero
et n'écrit-il pas pour /dev/{zero,null}
compter comme octets d'E / S?
/dev/null
ne pas finir par interfacer avec un tel matériel et ne pas obstruer les bus d'E / S. Poussé à l'extrême; les lectures / écritures dans / depuis la mémoire sont-elles également des E / S? Bien sûr, il n'y a pas de délimitation stricte pour ces choses, et tout dépend de la perspective que vous adoptez dans ces choses, et de l'utilité de cette perspective pour vous./dev/{null,zero}
(qui n'est généralement pas un goulot d'étranglement). C'est juste mon point de vue cependant :)read(2)
etwrite(2)
compte comme des E / S, ce qui est très raisonnable dans son propre sens.Réponses:
Ils comptent comme des E / S, mais pas du type mesuré par les champs que vous regardez.
Dans
htop
,IO_RBYTES
etIO_WBYTES
affichez les champsread_bytes
etwrite_bytes
de/proc/<pid>/io
, et ces champs mesurent les octets qui traversent la couche de bloc./dev/zero
n'implique pas la couche de blocs, donc les lectures ne s'affichent pas là-bas.Pour voir les E / S depuis
/dev/zero
, vous devez regarder les champsrchar
etwchar
dans/proc/<pid>/io
, qui apparaissent danshtop
commeRCHAR
etWCHAR
:Voir
man 5 proc
etman 1 htop
pour plus de détails.la source
rchar
etwchar
qui comptent les octets des appels versread(2)
etwrite(2)
, non?read()
n'est certainement pas "lu depuis le stockage "!storage
signifie "toute ligne de bus imaginable", que le stockage en question soit physique ou virtuel ou mmap'd ou une socket virtuelle ou dans le cache L1 - c'est juste n'importe quoi en dehors de la mémoire mappée de ce programme, y compris partagée