Warum zählen Lesevorgänge von / dev / zero nicht als IO_RBYTES?

25

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 htopund 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_WBYTESscheint ganz normal zu sein, IO_RBYTESbleibt 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_RBYTESoder erzeugt IO_WBYTES.

Ich denke, das ist nicht programmspezifisch, aber warum liest /dev/zeround schreibt /dev/{zero,null}man nicht als E / A-Bytes?

iBug
quelle
5
Ich bin gespannt, warum sie Ihrer Meinung nach als I / O gelten sollten.
20.
1
@marcelm Ich denke, jede Eingabe / Ausgabe sollte als E / A zählen, einschließlich Datei-R / W, Netzwerk-E / A und viele mehr.
iBug
Diese Vorgänge führen jedoch E / A-Vorgänge an der Hardware (Festplatte bzw. Netzwerkkarte) durch und müssen über einen E / A-Bus (z. B. PCI-Express) übertragen werden, was allesamt einen erheblichen Engpass darstellen kann. Schreibt zum Beispiel, /dev/nullum 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.
März
1
Mein erster Kommentar sollte Sie (und andere) dazu anregen, über diese Perspektiven nachzudenken und herauszufinden, warum Sie Ihre Perspektive einnehmen. Ich will nicht andeuten, dass du falsch liegst. Ich glaube nicht einmal, dass die Situation so schwarz und weiß ist. Aber ich persönlich würde mich viel mehr für E / A-Statistiken zu tatsächlicher Hardware interessieren (was sehr wohl ein Engpass sein kann) als zu /dev/{null,zero}(was normalerweise kein Engpass ist). Das ist aber nur meine Perspektive :)
Marcelm
1
@marcelm Aber ich dachte anfangs, dass jeder read(2)und write(2)als I / O zählt, was in seinem eigenen Sinne sehr vernünftig ist.
iBug

Antworten:

54

Sie zählen zwar als E / A, entsprechen jedoch nicht dem Typ, der in den von Ihnen betrachteten Feldern gemessen wird.

In htop, IO_RBYTESund IO_WBYTESzeigen die read_bytesund write_bytesFelder aus /proc/<pid>/io, und die Felder messen Bytes , die durch die Blockschicht gehen. /dev/zerobezieht 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 Felder rcharund wcharin ansehen /proc/<pid>/io, die htopals RCHARund angezeigt werden WCHAR:

rchar : gelesene Zeichen

Die Anzahl der Bytes, die diese Task zum Lesen aus dem Speicher veranlasst hat. Dies ist einfach die Summe der Bytes, die dieser Prozess an read(2)und ähnliche Systemaufrufe übergeben hat. Es enthält Dinge wie Terminal-E / A und ist nicht davon betroffen, ob tatsächliche physische Datenträger-E / A erforderlich waren oder nicht (der Lesevorgang wurde möglicherweise vom PageCache ausgeführt).

wchar : geschriebene Zeichen

Die Anzahl der Bytes, die diese Task verursacht hat oder verursachen soll, dass auf die Festplatte geschrieben wird. Hier gelten ähnliche Einschränkungen wie bei rchar.

Siehe man 5 procund man 1 htopfür Details.

Stephen Kitt
quelle
So ist es , rcharund wchardass diese Anzahl Bytes von Anrufen zu read(2)und write(2), nicht wahr?
iBug
Ja, das ist richtig.
Stephen Kitt
9
Sprechen Sie über irreführende Formulierungen in der Beschreibung von rchar . Alles, was durchlief, ist read()definitiv nicht "aus dem Speicher lesen "!
ilkkachu
2
@ilkkachu durch storagesie 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
Katze