Bir ext3 dizininde hala kabul edilebilir bir performans elde ederken maksimum dosya sayısı?


25

Zamanla kabaca üç milyon dosyaya ulaşan bir ext3 dizinine yazdığım bir uygulamam var. Söylemeye gerek yok, bu dizinin dosya listesini okumak inanılmaz derecede yavaş.

Ext3'ü suçlamıyorum. Doğru çözüm, uygulama kodunun ./a/b/c/abc.extyalnızca kullanmak yerine alt dizinlere yazmasına izin vermek olacaktır ./abc.ext.

Böyle bir alt dizin yapısına geçiyorum ve sorum basitçe: Kabul edilebilir bir performans elde ederken kabaca kaç tane dosyayı bir ext3 dizininde beklemeliyim? Tecrüben ne?

Veya başka bir deyişle; yapıda üç milyon dosyayı saklamam gerektiğini varsayarsak, yapı ne kadar derin olmalı ./a/b/c/abc.ext?

Açıkçası bu tam olarak cevaplanamayan bir soru, ancak bir top parkı tahmini arıyorum.

Yanıtlar:


12

dir_indexYeteneği destekleyen bir dağıtımınız varsa, tek bir dizinde kolayca 200.000 dosyaya sahip olabilirsiniz. Sadece güvende olmak için 25.000 civarında tutardım. Olmadan dir_index, 5.000'de tutmaya çalışın.


10

Dizin bölmesini nasıl seçtiğinize ÇOK dikkatli olun . "a / b / c", felaket için bana bir reçete gibi geliyor ...

Sadece kör bir şekilde birkaç dizin derinlemesine yapıya gitmeyin, birinci seviyede 100 giriş, ikinci seviyede 100 giriş, üçüncü durumda 100 giriş yapın. Orada bulundum, yaptım, ceketi aldım ve kraterde performans birkaç milyon dosyayla gittiğinde onu yeniden yapılandırmak zorunda kaldım. :-)

"Birden çok dizin" düzenini yapan ve dizin başına yalnızca bir ila beş dosya koyan bir müşterimiz var ve bu onları öldürüyordu. Bu dizin yapısında bir "du" yapmak için 3 ila 6 saat. Buradaki kurtarıcı SSD idi, uygulamalarının bu bölümünü yeniden yazmak istemiyorlardı ve bir SSD bu du süresini saatlerden dakikalara indirdi.

Sorun şu ki, her arama dizini aranıyor ve aranıyor son derece pahalı. Dizinin boyutu da bir faktördür, dolayısıyla daha büyük olmaktansa daha küçük olması büyük bir kazançtır.

Her dizin için kaç dosya olduğuna ilişkin sorunuzu yanıtlamak için, 1.000'in "optimum" olarak konuştuğunu duydum ancak 10.000'deki performans iyi görünüyor.

Bu yüzden, önerdiğim şey, her biri 2 karakter uzunluğunda bir dizin olan, büyük ve küçük harflerden ve rakamlardan oluşan, üst düzeydeki yaklaşık 3800 dizinden oluşan bir dizin seviyesidir. Daha sonra 3800 dosya içeren alt dizinlerde bulunan 14M dosyalarını veya 3M dosyalar için alt dizin başına yaklaşık 1.000 dosyayı tutabilirsiniz.

Başka bir müşteri için böyle bir değişiklik yaptım ve çok büyük bir fark yarattı.


6

Çeşitli dizin boyutlarını posta damgası gibi bir kıyaslama aracıyla test etmeyi denemenizi öneririm , çünkü önbellek boyutu (işletim sistemindeki ve disk alt sisteminde) kendi ortamınıza bağlı olarak çok fazla değişken var.

Benim kişisel kurallarım, 100k dosya / klasöre kadar oldukça iyi performans görmeme rağmen, <= 20k dosya dizin boyutunu hedeflemektir.


3

Tüm dosyalar şu gibi klasörlere gider:

yükleme / [tarih] / [saat] /yo.png

ve herhangi bir performans probleminiz yok.


4
Ve saatte kaç dosya alıyorsunuz?
Cascabel


2

Oldukça güçlü bir sunucuda, 70.000 dosyanın her türlü tahribata yol açabileceğini makul bir yük altında bol miktarda bellekle onaylayabilirim. İçinde 70k dosyaları olan bir önbellek klasörünü kaldırmaya gittim ve apache'nin 255'te maksimuma çıkana kadar yeni örnekler üretmeye başlamasına neden oldu ve sistem tüm boş belleği kullandı (sanal durum daha düşük olsa da 16 gb). Her iki durumda da, 25.000'in altında tutmak muhtemelen çok ihtiyatlı bir harekettir


1

Tecrübelerime göre, en iyi yaklaşım, dosya yapısını önceden fazla çizmemek. En az bir başka cevapta da belirtildiği gibi, performansın bitimiyle ilgili dosya sistemi uzantıları vardır.

Daha sık çarptığım sorun idari açıdan kullanılabilirlik. Bir dizindeki dosya sayısını azaltmak için yapabileceğiniz en az iş, muhtemelen şu anda ihtiyacınız olan yaklaşımdır.

sqrt (3_000_000) == 1732

Tek bir dizindeki birkaç bin dosya bana mantıklı geliyor. Kendi durumun için kendi hakimin ol. Bunu başarmak için, dosyaları tek bir karma dizin seviyesine ayırmayı deneyin, böylece dizin başına ortalama dosya sayısı dizin sayısı ile aynı olur.

Senin örneğe göre bu olurdu ./a/abc.ext, ./ab/abc.ext, ./abc/abc.ext, ....

Dosyaların yayılması büyük ölçüde gerçek dosya adlarına bağlı olacaktır. Bu tekniği, her biri adlandırılmış milyonlarca dosyanın dizinine uyguladığınızı hayal edin foobar???.txt. Her bir dosya adının MD5 toplamından belirli bir bit bitinin değerini temel alan karma değerine göre daha fazla yayılmayı başarmanın yolları vardır, ancak bunun başarmaya çalıştığınız şey için fazladan tahmin edileceğini tahmin etmeye cüret edeceğim.


1

Hmm, bu makaleyi geçenlerde okudum . Temelde, favori karma algoritma dağılımınızdan yararlanın. Sayılarla oynamaya başladım, INT imzalı bir INS imzalı maksimum 2147483647 değerine sahipti. Ayrıca her bir dizin için istediğiniz dosya sayısını ve alt dizinlerin / dosyaların son sayısına yerleşmek için alt dizinlerin sayısını değiştirebilirsiniz. Belirli bir veri kümesi için dizin başına bölünme, ancak en uygun dizin / dosya kuruluşları hakkında ampirik kanıtlar bulmak zor. Bu makale , dosya sistemlerinde (bazı ilginç metrikler) performans farklılıkları hakkında bazı bilgiler verir, ancak en uygun kuruluşlarla ilgili hiçbir şey vermez.


0

Bence çok fazla düşünürsün. Tek bir ek dizin seviyesi seçtiyseniz ve işleri eşit olarak dengeleyebilseniz, dizin başına 1732 * dizin ve 1732 dosyanız olur.

Onlarca milyarlarca dosyaya ihtiyaç duymadığınız sürece, 1000 ile 100.000 arasında bir sayı seçip iyi sonuçlar alabilirsiniz.

* 3 milyon karekök.

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.