1.000.000'dan fazla küçük gziped dosyasını bir Linux web sunucusunda en verimli şekilde nasıl depolayabilir ve sunabilirim?


10

Linux tabanlı bir web sunucusu üzerinden sunmam gereken büyük statik içeriğim var. Bir milyondan fazla küçük gzip dosyası kümesidir. Dosyaların% 90'ı 1K'dan az ve kalan dosyalar en fazla 50K. Gelecekte, bu 10 milyon gzip dosyasına kadar büyüyebilir.

Bu içeriği bir dosya yapısına koymalı mıyım yoksa tüm bu içeriği bir veritabanına koymayı mı düşünmeliyim? Bir dosya yapısındaysa, büyük dizinler kullanabilir miyim yoksa daha küçük dizinler mi düşünmeliyim?

Bir dosya yapısının teslimat için daha hızlı olacağı söylendi, ancak diğer taraftan, dosyaların blokları 1K'dan fazla olacağı için dosyaların diskte çok fazla yer kaplayacağını biliyorum.

Yayınlanma performansı ile ilgili en iyi strateji nedir?

GÜNCELLEME

Kayıtlar için, yarım milyon dosya ile Windows 7 altında bir test yaptım:

resim açıklamasını buraya girin

Yanıtlar:


6

Bir FS yapısının daha hızlı olacağını tahmin ediyorum, ancak çok sayıda dosya içeren dizinlere sahip olmaktan kaçınmak için iyi bir dizin yapısına ihtiyacınız olacak.

Kayıp disk alanı hakkında çok fazla endişe etmem. Örneğin, 16K blok boyutunda, en kötü durumda her bir dosya için bir ek bloğa ihtiyaç duyduğunuzda 15 GB alan kaybedeceksiniz. Bugünün disk boyutları ile, bu hiçbir şey değildir ve dosya sisteminizin parametrelerini özel ihtiyaçlarınıza göre uyarlayabilirsiniz.


5

Dosya yapısı seçeneğini seçerseniz, disk G / Ç performansını en azından bir dereceye kadar artırmak için yapabileceğiniz bir şey, bölüme sahip olmadıkça noatime + nodiratime ile monte etmektir. Onlar gerçekten önemli değil, bu yüzden bunu tavsiye ederim. Belki katı halli bir sürücü de kullanabilirsiniz.


4

Bence burada doğru cevap dosyaların nasıl endeksleneceğine bağlı ... ne zaman teslim için belirli bir dosya seçildiğinde belirler.

Zaten dosya adınızı belirlemek için bir veritabanı sorgusu yapıyorsanız, dosyayı db kaydında tam orada tutmanızın daha iyi olduğunu görebilirsiniz. seçimini yapın ve dosyaları db'de depolayın (ör: tüm blob kayıtlarını hesaba katmak için daha büyük sayfalar) veya dosya sistemini kullanmaya devam edeceğinizi görebilirsiniz.

Veritabanı seçeneğinin çalışma şansı biraz daha yüksektir, çünkü bir milyon kayıtla, her dosyanın eşit şekilde sorgulanması muhtemel değildir. Bir dosyanın arka arkaya birkaç kez veya hemen hemen arka arkaya sorgulanabileceği bir durumdaysanız, veritabanı yakın zamanda alınan dosyalar için fiili önbellek görevi görebilir; bu durumda genellikle dosya sonucunuz olur zaten belleğe yüklenmiş. İstediğiniz davranışı elde etmek için veritabanı motorunuzun iç kısımlarını dikkatlice ayarlamanız gerekebilir.

Ancak cevabımdan çıkarılacak en önemli şey , bazı temsili test verileriyle denemeden ve sonuçları ölçene kadar neyin en iyi çalışacağını gerçekten bilmemenizdir.


1

Modern dosya sistemleri ile bu bir sorun olmaktan çıkar. XFS'yi aynı dizinde 1 milyar dosyayla test ettim ve ext4'ün de (dosya sisteminin kendisi çok büyük olmadığı sürece) iyi olacağından eminim. Dizin girişlerini önbelleğe almak için yeterli belleğe sahip olmak; daha büyük işlemci önbelleği de çok yardımcı olacaktır.


2
EXT dosya sistemleri aynı dizinde yüksek dosya sayısı ile çok iyi başa çıkmıyor; özellikle varsayılan dizin_dizin ayarları ile değil. Aynı dizinde böyle yüksek dosya sayısı ile XFS test etmedim ama EXT uzaktan aynı milyar 1 milyar yakın bir şey ile işe yaramaz eminim.
Hrvoje Špoljar

1
Reiserf'lerin küçük dosyalar için iyi olduğunu duydum, ancak yazılımın bakımını yapan kişinin hapishanede (!) Olduğunu duydum, bu yüzden reiserf'lerin yakın geleceği oldukça belirsiz. Şahsen EXT4 ve XFS'yi ikinci seçenek olarak tercih ediyorum. XFS büyük dosyalar için en iyisi değil mi?
öde

Eskiden olurdu, ancak yeni bir çekirdek (3.0 ve üstü) çalıştırıyorsanız, küçük dosyalar için de iyi çalışır.
wazoox
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.