Mengapa tidak membaca dari / dev / zero count sebagai IO_RBYTES?

25

Saya mengosongkan hard drive pada beberapa Linux 4.x OS menggunakan perintah ini:

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

Dan saya membuka tty lain dan mulai sudo htopdan memperhatikan ini:

  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

Nilai untuk IO_WBYTEStampaknya cukup normal, tetapi IO_RBYTEStetap pada 4 KiB dan tidak pernah berubah.

Saya menjalankan beberapa program lain, misalnya

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

dan terkejut melihat tidak satupun dari mereka menghasilkan banyak IO_RBYTESatau IO_WBYTES.

Saya pikir ini tidak spesifik untuk program apa pun, tetapi mengapa tidak membaca dari /dev/zerodan menulis untuk /dev/{zero,null}dihitung sebagai I / O byte?

iBug
sumber
5
Saya ingin tahu, mengapa menurut Anda mereka harus dihitung sebagai I / O?
marcelm
1
@marcelm Saya pikir setiap input / output harus dihitung sebagai I / O, termasuk file R / W, I / O jaringan dan banyak lagi.
iBug
tetapi operasi tersebut menjalankan I / O ke perangkat keras (disk, dan kartu jaringan, masing-masing), dan harus melakukan perjalanan melalui beberapa bus I / O (seperti PCI-express), yang semuanya dapat menjadi hambatan yang signifikan. Menulis ke, katakanlah, /dev/nulljangan sampai akhirnya menghubungkan perangkat keras seperti itu dan jangan menyumbat bus I / O. Diambil secara ekstrim; dibaca / ditulis ke / dari memori juga I / O? Tentu saja, tidak ada penggambaran yang sulit untuk hal-hal ini, dan itu semua tergantung pada perspektif mana yang Anda ambil dalam hal-hal ini, dan seberapa bermanfaat perspektif itu bagi Anda.
marcelm
1
Catatan, komentar pertama saya dimaksudkan untuk memprovokasi Anda (dan orang lain) untuk memikirkan perspektif tersebut, dan mencari tahu mengapa Anda mengambil perspektif Anda. Saya tidak bermaksud menyindir Anda salah; Saya bahkan tidak berpikir situasinya hitam dan putih. Tetapi secara pribadi, saya akan jauh lebih tertarik pada statistik I / O untuk perangkat keras yang sebenarnya (yang mungkin sangat menjadi hambatan) daripada /dev/{null,zero}(yang biasanya bukan hambatan). Itu hanya sudut pandang saya :)
marcelm
1
@marcelm Tapi saya awalnya berpikir bahwa apa saja read(2)dan write(2)dianggap sebagai I / O, yang sangat masuk akal dalam arti sendiri.
iBug

Jawaban:

54

Mereka dihitung sebagai I / O, tetapi bukan tipe yang diukur oleh bidang yang Anda lihat.

Di htop, IO_RBYTESdan IO_WBYTEStunjukkan bidang read_bytesdan write_bytesdari /proc/<pid>/io, dan bidang tersebut mengukur byte yang melewati lapisan blok. /dev/zerotidak melibatkan lapisan blok, jadi bacaan dari itu tidak muncul di sana.

Untuk melihat I / O dari /dev/zero, Anda perlu melihat rchardan wcharbidang di /proc/<pid>/io, yang muncul htopsebagai RCHARdan WCHAR:

rchar : membaca karakter

Jumlah byte yang menyebabkan tugas ini harus dibaca dari penyimpanan. Ini hanyalah jumlah byte yang dilewati proses ini read(2)dan panggilan sistem yang serupa. Ini mencakup hal-hal seperti terminal I / O dan tidak terpengaruh oleh apakah I / O disk fisik yang sebenarnya diperlukan (bacaan mungkin telah dipenuhi dari pagecache).

wchar : karakter yang ditulis

Jumlah byte yang disebabkan oleh tugas ini, atau akan menyebabkan ditulis ke disk. Peringatan serupa berlaku di sini seperti dengan rchar.

Lihat man 5 procdan man 1 htopuntuk detailnya.

Stephen Kitt
sumber
Jadi rchardan wcharmenghitung byte dari panggilan ke read(2)dan write(2), kan?
iBug
Ya itu betul.
Stephen Kitt
9
Bicara tentang ungkapan yang menyesatkan pada deskripsi rchar . Semuanya melewati read()pasti bukan "membaca dari penyimpanan "!
ilkkachu
2
@ilkkachu storagemaksudnya "setiap jalur bus yang dapat dibayangkan", terlepas dari apakah penyimpanan yang dimaksud adalah fisik atau virtual atau mmap'd atau soket virtual atau dalam cache L1 - itu hanya apa pun di luar memori yang dipetakan program itu termasuk bersama
cat