Tek bir dizinde çok sayıda dosya bulunan dosya sistemi


29

Tamam, o kadar büyük değil ama ortalama 30kb boyutunda yaklaşık 60.000 dosyanın tek bir dizinde depolandığı bir şey kullanmam gerekiyor (bu bir zorunluluktur, bu yüzden daha az sayıda dosya içeren alt dizinlere giremezsiniz).

Dosyalara rastgele erişilir, ancak bir kez oluşturulduklarında aynı dosya sistemine yazma işlemi yapılmaz. Şu anda Ext3 kullanıyorum ama çok yavaş buluyorum. Baska öneri?


3
Neden bir dizinde olmalılar?
Kyle Brandt

1
Ayrıca, orijinal soruya güncel bir cevapla, xfs ve ext4'te yeterince iyileştirmelerle ilgileniyorum.

Yanıtlar:


15

XFS'yi göz önünde bulundurmalısınız. Hem dosya sisteminde hem de dizin düzeyinde çok sayıda dosyayı destekler ve B + ağacı veri yapıları nedeniyle çok sayıda giriş olsa bile performans nispeten tutarlı kalır.

Wiki'de , tasarımı detaylandıran çok sayıda makale ve yayının yer aldığı bir sayfa var . Bir denemenizi ve mevcut çözümünüzle karşılaştırmanızı öneririm.


@ nelaar'ın cevabındaki slaytlara göre, ext4 bu görev için xfs'den üstün olur.
mulllhausen

13

Linux'ta bir milyar dosya

Bu makalenin yazarı, büyük dosya sayıları olan dosya sistemlerindeki performans sorunlarından bazılarını incelemekte ve ext3, ext4 ve XFS dosya sistemlerinin performansında bazı güzel karşılaştırmalar yapmaktadır. Bu slayt gösterisi olarak kullanılabilir. http://events.linuxfoundation.org/slides/2010/linuxcon2010_wheeler.pdf

mkfs çalıştırma zamanı 1M 50kb dosyalar oluşturma zamanı Dosya sistemi tamir süresi 1m dosyalarını kaldırma


2
Yanıtların, içeriğe işaretçiler değil, içerik içermesini gerçekten tercih ediyoruz. Bu soruyu teorik olarak cevaplayabilse de , cevabın temel kısımlarını buraya dahil etmek ve referans için bağlantıyı sağlamak tercih edilir.
GoFundMonica'yı

@Iain Ben sadece PDF indirirken, aynı bilgiyi verir gibi daha iyi olduğunu umuyorum.
nelaaro,

19
vay bunlar grafikleri okumak için bazı son derece zor. ~
ThorSummoner 5:15

8

Ext3'teki bir dizindeki birçok dosya, stackoverflow.com adresindeki kardeş sitesinde tartışıldı.

Bence ext3 üzerindeki bir dizindeki 60 000 dosya ideal olmaktan uzak ancak diğer gereksinimlerinize bağlı olarak yeteri kadar iyi olabilir.


5

TAMAM. ReiserFS, XFS, JFS, Ext3 (dir_hash etkin) ve Ext4dev (2.6.26 çekirdek) kullanarak bazı ön testler yaptım. İlk izlenimim, hepsinin yeterince hızlı olduğu (etli iş istasyonumda) oldu - uzaktan üretim makinesinin oldukça yavaş bir işlemciye sahip olduğu ortaya çıktı.

ReiserFS ile ilk testlerde bile bazı gariplikler yaşadım, bu yüzden bunu dışladı. JFS diğerlerine göre% 33 daha az CPU gereksinimine sahip görünüyor ve bu yüzden uzaktaki sunucuda test edecek. Yeterince iyi performans gösterirse, onu kullanacağım.


5

Benimki daha büyük olmasına rağmen çok fazla ve çok sayıda dosya depolayan bir uygulama yazıyorum ve bunlardan 10 milyonu birden fazla dizine böleceğim.

ext3, varsayılan olarak "bağlantılı liste" uygulaması nedeniyle yavaştır. Bu nedenle, bir dizinde çok fazla dosyanız varsa, bunun açılması veya başka bir tane yaratmanın daha yavaş ve yavaş olacağı anlamına gelir. Bir şeylerin büyük ölçüde iyileştirildiği bildirilen ext3 için kullanılabilen bir htree dizini adı verilen bir şey var. Ancak, yalnızca dosya sistemi oluşturma işleminde kullanılabilir. Buraya bakın: http://lonesysadmin.net/2007/08/17/use-dir_index-for-your-new-ext3-filesystems/

Dosya sistemini yine de yeniden kurmanız gerekeceğinden ve ext3 sınırlamaları nedeniyle, tavsiyem ext4 (veya XFS) kullanmaya bakmaktır. Bence ext4, daha küçük dosyalarda biraz daha hızlı ve daha hızlı bir şekilde yeniden oluşturuyor. Htree endeksi, bildiğim kadarıyla ext4'te varsayılandır. JFS veya Reiser ile ilgili hiçbir deneyimim yok ama insanların bunu daha önce tavsiye ettiğini duydum.

Gerçekte, muhtemelen birkaç dosya sistemini test ederdim. Neden ext4, xfs ve jfs denemeye çalışılsın ve hangisinin en iyi performansı verdiğini görmedin?

Bir geliştiricinin bana uygulama kodunda işleri hızlandırabileceğini söylediği bir şey "stat + open" araması yapmak yerine "open + fstat" yapmaktır. Birincisi, ikinciden önemli ölçüde daha yavaştır. Bunun üzerinde herhangi bir kontrol veya etkinizin olup olmadığından emin değilsiniz.

Burada benim postoverflow akışına bakın. Linux'ta 10 milyon dosyaya kadar depolamak ve bunlara erişmek çok yararlı cevaplar ve linkler var.


3

Dir_index'i etkinleştirmek için tune2fs kullanmak yardımcı olabilir. Etkin olup olmadığını görmek için:

sudo tune2fs -l /dev/sda1 | grep dir_index

Etkin değilse:

sudo umount /dev/sda1   
sudo tune2fs -O dir_index /dev/sad1
sudo e2fsck -D /dev/sda1
sudo mount /dev/sda1

Ama yanlış yoldan gideceğine dair bir his var ... neden düz bir dizin oluşturmuyorsun ve buna bağlı olarak rastgele seçmek için bazı kodlar kullanıyorsun. Daha sonra optimize edilmiş bir ağaç yapısı için alt dizinleri kullanabilirsiniz.


1
/dev/sad1kopya / makarna hatasını önlemek için kasıtlı mıydı?
Anwar,

2

ext3 ve altı, dizin başına 32768 dosyaya kadar destekler. ext4, gerçek dosya sayımında 65536'ya kadar destekler, ancak daha fazlasına sahip olmanıza izin verir (yalnızca dizinde saklanmayacaktır, bu çoğu kullanıcı için önemli değildir).

Ayrıca, dizinlerin ext * dosya sistemlerinde depolanma şekli esasen büyük bir listedir. Daha modern dosya sistemlerinde (Reiser, XFS, JFS), büyük kümeler için çok daha verimli olan B ağaçları olarak depolanırlar.


2
Bir dizinde bu sayıdaki dosyayı desteklemek, makul bir hızda yapmakla aynı şey değildir. ext4'ün daha iyi olup olmadığını henüz bilmiyorum, ancak bir dizinde birkaç bin dosyadan fazlasına sahipse ext3 çok yavaşlar (dir_index açıkken bile) (yardımcı olur ancak sorunu tamamen ortadan kaldırmaz).
cas,

1

Dosya adları yerine dosya düğümlerini saklayabilirsiniz: inode numaralarına erişmek, dosya adlarını çözmekten çok daha hızlı olmalıdır


Şimdi söyle bana. Bir dosyayı inode numarasına göre nasıl açabilirsiniz?
Matt,

1
@Matt, Ben cevapladıktan sonra soru değişti gibi görünüyor. Veya 1.5 yıl önce çok daha aptaldım :)))
kolypto

0

Bir dizindeki birçok dosyayı tıkamak istemezsiniz, bir çeşit yapı istersiniz. Dosyanın ilk karakteriyle başlayan alt dizinlere sahip olmak kadar basit bir şey olsa bile erişim sürenizi artırabilir. Kullanmayı sevdiğim bir başka saçma numara, sistemi metainformation ile önbelleğini güncellemeye zorlamak, düzenli olarak updatedb komutunu çalıştırmak. Bir pencerede, slabtop'u çalıştırın ve başka bir çalışmada updatedb ve önbelleğe almak için tahsis edilecek çok fazla bellek olduğunu göreceksiniz. Bu yol çok daha hızlı.


-1

Bu dosyalardaki veri türünü belirtmediniz. Ancak seslerden, hızlı aramalar için indekslemeli bir çeşit veritabanı kullanıyor olmalısınız.


-1

Dosya sistemi muhtemelen bu ihtiyaç için ideal bir depolama alanı değildir. Bir çeşit veritabanı deposu daha iyidir. Yine de yardım edemezseniz, dosyaları birkaç dizine bölmeyi deneyin ve bu dizinleri tüm dosyaların görünmesini istediğiniz tek bir dizine takmak (bağlamak) için unionfs kullanın. Bu tekniği hiç hızlandırmak için kullanmadım, ama denemeye değer.

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.