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 htop
i 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_WBYTES
wydaje się całkiem normalna, ale IO_RBYTES
pozostaje 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_RBYTES
lub IO_WBYTES
.
Myślę, że nie jest to specyficzne dla żadnego programu, ale dlaczego nie czyta /dev/zero
i pisze, aby /dev/{zero,null}
liczyć się jako bajty we / wy?
/dev/null
nie 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./dev/{null,zero}
(który zwykle nie jest wąskim gardłem). To tylko moja perspektywa :)read(2)
iwrite(2)
liczy się jako I / O, co jest bardzo rozsądne w swoim znaczeniu.Odpowiedzi:
Liczą się one jako wejścia / wyjścia, ale nie typu mierzonego przez pola, na które patrzysz.
W
htop
,IO_RBYTES
iIO_WBYTES
pokazaćread_bytes
iwrite_bytes
pól z/proc/<pid>/io
, i te pola zmierzyć bajtów, które przechodzą przez warstwy bloku./dev/zero
nie obejmuje warstwy blokowej, więc odczyty z niej się tam nie wyświetlają.Aby zobaczyć I / O z
/dev/zero
, musisz spojrzeć na polarchar
iwchar
w/proc/<pid>/io
, które pokazują sięhtop
jakoRCHAR
iWCHAR
:Zobacz
man 5 proc
iman 1 htop
szczegóły.źródło
rchar
i to,wchar
że liczą bajty z połączeń doread(2)
iwrite(2)
, prawda?read()
zdecydowanie nie jest „czytane z pamięci ”!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