Alt dizinlerin sayısı Linux'ta sürücü okuma / yazma performansını nasıl etkiler?


11

Bir Linux CentOS sunucusunda EXT3 biçimli bir sürücüm var. Bu bir web uygulaması veri sürücüsüdür ve her kullanıcı hesabı için bir dizin içerir (25.000 kullanıcı vardır). Her klasör, kullanıcının yüklediği dosyaları içerir. Genel olarak, bu sürücüde yaklaşık 250 GB veri var.

Sürücünün tüm bu dizinlerle yapılandırılması sürücü okuma / yazma performansını etkiler mi? Farkında olmadığım başka bir performans özelliğini etkiler mi?

İşleri bu şekilde yapılandırmanın doğasında yanlış veya kötü bir şey var mı? Belki de sadece yanlış dosya sistemi seçimi?

Son zamanlarda iki veri sürücüsünü birleştirmeyi denedim ve EXT3'ün 32.000 alt dizinle sınırlı olduğunu fark ettim. Bu beni neden merak etti. Her dosyanın veritabanındaki bir kimliğe karşılık gelen benzersiz bir kimliği olduğunu düşünerek, bu şekilde inşa ettiğim aptalca görünüyor. Eyvah ...


4
Bunun gibi bir şey yapamamanın bir nedeni var homes/u/username, homes/j/joeblow,homes/s/somebody,...mı?
Zoredache

1
@Zoredache tarafından listelenen bu gruplama yöntemi, bunu her zaman gün içinde nasıl yaptığımızdır (çok sayıda kullanıcısı olan çok daha küçük makinelerde).
Brian Knoblauch

@Zoredache Bu zavallı adam b-tree hashing gibi görünüyor. Ancak bu, çekirdek alanında çalışmadığı için daha yavaştır ve biraz daha fazla disk okumasına ihtiyaç duyar ve iyi dengelenmemiş olabilir. Ext3 ve ext4'ün htree'si daha iyidir. Ayrıca bkz: ext2.sourceforge.net/2005-ols/paper-html/node3.html
Mircea Vutcovici

Bir cevabı işaretlemelisiniz ...
ewwhite

Yanıtlar:


7

Bu, ortamınızdaki seçenekleri kendiniz test etmek ve sonuçları karşılaştırmak kolaydır . Evet, dizin sayısı arttıkça performans üzerinde olumsuz bir etkisi vardır. Evet, diğer dosya sistemleri bu engelleri aşmanıza veya etkisini azaltmanıza yardımcı olabilir.

XFS dosya sistemi daha iyi dizin yapısı bu tip içindir. ext4 günümüzde muhtemelen gayet iyi. Alt dizin ve dosya sayısı arttıkça, dizindeki erişim ve işlemler yavaşlar. Bu ext3 altında çok belirgindir ve XFS'de çok fazla değildir.


XFS, milyonlarca alt dizini desteklediğinden ve etkinin önemli olduğu EXT3 gibi performanstan etkilenmediği için bu yapı için kullanılacak dosya sistemidir ... şimdi bulamadığım bir grafiğe dayanarak.
T. Brian Jones

6

Cevap dosya sistemi seçimi kadar basit değil. Aklı başında dosya sistemleri, dizinler için doğrusal listeler kullanmayı uzun zaman önce durdurdu, yani bir dizindeki giriş sayısı dosya erişim süresini etkilemez.

hariç.

Aslında, girişlerin sayısı ne olursa olsun her işlem hızlı ve verimli kalır, ancak bazı görevler artan sayıda işlemi içerir. Açıkçası, basit bir lsişlem yapmak uzun zaman alır ve tüm inodlar okunana ve sıralanana kadar hiçbir şey görmezsiniz. ls -U(Sıralanmamış) yapmak biraz yardımcı olur, çünkü bunun ölü olmadığını görebilirsiniz, ancak algılanan zamanı azaltmaz. Daha az belirgin olan, herhangi bir joker karakter genişletmesinin her bir dosya adını kontrol etmesi gerektiğidir ve çoğu durumda tüm inode da okunmalıdır.

Kısacası: hiçbir uygulamanın (kabuk erişimi dahil) herhangi bir wildard kullanamayacağından olumlu bir şekilde emin olursanız, herhangi bir pişmanlık duymadan büyük dizinler alabilirsiniz. Ancak, kodda gizlenen bazı joker karakterler varsa, dizinleri her biri bin girişin altında tutmanız daha iyi olur.

düzenleme :

Tüm modern dosya sistemleri, büyük dizinler için iyi veri yapıları kullanır, bu nedenle belirli bir dosyanın inode'unu bulmak zorunda olan tek bir işlem , humongo dizinlerde bile oldukça hızlı olacaktır.

Ancak, çoğu uygulama tek bir işlem yapmaz. Çoğu tam bir dizin veya joker karakter eşleştirme yapar. Bunlar ne olursa olsun yavaştır, çünkü tüm girişleri okumayı içerirler.

Örneğin: diyelim ki 'foo-000000.txt' - 'foo-999999.txt' adında bir milyon dosya ve tek bir 'natalieportman.jpeg' içeren bir dizininiz var. Bunlar hızlı olacak:

  • ls -l foo-123456.txt
  • open "foo-123456.txt"
  • delete "foo-123456.txt"
  • create "bar-000000.txt"
  • open "natalieportman.jpeg"
  • create "big_report.pdf"

bunlar başarısız olur, ancak hızlı da başarısız olur:

  • ls -l bar-654321.txt
  • open bar-654321.txt
  • delete bar-654321.txt

çok az sonuç verseler bile bunlar yavaş olacaktır; başarısız olanlar bile tüm girişleri taradıktan sonra başarısız olur:

  • ls
  • ls foo-1234*.txt
  • delete *.jpeg
  • move natalie* /home/emptydir/
  • move *.tiff /home/seriousphotos/

5

Önce ext3 bölümünün dir_indexbayrak ayarlı olduğundan emin olun .

sudo dumpe2fs /dev/sdaX |grep --color dir_index

Eksikse, etkinleştirebilirsiniz. Dosya sistemini kaldırmanız ve ardından çalıştırmanız gerekir:

sudo tune2fs -O dir_index /dev/sdaX
sudo e2fsck -Df /dev/sdaX

Sonra dosya sistemini bağlayın.


2

Dizin sınırı başına ext3 32.000 adına ulaşana kadar fark etmez. Ext4'e yükseltme, bunun yanı sıra ext4'ün sağladığı diğer faydaları da ortadan kaldırabilir.


2

Tek bir dizinde ne kadar çok giriş (dosya ve dizin) olursa, erişim o kadar yavaş olur. Bu, her dosya sistemi için geçerlidir, ancak bazıları diğerlerinden daha kötüdür.

Daha iyi bir çözüm, aşağıdaki gibi bir dizin hiyerarşisi oluşturmaktır:

/users/a/aaron/
/users/a/andrew/
/users/b/betty/
/users/b/brian/

Yine de daha iyi bir performansa ihtiyacınız varsa, birden fazla seviyeyi genişletebilirsiniz:

/users/a/a/aaron
/users/a/n/anna
/users/a/n/andrew

Çoğu posta sistemi bu numarayı posta kuyruğu dosyalarıyla birlikte kullanır.

Ayrıca, bazı dosya sistemlerinde, geçmişte bir dizinde birçok girişin olması dizinin erişimini yavaşlatacağını buldum. Bir Do ls -lddizin girdisinin kendisi boyutunu görmek için dizin. Birkaç MB veya daha büyükse ve dizin nispeten boşsa, performans düşük olabilir. Dizini yeniden adlandırın, aynı ad ve izinlere ve sahipliğe sahip yeni bir dizin oluşturun ve ardından eski dizininizin içeriğini yeni dizine taşıyın. Bu hile, dosya sistemi tarafından yavaşlatılmış posta sunucularını önemli ölçüde hızlandırmak için birçok kez kullandım.


2

Son zamanlarda on milyonlarca dosya ve yüz binlerce dizin oluşturmak için gereken bir depolama sunucusu geliştirdim. XFS'yi ext4 ve reiserfs ile karşılaştırdım. Benim durumumda ext4'ün XFS'den biraz daha hızlı olduğunu buldum. Reiser ilginçti ama sınırlamaları vardı, bu yüzden düştü. Ayrıca ext4'ün ext3'ten önemli ölçüde daha hızlı olduğunu gördüm.

Her dizin için çok sayıda dosya aldığınızda, dosya açma süresi bozulmaya başlar. Dosya G / Ç işlemi yapmıyor. Dosya silme süresi de zarar görür. Ancak ext4'te çok yavaş değil. Yine de ext3 altında oldukça dikkat çekicidir. XFS ve ext4 bu konuda oldukça hızlı.

En son XFS'ye baktığımda ve X4'ü ext4 üzerinden kullanmanın avantajlarını ve dezavantajlarını tartarken, XFS ile veri kaybı raporları buldum. Bunun hala bir sorun olduğundan ya da hiç olmasından emin değilim, ama beni yönlendirecek kadar tedirgin etti. Ext4, Ubuntu'daki varsayılan fs olduğundan XFS üzerinden kolayca kazandı.

Bu nedenle, yönetim perspektifinden yardımcı olacak tylerl'in önerisine ek olarak, ext4'e yükseltebilirsiniz. Dizin başına sınır, ext4 ile 64000 giriştir

Diğer bir avantaj, fsck süresinin önemli ölçüde daha hızlı olmasıdır. Asla yolsuzlukla ilgili herhangi bir sorun yaşamadım.

Ext4 ile ilgili güzel bir şey denemek için ext4 bir ext3 birim monte edebilirsiniz. Bkz. Canlı bir sistemi ext3'ten ext4 dosya sistemine taşıma

Bu bağlantıdan bir alıntı:

Ext3'ün sınırlamalarından etkilenmiyorsanız ve risk almaya istekli değilseniz, buna değmeyebilir. Öte yandan, geçiş işlemini başarıyla tamamladıktan sonra sisteminiz daha hızlı gerçekleştirebilir, dosya sistemi kontrollerini kısaltabilir ve hiçbir kötü etki olmaksızın güvenilirliği artırabilir.

Yani, devam edin ve deneyin. Önce yedeklemenizi öneririz.


1

KESİNLİKLE bunu yapmanın bazı sonuçları olacaktır. Birincisi IO okuma / yazma olacak. Bunun ötesinde, bu tür verilerle başa çıkmanın çok korkutucu bir yoludur (bu ölçekte).


Tüm dosyaları aynı dizine koymak daha az korkutucu bir yol olabilir mi?
T. Brian Jones

Sanırım korkutucu tanımınıza bağlı. Tüm bunları koordine etmek için bir DB kullanmanız daha az korkutucu görünüyor. Kesinlikle denemek ve en azından bazı alternatif dizin yapısını azaltmak? Yani, tarihe göre, onları gruplandırma vb.
Publiccert

kullanıcı tarafından gruplandırılır. Bunun gibi büyük dosya sistemlerini bir web uygulaması için yapılandırılmış olarak gördüğünüz diğer yollara örnek var mı?
T. Brian Jones

Karşılaştığım sistemlerin çoğu maalesef EXT3 kullanmıyor. Bence bu senin ilk engelin olabilir.
Publiccert

Yanlış. Bir dosya açıldığında ve açık bir tanıtıcı elde edildikten sonra dosyaya G / Ç etkilenmez. Ancak, dosya açma süresi etkilenir.
Matt

1

Geçmişte XFS'yi Ext3'ün sınırlarını başarıyla aşmak için kullandım.

Dosya sistemleri içeriğinin ilk listesi, sistem tüm dizin / dosya bilgilerini okuyana kadar biraz zaman alacaktır. Ek işlemler daha hızlı olacaktır çünkü çekirdek artık bilgileri önbelleğe almıştır.

Yöneticilerin önbelleği etkin tutmak için düzenli olarak cron'da 'find / somepath 2> & 1> / dev / null' komutunu çalıştırdığını gördüm ve daha iyi performans elde ettim.


1

Bazı sorularım ve bazı olası darboğaz bulgularım var.

Birincisi, bu bir CentOS 5 veya 6 sistemi mi? Çünkü 6'da, bu tür durumlarda etkiyi ölçmek için ideal olan blktrace adlı inanılmaz bir aracımız var.

https://access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/ch06s03.html

Daha sonra çıktıyı btt ile ayrıştırabilir ve darboğazın, uygulama, dosya sistemi, zamanlayıcı, depolama - IO'nun çoğu zaman hangi bileşeni harcadığı yere ulaşabiliriz.

Şimdi, teorik olarak sorunuza geldiğinde, açık bir şekilde düğüm sayısını artıracak ve dizinler içinde yeni veya mevcut dosyalar veya dizinler oluşturmaya veya erişmeye devam ettikçe erişim süresi artacaktır. Çekirdek, daha geniş bir dosya sistemi hiyerarşisinden geçmelidir ve bu yüzden şüphesiz bir ek yüktür.

Dikkat edilmesi gereken bir diğer nokta, dizin sayısını artırdıkça inode ve dentry önbellek kullanımının artması anlamına gelir, bu da daha fazla RAM tüketimi anlamına gelir. Bu slab belleği altında gelir, bu nedenle sunucunuzda bellek azalıyorsa, bu başka bir düşünce noktasıdır.

Gerçek bir dünya örneğinden bahsetmişken, son zamanlarda iç içe geçmiş bir ext3 fs'de ilk kez bir alt dizin oluşturmanın yaklaşık 20 saniye sürdüğünü, ext4'te ise yaklaşık 4 saniye sürdüğünü gördüm. Çünkü blok tahsisinin farklı dosya sistemlerinde nasıl yapılandırıldığı. XFS veya ext4 kullanıyorsanız, biraz performans artışı elde edeceğinizi söylemek gereksizdir, ancak minimum düzeyde olabilir.

Yani, sadece doğru dosya sistemi seçiminin ne olduğunu soruyorsanız, ext3 biraz modası geçmiş. Daha fazla veri ve kıyaslama olmadan sunabileceğim tek şey bu.


0

CentOS 5'te bir seçenek değil ve CentOS 6'da ne kadar bir seçenek olduğundan emin değilim, ancak B ağacı veya B * ağacı tabanlı bir çözümün, yani BTRFS'nin, özelliğinizde önemli ölçüde daha iyi bir performans olmasa bile tutarlı olmasını sağlayacağı konusunda bir his var. senaryo, eğer sadece bir kişi, açık bir vicdanla değerli verilere emanet edebilirse (hala yapmazdım).

Ama eğer karşılayabiliyorsanız, test edebilirsiniz.

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.