Ich lösche eine Festplatte unter einem Linux 4.x-Betriebssystem mit dem folgenden Befehl:
sudo sh -c 'pv -pterb /dev/zero > /dev/sda'
Und ich öffnete ein weiteres tty und fing an sudo htop
und bemerkte dies:
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
Der Wert für IO_WBYTES
scheint ganz normal zu sein, IO_RBYTES
bleibt aber bei 4 KiB und ändert sich nie.
Ich habe zum Beispiel ein paar andere Programme ausgeführt
dd if=/dev/zero of=/dev/zero
cat /dev/zero > /dev/zero
und war überrascht zu sehen, dass keiner von ihnen eine Menge von IO_RBYTES
oder erzeugt IO_WBYTES
.
Ich denke, das ist nicht programmspezifisch, aber warum liest /dev/zero
und schreibt /dev/{zero,null}
man nicht als E / A-Bytes?
/dev/null
um keine Schnittstellen für solche Hardware zu erhalten und E / A-Busse nicht zu verstopfen. Auf das Äußerste gebracht; Werden Lese- / Schreibvorgänge in / aus dem Speicher auch E / A-Vorgänge ausgeführt? Natürlich gibt es für diese Dinge keine genaue Abgrenzung, und alles hängt davon ab, welche Perspektive Sie in diesen Dingen einnehmen und wie nützlich diese Perspektive letztendlich für Sie ist./dev/{null,zero}
(was normalerweise kein Engpass ist). Das ist aber nur meine Perspektive :)read(2)
undwrite(2)
als I / O zählt, was in seinem eigenen Sinne sehr vernünftig ist.Antworten:
Sie zählen zwar als E / A, entsprechen jedoch nicht dem Typ, der in den von Ihnen betrachteten Feldern gemessen wird.
In
htop
,IO_RBYTES
undIO_WBYTES
zeigen dieread_bytes
undwrite_bytes
Felder aus/proc/<pid>/io
, und die Felder messen Bytes , die durch die Blockschicht gehen./dev/zero
bezieht die Blockebene nicht mit ein, daher werden die darin enthaltenen Lesevorgänge dort nicht angezeigt.Um I / O von zu sehen
/dev/zero
, müssen Sie sich die Felderrchar
undwchar
in ansehen/proc/<pid>/io
, diehtop
alsRCHAR
und angezeigt werdenWCHAR
:Siehe
man 5 proc
undman 1 htop
für Details.quelle
rchar
undwchar
dass diese Anzahl Bytes von Anrufen zuread(2)
undwrite(2)
, nicht wahr?read()
definitiv nicht "aus dem Speicher lesen "!storage
sie bedeutet „jede denkbare Buslinie“, unabhängig davon , ob die Speicherung in Frage physische oder virtuelle oder mmap'd oder eine virtuelle Steckdose oder in L1 - Cache - es ist nur etwas außerhalb dieses Bildspeichers des Programms geteilt einschließlich