Grep CPU'yu çalıştırmadığında ne yapar?


19

Eşleşmeleri ararken grep, genellikle sonraki aramanın birinciden önemli ölçüde daha az zaman aldığını fark ediyorum - örneğin 25'ler ve 2'ler. Açıkçası, veri yapılarını son çalışmasından itibaren yeniden kullanmak değil, bunlar yeniden konumlandırılmalıydı. Bir timeemir vererek grep, ilginç bir fenomen fark ettim:

real    24m36.561s
user    1m20.080s
sys     0m7.230s

Zamanın geri kalanı nereye gidiyor? Her seferinde hızlı çalışması için yapabileceğim bir şey var mı? (örneğin, dosyaları greparamadan önce başka bir işlemin dosyaları okumasını sağlamak .)

Yanıtlar:


34

Genellikle sayfa önbelleğiyle ilgilidir .

İlk kez, verilerin diskten (fiziksel olarak) okunması gerekir.

İkinci kez (çok büyük dosyalar için değil) büyük olasılıkla sayfa önbelleğinde oturuyor olabilir.

Böylece önce (çok büyük değil) dosyayı sayfa önbelleğine (yani RAM'de) getirmek için cat (1) gibi bir komut verebilirsiniz , daha sonra ikinci bir grep (1) (veya dosyayı okuyan herhangi bir program) genellikle daha hızlı çalışır .

(ancak, verilerin bir süre diskten okunması gerekir)

Ayrıca bkz (bazen uygulama programlarınızda yararlıdır, ancak pratik olarak nadiren) readahead (2) & posix_fadvise (2) ve belki de madvise (2) & sync (2) & fsync (2) vb.

Ayrıca LinuxAteMyRAM'i okuyun .

BTW, bu yüzden bir programı karşılaştırırken birkaç kez çalıştırmanız önerilir. Ayrıca, bu yüzden daha fazla RAM satın almak yararlı olabilir (verileri için hepsini kullanarak programlar çalıştırmasanız bile).

Daha fazla anlamak istiyorsanız, örneğin İşletim Sistemleri: Üç Kolay Parça gibi bir kitap okuyun


12
Bu TL;DRsorunun cevabı "[blok bekliyor] I / O".
mgarciaisaia

10
@PaulDraper Gerçekten değil :) cat+ grephala yalnızdan daha uzun sürecek grep.
chepner

3
@chepner Başka catbir şey yaparken grep, ilgi alanına hazırlıklı olarak , çoklu iş parçacığı ve ucuz bir ön getirme olarak kullanabileceğiniz sürece .
hBy2Py

2
@MarkKCowan: Sevimli kediler!    :-) ⁠
G-Man `` Monica'yı Yeniden

3
@ G-Man: Aynı etki ve daha yüksek RAM kullanımı için iki cats ile de değiştirebilirsiniz tac: D Veya tac ile tüm kediler
Mark K Cowan

-1

Bir ağ depolama ortamında, sunucudan ayrı bir "dosyalayıcı" da bulunan bir dosyaya ilk kez eriştiğinizde de nispeten önemli gecikmeler olabilir. Bu dosya sunucuda erişildikten sonra, yerel olarak önbelleğe alınacak ve daha sonra verilere erişim çok daha hızlı olacaktır.

İşte grep değil, dosya verilerinin bir sağlama toplamını hesaplayan bir deneme. İlk çağırma yavaştır ve sonraki çağrılar hızlıdır.

> du -Dh file_348m
348M    file_348m

> /usr/bin/time md5sum file_348m
738709b181b52ddfcef3413997f91462  file_348m
0.60user 0.15system 0:03.02elapsed 25%CPU (0avgtext+0avgdata 1524maxresident)k
708144inputs+0outputs (0major+80minor)pagefaults 0swaps

> /usr/bin/time md5sum file_348m
738709b181b52ddfcef3413997f91462  file_348m
0.67user 0.06system 0:00.73elapsed 99%CPU (0avgtext+0avgdata 1524maxresident)k
0inputs+0outputs (0major+80minor)pagefaults 0swaps

> /usr/bin/time md5sum file_348m
738709b181b52ddfcef3413997f91462  file_348m
0.65user 0.07system 0:00.73elapsed 99%CPU (0avgtext+0avgdata 1524maxresident)k
0inputs+0outputs (0major+80minor)pagefaults 0swaps

> /usr/bin/time md5sum file_348m
738709b181b52ddfcef3413997f91462  file_348m
0.66user 0.06system 0:00.73elapsed 99%CPU (0avgtext+0avgdata 1524maxresident)k
0inputs+0outputs (0major+80minor)pagefaults 0swaps

Onları nasıl yorumlayacağımı bilmediğim için aşağı oy (lar) için yorumları takdir ediyorum. Cevap açıklamamın doğru olduğuna inanıyorum. Belki de komut örneği net değil mi? Yoksa grep komutunu karşılaştırmamı sevmiyor musunuz? (Kasten daha basit bir komut kullandım, md5sum, benim açımı göstermek için.)
Winston Smith

1
Bunun nedeni, yayınınızın sorduğum şeyle ilgili yeni bir bilgi eklemediğini düşünüyorum. Bir gecikme olduğunu zaten biliyordum ve ilk cevap zaten bunun neden olduğunu açıkladı. Ama evet, açıklama yapmadan da aşağı oy alıyorum. İyi cevapları olan sorularda bile.
Alex

Bir sebep önerdiğiniz için @Alex'e teşekkürler. Verileri yerel depolamadan belleğe taşımak için genel gider zamanını açıklayan ilk cevap ile ağ depolamadan yerel sunucuya veri taşımak için genel gider süresi arasında ayrım yapmaya çalışıyordum. Bunu daha açık bir şekilde tanımlayabilir miyim veya daha iyi komut örnekleri verebilir miyim diye düşüneceğim.
Winston Smith

Sanırım yazınızı okuduktan sonra, düşüncem, verilerin depolandığı her yerden belleğe taşınması yüküdür. İster ağ depolama alanından isterse yerel depolama alanından olsun, Unix hala bir dizinden belleğe hareket ettiğini düşünüyor. ps-- açıklamam doğru gibi görünüyor-- nedeni ile yorumum bir oy aldı.
Alex

Bakın, aradığınız şey için önemli olmayan bir ayrım ekliyordum. TAMAM. Bu arada, yorumunuzu iptal ettim, bu yüzden aşağı oylama sebebi sorununu çözmez. :-)
Winston Smith
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.