Milyonlarca küçük dosya için dosya sistemi


44

Aşağıdaki senaryoda en iyi hız için hangi Linux dosya sistemini seçersiniz :

  • yüz milyon dosya
  • Ortalama ~ 2k dosya boyutu
  • >% 95 okuma erişimi
  • oldukça rastgele erişim
  • yüksek eşzamanlılık (> 100 işlem)

Not: Büyük dizinleri önlemek için dosyalar derin hiyerarşik bir ağaçta saklanır. Her yaprak dizini yaklaşık bin dosya içerir.

Nasıl kıyaslarsın?


3
Gerekli bazı ek bilgiler var. Örneğin, tüm dosyaları düz bir dizinde mi yoksa iç içe (sıralı) dizinlerde mi saklıyorsunuz? Bunun dosya erişim süreleri üzerinde çarpıcı bir performans etkisi olabilir. "Düz" bir düzende 100.000.000 girişin elenmesi, FS türünden bağımsız olarak önemli ek yük getirecektir; en iyi durumda, bir tür ağaç aramaya bakıyorsunuz, bu da dosyanızda bulunması için hala birden fazla arama gerektiriyor. Dosyaları alt dizinlere sınıflandırırsanız, erişim seviyesi, her düzeyde daha az sayıda giriş olduğundan daha fazla hızlanır.
Avery Payne,

Dosyaya seri mi yoksa aynı anda mı erişiliyor?
Steve Schnepp

Yanıtlar:


19

İşte tüm ana Linux FS'lerini başlangıç ​​noktası olarak kullanabileceğiniz bonnie ++ ile karşılaştıran bazı sonuçlar .

Rastgele bakıldığında Reiser kazandı, ardından EXT4, ardından JFS. Bunun dizin aramalarıyla tam olarak ilişkili olup olmadığından emin değilim, ancak bunun bir gösterge olacağı gibi görünüyor. Bunun için özel olarak kendi testlerinizi yapmanız gerekecektir. EXT2, muhtemelen dergi olmamasından dolayı dosya oluşturma zamanları için herşeyin üstünü kırarken, EXT4, hans reiser'in şu anki durumu nedeniyle kullanmak istemediğiniz Reiser dışında her şeyi atıyor.

NCQ'yu destekleyen sürücülere bakmak isteyebilir ve kurulumunuzun kullanmak için kurulduğundan emin olun. Ağır aramalar altında hız artışı sağlamalıdır.

Son olarak, makinenizin bir tokmak olduğundan emin olun. Dosyalar sık ​​sık güncellenmediğinden, linux boş alan varsa çoğunu sıkıştırmak için önbelleklenecek. Kullanım şekilleriniz doğru ise, bu size büyük bir hız artışı sağlayacaktır.


1
bonnie ++ sorunu benim kullanım senaryomu bile kabaca test etmemesidir
bene

2
Dizin aramalarını test etmeme konusunda bir noktanız var, ama dürüst olmak gerekirse, eğer boğulma noktanızsa, verilerinizi gerçek bir veritabanına koymaktan daha iyi olursunuz. Dosya sistemleri, çoğu veritabanının kullanması için tasarlanan küçük nesneler üzerinde neredeyse aynı şekilde çalışmaz
Andrew Cholakian

7
@AndrewCholakian Link şimdi öldü.
Don Scott

8

Andrew’un söylediklerinin çoğuna katılıyorum, ancak Reiser4’ü veya daha eski (ancak daha iyi desteklenen) ReiserFS’yi tavsiye ederim . Bu testlerin (ve ReiserFS belgelerinin) belirttiği gibi, tam olarak sorduğunuz durum için tasarlanmıştır (çok sayıda küçük dosya veya dizin). ReiserFS'yi geçmişte Gentoo ve Ubuntu ile sorunsuz olarak kullandım.

Hans Reiser’in durumuna gelince, onu Dosya Sisteminin kodunda veya istikrarında bir sorun olarak görmüyorum. Reiser4, hem DARPA hem de Linspire tarafından bile desteklendiğinden, Reiser Dosya Sisteminin daha da gelişmesinin belirlenemediğine katılıyorum, kimsenin kullanıp kullanmama konusunda karar vermesi gereken bir şey yapmıyorum.


3
ReiserFS'yi uzun zamandır kullanıyorum. Aslında, hala yeniden kurma konusunda daha önce sahip olmadığım eski bir Gentoo sunucusunda kullanıyorum. Bu kurulum bu mayıs ayında 4 yaşında. Ne yapabilirsiniz söylemek önemli ölçüde yavaşladı olmasıdır. Bu fenomen, ReiserFS kullanarak aktif dosya okuma ve yazma kullanımına sahip tüm dosya sistemlerinde, istisnasız tüm istisnalar olmaksızın - zaman zaman ortaya çıkmıştır. akılda. Artık büyük dosya sistemleri için XFS kullanarak ondan uzaklaştım.
Mihai Limbăşan

3

Bunun sorunuza doğrudan bir cevap olmadığını biliyorum, ancak bu durumlarda bir veritabanının bunu barındırmak için daha uygun olabileceğini düşünüyorum. Küçük dosyalar bir veritabanı tablosunda ikili biçimde saklanabilir ve wil'de alınabilir. Bu dosyaları kullanan yazılım bu olsa destekleyebilmeli ...


1
Yalnızca hiyerarşik bir veritabanı değilse, dosya sistemi nedir? Teklifiniz, muhtemelen garanti edilmeyen soyutlama, karmaşıklık ve yazılım katmanları ekler. Ayrıca, sorunun sahibi, bir Windows çalışanı olmaktan hoşlanmadığınızdan şüphelendiğim 'UNIX Felsefesi' ile görevini yerine getiriyor mu?
Stu Thompson

3
Öncelikle, Unix'e veya o bölgedeki herhangi bir şeye karşı hiçbir şeyim yok. Dosya sistemleri ve veritabanları arasında büyük farklılıklar vardır ve bu yüzden her iki teknolojinin de geliştirilmesinden dolayı. Veritabanları, çoğu dosya sisteminden daha iyi bir iş çıkardıkları çok sayıda küçük varlık ile çalışmak üzere tasarlanmıştır. Sadece bununla alabileceğiniz başka bir yol olabileceğine işaret ediyordum.
Jeroen Landheer

1
Bir db dosyasını "temizlemek / temizlemek" linux'ta bir dosya sistemini birleştirmekten çok daha kolaydır. Fs'nin çoğu / tümü, gerekli olmadığını söyleyerek bu işlevi sağlamaz. Mihai'nin yukarıdaki yorumuna dikkat çekerken, kesinlikle doğru olmadığını görebilirsiniz.
Gringo Suave

3

Unix StackExchange'teki kişiler, sadece bu senaryoyu test etmek için bir referans (kaynakla birlikte) oluşturdu:

S: Çok sayıda küçük dosyayı depolamak için en yüksek performanslı Linux dosya sistemi nedir (HDD, SSD değil)?

En iyi okuma performansı ReiserFS'den geliyor.


Btrfs, silme dışında her şeyde daha iyi veya karşılaştırılabilir sonuçlara sahip görünüyor. Ancak, ne sıklıkta 300k dosyalarını silersiniz? Geçmişte rfs'yi sevdim, ancak btrfs gelecek için daha iyi bir bahis olabilir.
Gringo Suave

3

Benim tecrübeme göre, ext2 küçük dosyalar için ext4'ü sudan dışarı atar. Yazma bütünlüğü umursamıyorsanız, bu harika. Örneğin, subversion, ext4 ve diğer dosya sistemlerinin (XFS) tıkandığı çok sayıda ve çok sayıda küçük dosya oluşturur (her yarım saatte bir extrondan ext4'e veri bağlayan bir cron işi çalıştırır ya da sorunu neredeyse çözer).

Bu komutları çalıştırmak ext2'yi daha da hızlı yapar (bu seçeneklerin çoğu, çökmeden önce eşitleme yapmazsanız dosya sistemini çökmeden sonra kararsız hale getirse de). Bu komutların ext4 üzerinde küçük dosyalarla neredeyse hiçbir etkisi yoktur.

echo 15 > /proc/sys/vm/swappiness
echo 10 > /proc/sys/vm/vfs_cache_pressure
echo 99 > /proc/sys/vm/dirty_ratio
echo 50 > /proc/sys/vm/dirty_background_ratio
echo 360000 > /proc/sys/vm/dirty_expire_centisecs
echo 360000 > /proc/sys/vm/dirty_writeback_centisecs
echo "2000" > /proc/sys/vm/vfs_cache_pressure

1

Sanırım ext3 (veya ext4), belki JFS iyi bir çözüm olurdu. Ext4 ve btrfs konusunda dikkatli olurdum (dosya sistemleri zor - en yeni ve en yeni şeyleri kullanmak istiyorsanız yedeklemeye hazır olun).

Ayrıca, dosya sistemini istediğiniz gibi ayarlamak için mkfs süresi boyunca ayarlayabileceğiniz çeşitli parametreler vardır.

XFS'ye karşı kesinlikle öneriyorum . Kötü bir dosya sistemi olduğu için değil, ancak yaratma / silme işlemi pahalı bir işlemdir.


Dizin aramalarıyla ilgili sorunları önlemek için, örneğin akıllı bir adlandırma şeması kullanın:

<first letter of id>_<last letter of id>/<id>

veya benzeri, daha karmaşık şemalar. Bu, dizin aramalarınızı ve dolayısıyla genel erişim hızlarını hızlandıracaktır. (Eski bir unix hilesi, sanırım V7'den)


1
İlk ve son harfi değil, yalnızca ilk n harfini kullanmanın avantajı nedir?
bene

bu olası planlardan sadece biri - bunun bir avantaj olup olmayacağı, indeksleme için kullanılan "anahtara" bağlı. Bu özel şema, organizasyondaki insanlar hakkında veri depolayan uygulamaya atıfta bulunduğumu ve bu şekilde daha iyi endekslendiklerini görmemişti. Her zamanki gibi kesin cevapları bulana kadar verilere ve sonra profiline uyarlaman gerekiyor :)

1

Çoğu FS, bir dizinde 65K'dan fazla dosyayla boğulacak, bunun hala ext4 için geçerli olduğunu düşünüyorum. Reiser dosya sistemleri bu limite sahip değildir (mp3.com'daki millet, bundan emin olmak için ödedi). Başka bir şey hakkında emin değilim, ancak bu ReiserFS'nin yapıldığı kullanım senaryolarından biri.


1
Bu ReiserFS, RieserFS değil
Daniel Rikowski

Bu haftasonu 1000000 dosya içeren ext4'te bir dir. Yapmadığınız lsveya sekme tamamlamadığınız sürece hızlı çalışır. Muhtemelen endeks yüzünden.
Ole Tange

ext4, bir dizindeki birçok dosyayı hızlandıran bir dir_index uzantısına sahiptir.
alfonx
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.