Neden / dev / zero sayısından IO_RBYTES yazmıyorsunuz?


25

Bu komutu kullanarak bazı Linux 4.x işletim sistemlerinde bir sabit sürücüyü boşaltıyorum:

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

Bir tane daha açtım sudo htopve şunu fark ettim:

  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

Değeri IO_WBYTESoldukça normal görünüyor, ancak IO_RBYTES4 KiB'de kalıyor ve hiçbir zaman değişmiyor.

Mesela birkaç başka program çalıştırdım.

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

ve bunların hiçbiri bir sürü oluşturur görmek şaşırdı IO_RBYTESya IO_WBYTES.

Bunun herhangi bir programa özgü olmadığını düşünüyorum, ancak neden okuma /dev/zerove yazma /dev/{zero,null}/ yazma olarak yazmıyor?


5
Merak ediyorum, neden G / Ç olarak saymaları gerektiğini düşünüyorsunuz ?
marcelm

1
@ marcelm Herhangi bir giriş / çıktının, R / W, ağ I / O ve daha birçok dosya dahil G / Ç olarak sayılması gerektiğini düşünüyorum.
iBug

ancak bu işlemler donanıma G / Ç uygular (sırasıyla disk ve ağ kartı) ve bunların hepsinin önemli bir darboğaz olabileceği bazı G / Ç veriyolları (PCI-express gibi) üzerinden seyahat etmesi gerekir. Diyelim ki, /dev/nullböyle bir donanıma arabirim kurmakla kalmıyor ve G / Ç otobüslerini tıkamıyor. Aşırı alınan; G / Ç de belleğe / belleğe okur / yazar? Elbette, bunlar için kesin bir açıklama yoktur ve bunların tümü, bu şeylerde hangi perspektifi aldığınıza ve bu perspektifin sizin için olmasının ne kadar yararlı olduğuna bağlıdır.
marcelm

1
Unutmayın, ilk yorumum sizi (ve diğerlerini) bu bakış açıları hakkında düşünmeye teşvik etmeye ve bakış açınızı neden aldığınızı bulmaya yönelikti. Yanıldığını ima etmek istemem; Durumun bu kadar siyah ve beyaz olduğunu sanmıyorum. Ancak şahsen, gerçek donanıma (çok iyi bir darboğaz olabilir) göre /dev/{null,zero}(genellikle bir darboğaz olmadığından) , I / O istatistiklerine daha fazla ilgi duyardım. Bu sadece benim bakış
açım

1
@marcelm Ama başlangıçta düşünüyordum herhangi read(2)ve write(2)kendi anlamda çok makul I / O gibi sayar.
iBug

Yanıtlar:


54

G / Ç olarak sayılır, ancak baktığınız alan tarafından ölçülen türden değildir.

Olarak htop, IO_RBYTESve IO_WBYTESgöstermek read_bytesve write_bytesgelen alanlarını /proc/<pid>/iove bu alanları blok tabakasının geçmesi bayt ölçer. /dev/zeroblok katmanını içermez, bu yüzden okur orada görünmez.

I / O görmek için /dev/zerobakmak gerekir, rcharve wcharalanların /proc/<pid>/iogörünür, htopolarak RCHARve WCHAR:

rchar : karakter okundu

Bu görevin neden olduğu baytların depodan okunmasına neden oldu. Bu sadece bu işlemin geçtiği baytların read(2)ve benzer sistemlerin toplamıdır . Terminal G / Ç gibi şeyler içerir ve gerçek fiziksel disk G / Ç'nin gerekip gerekmediğinden etkilenmez (okuma, sayfa önbelleğinden memnun olmuş olabilir).

wchar : Yazılan karakterler

Bu görevin neden olduğu veya diske yazılmasına neden olan bayt sayısı. Benzer uyarılar burada rchar'daki gibi geçerlidir

Bkz man 5 procve man 1 htopdetaylar için.


O yüzden rcharve wcharo sayımı için aramaların bayt read(2)ve write(2)sağ?
iBug

Evet bu doğru.
Stephen Kitt

9
Rchar açıklaması yanıltıcı ifadeler hakkında konuşun . read()Kesinlikle geçen her şey " depodan okumak " değildir!
ilkkachu

2
tarafından @ilkkachu storageonlar bakılmaksızın söz konusu depolama fiziksel veya sanal veya mmap'd veya L1 önbelleği bir sanal yuva veya olup olmadığı "Herhangi akla otobüs hattı", yani - o programın eşlenen bellek sadece bir şey dışında paylaşılmasını dahil var
Kedi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.