Modern bir dosya sistemindeki milyonlarca dosyanın performans açısından etkileri nelerdir?


30

Diyelim ki ext4 (dir_index etkin) ile 3M dosyalarını barındırmak için (ortalama 750KB boyutunda) kullanıyoruz ve hangi klasör şemasını kullanacağımıza karar vermemiz gerekiyor.

Gelen ilk çözümü , dosyada bir karıştırma fonksiyonu uygulamak ve (ilk seviye için 1 karakter ve ikinci seviyeye 2 karakter olmak üzere) klasör iki düzey kullanın: bu nedenle olma filex.forkarma eşittir abcde1234 , biz / yolu saklayın edeceğiz / a / bc / abcde1234-filex.

Gelen ikinci çözümü , dosyada bir karıştırma fonksiyonu uygulamak ve (ilk seviye için 2 karakter ve ikinci seviyeye 2 karakter olmak üzere) klasör iki düzey kullanın: bu nedenle olma filex.forkarma eşittir abcde1234 , biz onu saklamak edeceğiz / yolu / ab / de /abcde1234-filex.for.

İlk çözüm için, klasör başına ortalama 732 dosyadan oluşan aşağıdaki şemaya /path/[16 folders]/[256 folders]sahip olacağız (dosyanın bulunduğu son klasör).

İkinci çözüm üzerinde iken biz gerekecek /path/[256 folders]/[256 folders]bir ile klasörün başına 45 dosya ortalama .

Bu şemada çok fazla (temel olarak nginx önbellekleme sistemi) dosyalar yazacağız / bağlantılarını kaldıracağız / okuyacağımızı ( ama çoğunlukla okuduğumuzu ) düşünürsek, bir veya başka bir çözüm seçersek, performans anlamında önemli mi olur?

Ayrıca, bu kurulumu kontrol etmek / test etmek için kullanabileceğimiz araçlar nelerdir?


7
Açıkçası kıyaslama yardımcı olacaktır. Ancak ext4 bunun için yanlış bir dosya sistemi olabilir. XFS'ye bakıyordum.
ewwhite,

4
Sadece olmaz bakmak Ben hemen fazla uzatmadan kullanmak istiyorum, XFS. B + ağacı her seferinde hash masasını yener.
Michael Hampton

İpuçları için teşekkürler, kıyaslama biraz zor olsa da denedim hdparm -Tt /dev/hdXama en uygun araç olmayabilir.
leandro moreira

2
Hayır hdparm, doğru araç değildir, blok cihazın ham performansının bir kontrolüdür, dosya sisteminin bir testi değildir.
HBruijn

Yanıtlar:


28

Bu tür bir dizin yapısının yaratılmasının nedeni, dosya sistemlerinin bir dizinin içindeki bir dosyayı bulması gerektiği ve dizin ne kadar büyükse, bu işlem o kadar yavaş olur.

Ne kadar yavaş dosya sistemi tasarımına bağlıdır.

Ext4 dosya sistemi, dizin girişlerini saklamak için bir B-ağacı kullanır . Bu tablodaki bir aramanın, O (log n) zamanı alması beklenir , bu, çoğu zaman ext3 ve önceki dosya sistemlerini kullanan naif doğrusal tablodan daha azdır (ve olmadığında, dizin bunun için çok küçüktür. gerçekten önemli).

XFS dosya sistemi bunun yerine bir B + ağacı kullanır. Bunun bir karma tablo veya B-ağacı üzerindeki avantajı, herhangi bir düğümün, birden fazla çocuğa b sahip olabilmesidir ; burada, XFS b'de değişebilir ve 254 kadar yüksek olabilir (veya kök düğüm için 19 olabilir) ve bu sayılar, eski olabilir ). Bu size bir zaman karmaşıklığını verir O (log b n) , geniş bir iyileştirme.

Bu dosya sistemlerinden herhangi biri, tek bir dizindeki on binlerce dosyayı işleyebilir; XFS, aynı sayıda düğüme sahip bir dizindeki ext4'ten önemli ölçüde daha hızlıdır. Fakat muhtemelen 3M inode'lu tek bir dizini istemiyorsunuzdur, B + ağacıyla bile bu aramanın zaman alabilmesi gibi. Bu, ilk önce bu şekilde dizin oluşturmaya neden oldu.

Önerilen yapılarınız için, verdiğiniz ilk seçenek tam olarak nginx örneklerinde gösterilen şeydir. Her iki dosya sisteminde de iyi performans gösterse de, XFS yine de bir takım avantajlara sahip olacaktır. İkinci seçenek biraz daha iyi veya biraz daha kötü bir performans sergileyebilir, ancak muhtemelen ölçütlerde bile oldukça yakın olacak.


Ve XFS veya ext4 için, dosya sistemini kurduğunuz donanımın performans üzerinde büyük etkisi olacaktır. Yavaş 5400 devir / dakikalık bir SATA sürücüsü yaklaşık 50 rasgele IO işlemi / sn, iyi bir 15.000 devir / dakika SAS sürücüsü birkaç yüz yapabilir ve bir SSD bant genişliği sınırlıdır ve birkaç milyon rastgele IO işlemi / sn alabilir. Daha fazla değilse.
Andrew Henle,

1
Açıkçası, $ O (\ log_b n) $ sabit $ b $ ile $ O (\ log n) $ ile aynı karmaşıklıktadır. Fakat OP'ye göre, gerçek sabitler önemli olacaktır.
Hagen von Eitzen

Dosya sistemimde bir sorun yoksa, ext4 tek bir dizinde 10.000 dosyayı işleyemez. ls -lEğer dizin inode önbelleğini bırakmışsa, basit yapmak tam bir dakikanızı alır. Ve önbelleğe alındığında hala bir saniye sürüyor. Bu oldukça düşük trafiğe sahip bir web sunucusunda bir SSD ve tonlarca RAM bulunan bir Xeon ile birlikte.
Abhi Beckert

@AbhiBeckert ext3'ten yükseltildi mi? Öyleyse, yeni bir dizin oluşturmayı deneyin ve dosyaları bu dizine taşıyın.
Michael Hampton

@Hampton No. bu modern donanımda (oldukça) son zamanlarda kurulum sunucusu. Birkaç aydır sysadmin / data merkezimizle bu konuda çalışıyorum. Sunucuyu kiralamak ve kabul edilebilir bir performans alamamak için ayda binlerce dolar ödüyoruz. Tek seçenek, yeni bir dizin yapısına geçmek gibi görünüyor - belki de dosya adlarının daha düzgün yayılması için tarihler yerine hashlar kullanmak.
Abhi Beckert

5

Tecrübelerime göre, ölçeklendirme faktörlerinden biri, bir karma-ad bölümleme stratejisi verilen inodeların büyüklüğüdür.

Önerilen seçeneklerin her ikisi de, oluşturulan her bir dosya için üç adede kadar inode girişi oluşturur. Ayrıca 732 dosya, normal 16KB'den daha az olan bir inode oluşturacaktır. Bana göre bu, iki seçeneğin de aynı şeyi yapacağı anlamına geliyor.

Kısa karmaşınla seni alkışlıyorum; üzerinde çalıştığım önceki sistemler, verilen dosyanın sha1sum'unu ve bu dizgiye dayanan dizinleri çok zor bir problem olarak kullanmıştı.


1
SHA1 toplamlarının (ve diğer, daha uzun toplamların) "çok daha zor bir problem" kullanımını ne yapar? Evet, insan kullanıcıları için hoş değil, ama hepsi işletim sistemi, dosya sistemi ve diğer programlarla aynı.
kbolino

4

Elbette, her iki seçenek de, bir dizindeki dosya sayısını xfs veya ext4 veya herhangi bir dosya sistemi için makul görünen bir şeye indirgeyecektir. Hangisinin daha iyi olduğu, anlatmak için test etmek zorunda kalacağı açık değildir.

Uygulamanızla kıyaslandığında gerçek iş yükü gibi bir şeyi simüle etmek idealdir. Aksi takdirde, birçok küçük dosyayı özel olarak simüle eden bir şey bulun. Bundan bahsedersek, işte smallfile adında açık bir kaynak . Belgeleri diğer bazı araçlara atıfta bulunur.

hdparmSürekli G / Ç yapmak bu kadar kullanışlı değildir. Çok sayıda dosyayla ilişkili birçok küçük G / Ç veya dev dizin girişini göstermez.


1

Sorunlardan biri klasörü taramanın yoludur.

Klasörde taramayı çalıştıran Java yöntemini hayal edin.

Büyük miktarda bellek tahsis etmesi ve kısa sürede JVM için çok ağır olan tahliyesini yapması gerekecektir.

En iyi yol, klasör yapısını, her bir dosyanın, örneğin yıl / ay / gün gibi ayrı bir klasörde olacak şekilde düzenlemektir.

Tam tarama yapmanın yolu, her bir klasör için işlevin bir çalışmasıdır, böylece JVM işlevden çıkar, RAM'i serbest bırakır ve başka bir klasörde tekrar çalıştırır.

Bu sadece bir örnek ama yine de böyle büyük bir klasöre sahip olmak hiç mantıklı değil.


2
Java'yı varsayıyor ve klasörü tarıyorsunuz. Her ikisi de soruda belirtilmemiştir ve klasörü taramanın yanı sıra Java'da işlemenin başka yolları da vardır.
user207421

1

Ben de aynı sorunu yaşıyorum. Ext4'te Ubuntu sunucusunda milyonlarca dosyayı depolamayı denemek. Kendi kriterlerimi çalıştırma sona erdi. Düz dizinin, kullanımı daha kolay hale gelirken, daha iyi bir performans sergilediğini öğrendim:

kıyaslama

Bir makale yazdı .


Beklenen sonuç kesinlikle bu değil. Bununla gitmeden veya tavsiye etmeden önce, bu beklenmedik sonucu niçin aldığınızı daha derine bakmalısınız.
Michael Hampton
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.