Önbellek veya başka bir deyişle 'özet' özetleri nasıl hızlandırılır?


33

Tam du(disk kullanımı) bir özetin iki dakikadan fazla sürdüğü büyük bir dosya sistemimiz var . Bu dosya sistemindeki isteğe bağlı dizinler için disk kullanım özetini hızlandırmanın bir yolunu bulmak isterim.

Küçük şubeler için, dusonuçların bir şekilde önbelleklendiğini fark ettim, tekrarlama istekleri çok daha hızlıdır, ancak büyük branşlarda hızlanma ihmal edilebilir hale gelir.

duÖnceki aramadan bu yana değiştirilmemiş dallar için sonuçları hızlandırmanın ya da daha agresif bir şekilde önbelleğe almanın basit bir yolu var mı?

Veya disk kullanım özetlerini daha hızlı verebilecek alternatif bir komut var mı?


8
İki dakika benim için o kadar uzun görünmüyor. Ancak asıl soru şudur: "Du'nun bir şeyi önbelleğe almasını gerçekten istiyor musunuz?" Du, size mümkün olduğu kadar gerçek, mümkün olduğu kadar gerçek disk bloğu sayımlarını vermemeli mi?
Bruce Ediger

Değiştirme işleminin dukötü olacağını kabul ediyorum , ancak aynı arayüze sahip daha hızlı bir sarmalayıcı komut dosyası bizim için çok faydalı olacaktır. Ayrıca, son değiştirilme zamanına bağlı olarak önbellekleme sonuçlarının (ve disk çapında hiçbir işlem, örneğin birleştirme işleminin varsayılmaması) kesin boyutta sonuçlar vereceğini tahmin ediyorum: bir şey mi eksik?
Ian Mackinnon

2
Çok fazla disk kullanımıyla ilgileniyorsanız, bir kota eklemeyi düşünebilirsiniz.
pyasi

2
Bruce - Aynı soruyu sorabilirsin find. Ama sonra var locate.
Yuval

Üzerinde iseniz Android'de , bir göz atın StatFsbir süper hızlı dizin boyutlarda tahmin için. Büyük, karmaşık dizinler için neredeyse 1000 kat daha hızlıydı du.
Joshua Pinter

Yanıtlar:


21

Bir du komutunu çalıştırdığınızda gördüğünüz, disk tamponlamanın etkisidir. Bir bloğu okuduğunuzda, disk bloğu, bu blok gerekli olana kadar arabellek önbelleğinde tutulur. Bunun için dizindeki her bir dosya için dizini ve inode'u okumalısınız. Du sonuçları bu durumda önbelleğe alınmaz, ancak çok daha az disk GÇ ile elde edilebilir.

Sistemi bu bilgileri önbelleğe almaya zorlamak mümkün olmakla birlikte, genel olarak performans, istenen tampon alanın aktif olarak erişilen dosyalar için mevcut olmayacağından zarar görecektir.

Dizinin kendisi bir dosyanın ne kadar büyük olduğu konusunda hiçbir fikri yoktur, bu nedenle her bir dosyanın inode'una erişilmesi gerekir. Önbellek değerini her dosya boyutu değiştiğinde güncel tutmak için önbellek değerinin güncellenmesi gerekir. Bir dosya 0 veya daha fazla dizinde listelenebildiği için, bu, her bir dosyanın hangi dizinde listelendiğini bilmesini gerektirir. Bu, inode yapısını büyük ölçüde karmaşıklaştırır ve IO performansını düşürür. Ayrıca du, farklı blok boyutları varsayımıyla sonuç almanıza izin verdiği için, önbellekte gereken verilerin, her olası blok boyutu için önbellek değerini artırması veya azaltması gerekir.


7

Farklı gruplara ait farklı dosya hiyerarşileri için düzenleme yapabilirseniz, disk kotaları ayarlayabilirsiniz . İstemediğiniz sürece üst sınır vermeyin (veya diskin boyutunu yapın). Grubun ne kadar (etkili sonsuz) kota kullandığını anında anlatabileceksiniz.

Bu, dosya sisteminizin grup başına kotaları desteklemesini gerektirir. Linux Ext [234] ve Solaris / * BSD / Linux'un zfs'leri var. Grup kotaları ACL'leri hesaba katarsa, kullanım durumunuz için iyi olurdu, ama sanmıyorum.


7

Yaygın kullanımı du, kullanılarak büyük ölçüde hızlandırılabilir ncdu.

ncdu - NCurses Disk Usage

gerçekleştirir, dusonuçları önbelleğe alır ve onları bir şekilde karşılaştırılabilir olan güzel bir komut satırı gui'de gösterir du -hc -d 1 | sort -h. İlk indeksleme eşit derecede sürer du, ancak tüm alt dizinler mevcut başlangıçta önbelleğe alınmış du bilgisine sahip olduğu için değerli alanı dolduran asıl "suçluyu" aramak hızlanır.

Gerekirse, [r] tuşuna basarak alt dizinler yenilenebilir ve her ikisi de tüm üst dizinlerin istatistiklerini güncelleyen [d] düğmesine basılarak dosyalar / klasörler silinebilir. Silme işlemi onaylamanızı ister.

Eğer gerekliyse, bir cronjob'da ön tarama ncdu -1xo- / | gzip >export.gzyaparak ve daha sonra bunlara erişerek zcat export.gz | ncdu -f-daha fazla hız kazanılabilir , ancak açıkça daha eski bilgiler verilir.


7

Elderu kullanmayı tercih ederim

Agedu, eski ve düzensiz kullanılan dosyaları bulmaya çalışan ve bu dosyaların istenmemesinin muhtemel olduğu varsayımına dayanan bir yazılımdır. (örneğin, yalnızca bir kez görüntülenen İndirmeler)

Temel olarak aynı tür disk taraması yapar du, ancak taradığı her şeyin son erişim zamanlarını da kaydeder. Daha sonra, her bir alt dizine ilişkin sonuçların bir özetini veren ve verimli bir şekilde raporlar oluşturmasını sağlayan bir dizin oluşturur ve daha sonra talep üzerine bu raporları oluşturur.


4
Soruyu cevaplamıyor ama yine de +1. Güzel ipucu.
0xC0000022L

Soruyu, gerçekten soruyu cevapladığını daha açık hale getirmek için soruyu değiştirdim (ortada disk kullanımını ve erişim zamanını endeksler).
Anthony G - Monica için adalet

5

SHW tarafından belirtildiği gibi, agedugerçekten bir endeks yarattı. Hakkında okuduktan sonra bir dizin oluşturmak için başka bir yol paylaşacağımı düşündüm locatedb. Bir kendi sürümünü oluşturabilirsiniz locatedbgelen duçıkışı:

du | awk '{print $2,$1}' | /usr/lib/locate/frcode > du.locatedb

awkdu çıktısını ilk önce dosya adlarına sahip olacak şekilde yeniden düzenler, böylece frcodedoğru çalışır. Ardından locate, disk kullanımını hızlı bir şekilde raporlamak için bu veritabanıyla birlikte kullanın :

locate --database=du.locatedb pingus

Bunu gereksinimlerinize uyacak şekilde genişletebilirsiniz. Bence locatedb'ın hoş bir kullanımı.


3
duc

(bkz https://duc.zevv.nl ) aradığınız şey olabilir.

Duc, disk kullanımını optimize edilmiş bir veritabanında depolar ve bu da hızlı bir kullanıcı arayüzü sağlar. Dizin tamamlandıktan sonra bekleme süresi yoktur.

Dizini güncellemek benim için çok hızlı (121k dizinlerde yaklaşık 950k dosyalar için 10 saniyeden az, 2.8 TB). Bir GUI ve bir ncurses UI'sı var.

Kullanım örneğin:

duc index /usr
duc ui /usr

Web sitesinden:

Duc, büyük dosya sistemlerine ölçeklendirmek için üretilmiştir: yüzlerce milyon dosyayı petabayt depolama alanında sorunsuzca indeksler ve görüntüler.


2

Her 10 dakikada bir defalarca güncellenen bir cronjob var. Tüm dosya sistemi tamponlarını güzel ve taze tutar. Belki de ucuz RAM'i iyi bir şey için kullanabilirsin. 'Önce' ve 'Sonra' bölümlerini kullanın.


Cevabınızın soru ile nasıl ilişkili olduğunu anlamıyorum. updatedbdisk kullanımı hakkında hiçbir şey söylemez. Sadece diski geçmek için yapıyorsanız, genel performansa zarar vereceksiniz.
Gilles 'SO- kötülük' dur '

3
Dosya boyutlarının sayılması duyavaştır, çünkü diskin etrafına dağılmış, çok sayıda dosyanın meta verilerine erişmek zorundasınız. Güncellenmiş ag'ı agresif olarak çalıştırırsanız, tüm dosyaların meta verileri RAM'de saklanmak zorunda kalır. Bir dahaki sefere başka bir meta veri ağırlıklı işlem çalıştırdığınızda, disklerde binlerce arama yapmak yerine önbelleği kullanırsınız. Normalde ağacın meta verilerinin belirli bir bölümünü önbelleğe alma şansınız çok azdır. 'Meta veri önbellek kullanıma hazırlama' ile, istediğiniz verilerin yeni önbelleğe alınması son derece muhtemeldir. Fiziksel arayış yok == HIZLI.
Marcin

2

Dizinin boyutunu yalnızca bilmeniz gerekiyorsa, bilgileri ekrana yazmaktan kaçınarak çok hızlandırabilirsiniz. Genel toplam dukomutun son satırı olduğu için , onu basitçe yönlendirebilirsiniz tail.

du -hc | tail -n 1

2GB'lık bir dizin yapısı tam listeleme için bir saniyeyi alır ancak bu formda 5’ten azdır.


2
Bence du -hsbu amaç için daha uygun.
lepe

ayrıca--max-depth 1
stevesliva
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.