Dlaczego odczyty z / dev / zero nie liczą się jako IO_RBYTES?


25

Opróżniam dysk twardy w niektórych systemach operacyjnych Linux 4.x za pomocą tego polecenia:

sudo sh -c 'pv -pterb /dev/zero > /dev/sda'

I otworzyłem kolejny tty i zacząłem sudo htopi zauważyłem to:

  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

Wartość parametru IO_WBYTESwydaje się całkiem normalna, ale IO_RBYTESpozostaje na poziomie 4 KiB i nigdy się nie zmienia.

Na przykład uruchomiłem kilka innych programów

dd if=/dev/zero of=/dev/zero
cat /dev/zero > /dev/zero

i był zaskoczony, widząc, że żaden z nich nie generuje dużo IO_RBYTESlub IO_WBYTES.

Myślę, że nie jest to specyficzne dla żadnego programu, ale dlaczego nie czyta /dev/zeroi pisze, aby /dev/{zero,null}liczyć się jako bajty we / wy?


5
Jestem ciekawy, dlaczego twoim zdaniem powinny się liczyć jako I / O?
marcelm

1
@marcelm Myślę, że każde wejście / wyjście powinno się liczyć jako I / O, w tym R / W pliku, I / O sieci i wiele innych.
iBug

ale te operacje wykonują operacje we / wy na sprzęcie (odpowiednio na dysku i na karcie sieciowej) i muszą być przenoszone przez pewną magistralę we / wy (taką jak PCI-express), z których wszystkie mogą stanowić poważne wąskie gardło. Pisze, powiedzmy, /dev/nullnie kończą interfejsów z takim sprzętem i nie zatykają magistrali we / wy. Podjęte do ekstremum; czy odczytuje / zapisuje do / z pamięci również we / wy? Oczywiście dla tych rzeczy nie ma twardego wytyczenia, a wszystko zależy od tego, jaką perspektywę przyjmujesz i jak użyteczna jest ta perspektywa.
marcelm

1
Uwaga, mój pierwszy komentarz miał na celu sprowokowanie ciebie (i innych) do zastanowienia się nad tymi perspektywami i dowiedzenia się, dlaczego bierzesz swoją perspektywę. Nie chcę sugerować, że się mylisz; Nawet nie sądzę, że sytuacja jest tak czarno-biała. Ale osobiście bardziej interesowałbym się statystykami we / wy do rzeczywistego sprzętu (który może być wąskim gardłem) niż do /dev/{null,zero}(który zwykle nie jest wąskim gardłem). To tylko moja perspektywa :)
marcelm

1
@marcelm Ale początkowo myślałem, że każdy read(2)i write(2)liczy się jako I / O, co jest bardzo rozsądne w swoim znaczeniu.
iBug

Odpowiedzi:


54

Liczą się one jako wejścia / wyjścia, ale nie typu mierzonego przez pola, na które patrzysz.

W htop, IO_RBYTESi IO_WBYTESpokazać read_bytesi write_bytespól z /proc/<pid>/io, i te pola zmierzyć bajtów, które przechodzą przez warstwy bloku. /dev/zeronie obejmuje warstwy blokowej, więc odczyty z niej się tam nie wyświetlają.

Aby zobaczyć I / O z /dev/zero, musisz spojrzeć na pola rchari wcharw /proc/<pid>/io, które pokazują się htopjako RCHARi WCHAR:

rchar : znaki przeczytane

Liczba bajtów, które to zadanie spowodowało odczytaniem z pamięci. Jest to po prostu suma bajtów, do których ten proces przekazał, read(2)i podobne wywołania systemowe. Obejmuje takie rzeczy, jak terminal I / O i nie ma wpływu na to, czy rzeczywiste I / O dysku fizycznego było wymagane (odczyt mógł być satysfakcjonujący z pagecache).

wchar : napisane znaki

Liczba bajtów, które to zadanie spowodowało lub spowoduje zapisanie na dysk. Podobne zastrzeżenia dotyczą tutaj jak w przypadku rchar.

Zobacz man 5 proci man 1 htopszczegóły.


Więc to rchari to, wcharże liczą bajty z połączeń do read(2)i write(2), prawda?
iBug

Tak to prawda.
Stephen Kitt

9
Porozmawiaj o wprowadzających w błąd sformułowaniach na temat opisu rchar . Wszystko, co przeszło, read()zdecydowanie nie jest „czytane z pamięci ”!
ilkkachu

2
@ilkkachu przez storage to „każdą możliwą linię magistrali”, niezależnie od tego, czy pamięć jest fizyczna, wirtualna, mmap'd, czy gniazdo wirtualne, czy w pamięci podręcznej L1 - to wszystko poza mapowaną pamięcią tego programu, w tym współdzielone
cat
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.