2.5. Dizin Ölçeklenebilirliğiext3'te tek bir dizinin içerdiği alt dizinlerin maksimum sayısı 32.000'dir. Bu sınır, ext4'te sınırsız alt-dizin desteği ile birlikte ortadan kaldırılacaktır.
Birçok giridisi olan büyük dizinleri desteklemek için, dizin indeksleme özelliği[6], ext4'te mevcut. ext3'teki eksiklik ise, dizin girdileri, dizinler için çok verimsiz olan bir listede depolanır. Dizin indeksleme özelliği, girdileri, derinliği sabit 32 bitlik hashleri kullanan BTree yapısında özelleşmiş HTree data yapısında tutar. HTree'nin hızlı arama zamanı, büyük dizinlerde performansı geliştirir. 10.000 dosyadan daha fazla olan dizinler için, hız ortalama 50-100 kat artar.[3]
2.5.1. Gelecekte yapılacak işHTree uygulaması, bir ağaç aramasının ext2 dizin biçimine uyumlu olarak doğrusaldan geliştirilmesine izin verirken, diğer yandan bu yaklaşım içinde sınırlamalar da vardır. HTree uygulaması, 2 düzey ağaçla indekslenebilen 510*511 4 KB dizin yaprak bloğuyla (yaklaşık olarak 25M-24M byte dosya adları) sınırlıdır. 3.düzeyde HTree'ye izin vermek için kodu değiştirmek mümkün olabilir. Ayrıca genel olarak dizinlerde 2 GB dosya boyut sınırı vardır. Çünkü yüksek 32-bit i kullanmak için hazırlanan kod ve dizinlerdeki i_size, 2 GB sınırının sadece düzenli dosyalar için ayarlandı.
Aslında karmaşıklık içinde, indekslenen dizinlerde dosya adlarının aranması işi, inode’ların ayrık halde bulunduğu çizgisel dizilimle kıyaslanırsa, bunun neden rastgele yapılması gerektiği görülür. Çok fazla inode u olan büyük diskleri aramak için tek yol, rastgele aramalar yapmak.
Karışık-indeks diziminde readdire sahip olmak bir ihtiyaçtır. Çünkü dizin girişleri, bir dizin yaprak bloğunun ayrılması esnasında hareket edebilir bundan dolayı POSIX isteklerini karşılayabilmek için tek yol karışık dizinde emniyetli bir şekilde taramaktır.
Bu problem için bir çözüm, ayrı bir inode'u referans gösteren adil bir dizin girişinin yerine dizine tüm inode u koymaktır. Bu, inode bir readdir yaptığı zamanda inode un arama yapması için olan ihtiyaçtan kaçınır, çünkü tüm inode, zaten hafıza içinde readdir adımında okunmuştur. Eğer dizini yapan bloklar, verimli bir şekilde ayrılırsa, sonra dizini okumak herhangi bir aramayı gerektirmez.
Bu ayrıca, dinamik inode ayrımına izin verecek, dizini inode tablosunun saklayıcısı hâline getirecektir. Inode sayıları (önceden tartışılan 2.4 bölümünde ) benzer bir biçimde oluşturulacak. Bu sayede bir inode un oturduğu blok, inode'un kendini saymasıyla saptanabilecek. Zor bağlanan dosyalar, aynı bloğun, aynı zamanda çeşitli dizinlere ayrıldığını gösterir, bu sorun da inode’un içindeki link sayacıyla düzeltilebilir.
Ayrıca inode’un içinde bir veya daha fazla dosya deplomak durumunda olabiliriz. Bu da EA (extended attribute) sayesinde gerçekleştirilebilir. Böylece readdir yaparken tek bir dizinle alakalı inode'ların ismini bulup, diğer inode'ları atlayabiliriz. Verimli bir inode adı araması için, ext3'te kullanılana benzer bir Htree kullanıyoruz (her dizin bloğu için bir girdi istemek yerine, her ad için bir girdi istiyor). Fakat girdilerin (inode'ların kendileri) directory büyüdükçe değişmediklerini göz önünde tutarsak, readdir için disk block veya directory offset komutunu verebiliriz.
2.6. Büyük Inode ve hızlı uzantı nitelikleriext3, farklı inode boyutlarını destekler. Inode boyutu, düzenleme zamanında mke2f-I [inode boyutu] seçeneği kullanılarak, 128 byte'tan büyük olmak üzere ikinin herhangi bir kuvvetinden dosya sisteminin blok boyutuna kadar ayarlanabilir. Veriyle dolu olan ve yeni alanlar için az boşluğa sahip olduğu varsayılan inode yapı boyutu 128 byte'tır. Ext4'te, varsayılan inode yapı boyutu, 256 byte olacaktır.
Çekirdek ve e2fsck'te birçok kodu kopyalamaktan kaçınmak için, büyük inode lar, ilk 128-byte için, yapıyı Şekil 4'te gösterildiği gibi tutarlar. Inode'un kalanı, iki parçaya ayrılır: bütün Inode'ların alanlarının toplamasına izin veren bir tutturulmuş-alan kısmı (nanosaniye zaman niteliği gibi, (5.bölüm)); ve inode'un kalanını tükettiği hızlı uzantı nitelikleri (EAs) için bir kısım.
Inode'un sabit-alan parçası, kernelin tanıdığı alanlar üzerine kurulmuş, dinamik olarak boyutlandırılmıştır .Bu alanın boyutu, orijinal 128-byte'lık inode'un önündeki ilk yerde, i_extra_isize denilen bir alanda saklanır. Superblock ayrıca s_min_extra_isize ve i_want_extra_isize olmak üzere 2 alan içerir. Bu düşük seviyeli çekirdeklerin daha büyük i_extra_isize ı ayırmasına izin verir.
S_min_extra_isize her biri inode içinde sabit-alan boşluğunun garanti edilen minimum miktarıdır. S_want_extra_isize yeni inode da sabit-alan boşluğunun istenen miktarıdır. Fakat bu kadar boşluğun, her inode varolup olmadığının hiçbir garantisi yoktur. ROCOMPAT özelliği olan EXTRA_ISIZE , superblok alanlarının geçerli olup olmadığını belirler. Ext4 kodu yakında , i_extra_isize’ı dinamik olarak kullanarak sabit alanları ihtiyaç duyduğunda genişletebilecek.Bunu yaparken, hızlı EA'sı olan boşluklar lâzım .Aksi taktirde bunları başka bir EA bloğuna taşır.
Kalan büyük inode boşluğu, inode'un içinde EA verisini depolamak için kullanılabilir. EAs'nın önceden hafızada olmasından dolayı, inode diskten okunduktan sonra,bu harici EA bloğunun zahmetli bir şekilde aranmasını önler. Bu büyük ölçüde, EAs'ı kullanan uygulamaların performansını geliştirebilir, bazen 3'ün 7'ye kadar olan faktörü kadar olabilir.[4].
Harici bir EA bloğu, her dosya için EAs'ın 4 KB'ının üstüne depolamaya izin veren hızlı EA boşluğuna ek olarak hala uygundur.
Büyük inode'larda hızlı EAs için destek, 2.6.12'den beri Linux çekirdeklerinde mümkün oldu, fakat birçok insanın, mke2fs zamanında olan bu yetenekten haberdar olmaması bu yöntemin nadiren kullanılmasına yol açtı. Ext4'ün, daha büyük inode'lara sahip olacak olması bu varsayılan özellik ile sağlanacak.
Ayrıca, daha büyük veya daha çok EAs'ı depolamak için,4 KB EA sınırını aşmak da tartışılıyor. Büyük ve tek olan EAs'ların (herhangi bir boyutta EAs'ya izin vermek için) kendi içindeki inode'larda depolanması olasıdır. Ayrıca birçok EAs, dizin-gibi bir yapıda depolanacak olduğundan, ext4 diziniymiş gibi aynı kodları uygulamak yada küçük değerleri inline kaydetmek mümkün.
3. Blok yerleşimlerinin genişletilmesi
Dosya sistemi işlem hacmini artırmak, modern dosya sistemleri için en önemli amaçtır. Bu amaç için, geliştiriciler sürekli, dosya sisteminin parçalara ayrılmasını azaltmayı deniyor. Yüksek parçalara ayrılma oranları, toplam işlem hacmini etkileyen daha büyük disk erişim zamanına sebep olur. Ayrıca artan metadata yükü, verimsiz haritalama demektir.
Kendisini haritalayan mevcut alanlardan faydalanan ve blok ayırma tekniklerini geliştirerek dosya sisteminin parçalara ayrılmasını azaltması hedeflenen ext4, yeni özellikler de sunmaktadır.
3.1. Kalıcı rezerve edilen alanlarBazı uygulamalar, veritabanları ve sürekli medya sunucuları, blokları geçerli bir datayla veya sıfırlarla başlatmaya gerek duymadan, dosyanın üstünde bulunan (tipik olarak işlem gören dosyanın boyutunun arttırılması sırasında) ön ayrışım yapan blokların yeteneğinden faydalanır. Preallocation (önceden tahsis etmek), dosya içinde bitişik ayrışımların devam etmesini sağlar (zamandan ve datanın gerçekte hangi düzende yazıldığından bağımsız olarak) ve yazmak için gerekli alanı tahsis eder. Bir uygulamanın, dosyanın, ne kadar boşluğu gerektireceğinin ön bilgisi olursa bu bilgi kullanışlı olabilir. Dosya sistemi içinde preallocation'u yorumlar, ama henüz dosyanın başlatılmamış kısımlarını (sıfır dolu blokları) yorumlayamaz. Böylelikle ,bir sonraki yazma işlemi başlamadan, her blok için ortaya çıkan eski veriden kaçınılır. Preallocation, reboot'lar karşısında, ext3 ve ext4'teki blok rezarvasyonlarından farklı olarak, sürekli ve tutarlı olmalıdır.[3]
Sıralı yazma işlemi içeren uygulamalar için, dosyanın başlatılan veya başlatılmayan kısımlarını birbirinden ayırmak mümkündür. Bu, başlatılmış kısmın boyutunu temsil eden en yüksek nokta değerini koruyarak yapılabilir. Fakat, önceden tahsis edilen alanlara rastgele yazma işlemi yapan veritabanları ve diğer uygulamalar için bu, yeterli değildir. Dosya sisteminin, dosyanın ortasında ki başlatılmamış blokların sınırlarını bilmesi gerekir. Bu yüzden, bazı alan temelli dosya sistemleri, örneğin XFS ve şimdi de ext4 gibi, verilen bir dosya için rezerve edilmiş fakat başlatılmamış alanları işaretleme seçeneği verir.
Örneğin Ext4, MSBi'ni kullanarak bu verilmiş alanın, başlatılmış veriyi içerip içermediğini gösterir (Şekil 1). Okuma esnasında başlatılmamış bir alana sadece bir delik gibi davranılır, öyle ki VFS, sıfır-doldurulan dosya bloklarıyla döner. Yazılanların üzerindeki alan, başlatılmış ve başlatılmamış alanlara ayrılmalıdır, eğer bu alanlar komşuysa, bitişik başa döndürülen bir alanla başlatılmış kısım birleştirilmelidir.
Şimdiye kadar, XFS, ön-tahsis (preallocation) yapan diğer Linux dosya sistemlerinin uygulamalarına bir ioctl arayüzünü sağladı. Ext4 gibi dosya sistemleri ile, fallocate için ortak bir sistem-çağrı arayüzü sağlandı ve ilgili bir inode çalışması başlatıldı. Bu, posix 'fallocate API'i kullanan uygulamalar ile dosya sisteminin ön ayrışma ile ilgili özel görevleri yerine getirmesi sağlandı.
3.2. Ertelenen ve çoklu blok yerleşimi ext3'te bir yazım işlemi sırasında blok yerleştirici sadece bir blok yerleştirebilir. Bu büyük giriş-çıkışlar için verimsizdir. Blok ayırma isteklerinin, bir zamanda VFS tabakaları boyunca geçmesinden, ext3 bunu önceden göremez ve gelecek olan istek kümelerini algılayamaz. Bu ayrıca dosyanın parçalara ayrılması (fragmentation) olasılığını arttırır.
Ertelenen yerleşim (delayed allocation ), blok tahsisatının yazma işlemide yapılması yerine numaralamak için ertelendiği bir tekniktir. Bu metod birçok blok ayrışım isteğini birleştirerek tek bir istek haline getirmek için fırsat sağlar, olası parçalanmaları azaltır ve CPU’a düşen işlem sayısını azaltır. Ertelenen yerleşim ayrıca kısa ömürlü dosyalar için gereksiz blok ayrımlarından kaçınarak verimlilik sağlar.
ext4 ertelenen yerleşim yamaları son zamanlarda uygulanmaktadır, fakat bunu destekleyen VFS tabakasının hareketi zordur. Yani, çoklu dosya sistemleri bu özellikten yararlanabilirler.
Ertelenen yerleşim desteğiyle, tampon giriş-çıkışlar için çeşitli blok ayrımları, mümkündür. Çeşitli komşu bloklar içeren bütün bir alan, bir zamanda tek bir blok yerleştirilmesi yerine bir seferde yerleştirilir. Bu, ext4_get_blocks ve ext4_new_blocksand içindeki çeşitli çağrıları çıkarır, ve CPU kullanımını azaltır.
ext4 çoklu blok ayrımı, blok grubu başına alan bilgisi inşa eder ve disk bloğunun temel aldığı bit haritasını özgür bırakır. Bu yöntem, boş alanlarda aramaya rehberlik etmesi ve ayrışım isteğini karşılaması için bu bilgiyi kullanır. Bu boş alan bilgisi, dosya sisteminde zaman fazlalığı oluşturur ve bir buddy yapısı kullanılarak hafızada depolanır.
Ertelenen ayrışımın performans faydaları çok açıktır, ve bölüm 7'de bu görülebilir. Önceki bir çalışmada da[3], %30 bir gelişme olduğunu ve birleştirilen iki özellikle CPU kullanımında işlem hacminin %50 azalmasını gözlemledik. Genelde, ertelenen ve çeşitli blok yerleşimleri büyük giriş-çıkışlı sistemlerde dosya sisteminin performansını arttırır.
Parçalara ayrılmayı azaltmak için ertelenen ve çeşitli blok yerleşimlerinin üstünde inşa edilen iki diğer özellik vardır:
*
Çekirdek içi ön yerleşim: Çekirdek içini kullanmak, alan bilgisini özgür bırakır, çekirdek içinde blok ön yerleşim alanı daha güçlü inşa edilebilir. Bu daha fazla, blok yerleştirmesini geliştirir, yazma işlemi yükünü azaltır. Bir inode, ön yerleşim yapılmış bloklar içinde belli öneme sahip olarak indekslenmiş büyük parçalardan birkaçına sahip olabilir. Bu gelişme, HPC uygulamalarına, birkaç node un bir büyük dosyaya farklı offset lerde yazılması operasyonunda, yardımcı olabilir.
*
Yer grupları: bireysel dosya için yerleşim biçiminin kararları bağımsız olarak yapılır. Eğer yerleşimi yapan yapı (allocator) içinde dosya ilişkisinin bilgisi varsa, allocator ilgili dosyaların bir arada yerleşmesini sağlayabilir, buda okuma performansını artırır . Yer grupları özelliği verilen bir nitelik ile dosyaları kümeler. Örneğin SID veya SID kombinasyonlarından oluşan yapılar ve ana dizin. Ertelenen sayfa akışı esnasında, kullanılmış sayfalar gruplar halinde yazılır. Yerleştirilmemiş blokların sayısı, grup-düzeyinde, allocator tarafından bütün bir grup için yeterli boşluk bulunursa , bu alan rezerve edilir. Bu boşluk, grup içindeki dosyaların bireysel olarak yerleşimi için kullanılır.Bu yolda, ilgili dosyalar, bir arada tutulur.
Özetle, ext4, verimli bir şekilde büyük giriş-çıkış bloğunu tutabilen güçlü bir blok ayrışım planına sahip olacak ve çoklu-ipliğe dizilen iş yüklerinin altındaki küçük dosyalarla dosya sisteminin parçalara ayrılmasını azaltacak.
3.3. BirleştirmeBu bölümdeki özellikler, parçalara ayırılmadan kaçınılması için blok yerleşimini geliştirme üzerine kurulu olsa da, zamanla dosya sisteminin hâlâ parçalara bölünebilir. Ext4 deki birleştirme eklentisi e4defrag, parçalanan dosya sistemini birleştirmeye yönelik geliştirildi. Bu yazılım tek tek dosyaları veya bütün dosya sistemlerini birleştirebilir . Her dosya için, geçici bir inode yaratır, ve geçici inode a komşu olan alanları tekrar yerleştirir. Sonra, sayfa hafızasına orijinal dosya verisini kopyalar, ve geçici inode un bloklarına önceden yazılmış sayfalar aktarılır. Son olarak, blok işaretçilerini geçici inode'dan, orijinal inode'a aktarır.
4. Güvenilirliği arttırmakGüvenilirlik, ext3'te çok önemlidir, ve onun muazzam popülerliğinin sebeplerinden biridir. Bu şöhreti kaybetmemek için, ext4 geliştiricileri, dosya sisteminin güvenilirliğini sürdürmeye çok gayret gösteriyorlar. Herhangi bir dosya sistemi tasarımcısı için kendi 64 bitlik boyutta alan parçası yapmak kolaydır. Zor olan, boşluğun büyük miktarlarını gerçek dünyada kullanılabilir yapmaktır.
Journaling ve RAID kullanımına rağmen,diskin dosya sisteminde değişmez bir şekilde bozulmalar vardır. Savunmanın ilk çizgisi problemleri buluyor, gelişmiş metadata tasarımı ile problemlerden kaçınılıyor. Çeşitli düzeylerde iç tutarsızlık önleniyor, sağlama (checksumming) işlemiyle kontrol edilerek bütünlük korunuyor.
Dosya sistemleri ile ilgili önemli hususlardan biri de , bozulmanın ardından dosya sisteminin geçerliliğini tekrar kazanma süresidir. Örneğin RAID depolama ortamında iki terabyte fsck taraması 2 ila 4 saat içinde dosyasistemini temizleyebilir. Eğer depolama ortamında fazla sayıda paylaşımlı dosya sistemi blokları var ise, bunları düzeltmek için pahalı geçişler kullanılacağından, bu süre uzayabilir.
Daha önce bahsedildiği gibi yeni birçok eklenti ve özellik ext4 metadata'ya eklendi. Bununla beraber ext4'ün günlük hayatta yaygın kullanımı için birçok değişiklik yapılmaya devam ediliyor.
4.1. Kullanılmamış Inode sayısı ve hızlı e2fsck e2fsck de en çok zaman alan operasyon birinci geçişleri kontrol etmek. Bu işlem için, bütün inode tablolarını okumak, onları taramak, geçerli olanları, geçerli olmayanları ve kullanılmayan inode'ları tespit etmek bir de blokların ve inode yerleşim bit haritalarını doğrulayıp güncellemek gerekiyor. Başlatılmamış gruplar ve -yüksek watermark inode tablosu- özelliği geçiş bir deki taramanın büyük bir kısmının güvenli bir biçimde atlanmasını sağlıyor. Bu özellik e2fsck'nin harcadığı zamanı 2 ila 20 kat azalatabilir. Bu azalma da dosyasisteminin ne kadar dolu olduğuna bağlı tabi. Bu özellik mke2fs time dan veya tune2fs kullanarak , -O uninit_groups seçeneğiyle aktive edilebilir.
Bu özellik sayesinde kernel ne kadar kullanılmamış inode olduğunu, her blok grup inode tablosunun sonunda kaydedebilir. Sonuç olarak e2fsck kullanılmamış inode'lar için okuma ve tarama işlemlerini atlayabilir. Kullanılmamış inode sayısının e2fsck tarafından güvenli bir şekilde kullanılabilmesi için grup açıklayıcıya CRC16 checksum e2fsck'ye eklendi. Bu da alanların geçerliliğini kontrol ediyor.
Tipik bir ext4 dosya sisteminde inodeların %1 ila %10 çevresi kullanılır. Ayrıca inode tablosunun başlangıcındaki inodelar için genellikle inode yerleşim ilkesi geçerlidir. Bu sayede, ilk tarama aşamasında büyük sayıda inode'un işlenmesi engellenir ve ilk aşama hızlandırılır. Şu anda kernel, dosyalar silindiğinde kullanılmamış inode sayısını artırmıyor. Bu sayı e2fsck'nin her çalışmasında güncelleniyor. Bu da şu demek, eğer bir blok grubun bir çok inode'u silinmişse e2fsck bir daha başlatıldığında daha verimli çalışacak.