Dosyalar sırayla diske kaydedilir mi?


22

Anladığım kadarıyla, "seyrek dosya", dosyanın 'boşluklara' sahip olabileceği anlamına gelir; böylece kullanılan gerçek veriler, mantıksal dosya boyutundan daha küçük olabilir.

Linux dosya sistemleri dosyaları diske nasıl kaydeder? Ben çoğunlukla ext4 ile ilgileniyorum. Fakat:

  1. Bir dosya kaydedilebilir değil diskte sıralı? Bununla, dosyanın bir kısmının X fiziksel adresinde ve bir sonraki kısmının da X + ofsetine yakın olmayan Y fiziksel adresinde yer aldığını kastediyorum).
  2. Bir şekilde dosya sıralamasını kontrol edebilir miyim?
    10GB'lık bir dosya tahsis etmek istiyorum. Diskte sıralı olmasını ve farklı ofsetler arasında bölünmemesini istiyorum.
  3. Farklı tipler arasında farklı davranıyor mu?


1
Belki de amacınızı doğru anlarsam, dosya sistemi katmanından geçmek zorunda kalmayan depolama aygıtlarıyla çalıştığınız düşük seviyeli API ile daha çok ilgilenirsiniz. Giriş noktanız dmsetupprogram eşleştiricisi olan bir arayüz olabilir. Veritabanına benzer bir depolama planlıyorsanız, bu iyi bir seçim olabilir.
wvxvw

4
Bu, dosya sisteminin bir uygulama detayıdır. Hemen hemen tüm dosya sistemleri yapmak varsayılan olarak fragman dosyaları; sadece iso9660ve romfsbunu yapamazlar ve sürekli depolamaya ihtiyaç duyarlar (bunlardan birini sıra dışı listeleyebilirim).
mirabilos,

2
dosyanın diskte bitişik olup olmadığına bakılmaksızın, dosyanın başka bir bölümünü aramadıkça, okuma / yazma verileri her zaman bitişik olacaktır. Peki neden bunu umursuyorsun? Parçalanma, performansı etkileyen ciddi bir sorun
değilse

3
@hudac akılda tutulması gereken bir şey bitişik olması pratikte tüm bu yararlı değildir. Kolay olanı, parçalanmanın çok fazla olmadığı durumlarda yanıp söner, ancak dönen bir tabağa hala bitişik verilerden faydalanamayabilirsiniz. Dönen bir tabağın üzerinde, erişim kalıplarınızı ve verilerin nerede olduğunu düşünmeniz gerekir. Sadece başın altından geçen sektöre ihtiyacınız varsa, tekrar tam olarak gelmesini beklemelisiniz. En iyi sonucu almak için, verileri okumak istediğinizde "yakın" olması için verileri kademelendirmek istiyorsunuz. Önbellek boyutunu artırmak daha kolay ;-)
Ukko

Yanıtlar:


41

Bir dosya kaydedilebilir değil diskte sıralı? Demek istediğim, dosyanın bir kısmı fiziksel adres X altında, diğer kısmı ise Y adresinin altında, X + ofsetine yakın değil).

Evet; Bu dosya parçalanması olarak bilinir ve özellikle daha büyük dosyalarda nadir değildir. Çoğu dosya sistemi, sırayla gerektiği gibi, daha az veya daha fazla sırayla yer ayırır, ancak gelecekteki davranışı tahmin edemezler - bir dosyaya 200MiB yazarsanız, sonra 100MiB eklerseniz, her iki veri kümesinin de sıfır olma ihtimali yoktur Diskin farklı alanlarında saklanmalıdır (temel olarak, ilk yazma işleminden sonra ve ikinci işlemden önce gerçekleşmek üzere disk üzerinde daha fazla alana ihtiyaç duyan herhangi bir yazma, ikisi arasında gelebilir). Bir dosya sistemi tam doluysa, durum genellikle daha kötü olacaktır: yeni bir dosyayı alabilecek kadar büyük bitişik bir boş alan olmayabilir, bu yüzden parçalanması gerekebilir.

Bir şekilde dosya sıralamasını kontrol edebilir miyim? 10GB'lık büyük bir dosya tahsis etmek istiyorum. Diskte sıralı olmasını ve farklı ofsetler arasında bölünmemesini istiyorum.

Dosya sistemine, oluşturulduğunda dosyanızın hedef boyutunu anlatabilirsiniz; Bu, dosya sisteminin en iyi şekilde saklamasına yardımcı olur. Pek çok modern dosya sistemi, hesaplama yapıldığında mevcut olan bilgiyi en üst düzeye çıkarmak için, yeni bir dosyanın disk düzeninin mümkün olduğu kadar geç hesaplandığı gecikmeli tahsis adı verilen bir teknik kullanır. Bu işleme posix_fallocate(3), dosya sistemine toplamda ne kadar disk alanı ayrılması gerektiğini söyleyen işlevi kullanarak yardımcı olabilirsiniz . Modern dosya sistemleri bu tahsisi sırayla gerçekleştirmeye çalışacaktır.

Farklı tipler arasında farklı davranıyor mu?

Farklı dosya sistemleri farklı davranır, evet. NILFS2 gibi günlük tabanlı dosya sistemleri, depolama alanını Ext4 gibi kapsam tabanlı dosya sistemleriyle aynı şekilde ayırmaz ve bu yalnızca bir varyasyon örneğidir.


1
fallocate(3)Dosya sıralılığını sağlamak mı kullanılacak ? ya da sadece dosya sistemini ima edecek? Man sayfalarından tam olarak anlayamıyorum.
hudac

6
Sıralı tahsisi garanti edemez, sadece bir ipucu. Ancak 10GiB dosya yazıyorsanız kesinlikle kullanmalısınız!
Stephen Kitt

6
Temelde, FAT'den daha sofistike olan tüm dosya sistemleri - hepsi orijinal Berkeley UFS'ye kadar uzanıyor - kasıtlı olarak büyük dosyaları parçalayacak ve bunları birden fazla "ayırma grubu" na yayacak; Bu , diskin genel parçalanmalarını en aza indirgemelerine yardımcı olur . Bunun nasıl çalıştığını ayarlamanın bir yolu olabilir , ancak bunu yapmak için dosya sistemini sıfırdan yeniden oluşturmanız gerekebilir ve muhtemelen tamamen kapatmanın bir yolu yoktur.
zwol

2
@hudac Her durumda sıralılığı güvence altına almak (dolu olan bir sürücüye bakınız) ve eskisinden daha az önemli olduğu SSD'lerin yükselişine dürüst olmak imkansızdır (en azından parasını ödeyebilenler için) ).
Muzer

1
Ayrıca, eğer mümkünse, bitişik dosyalara sahip olmanın daha az etkili olduğu RAID sistemleri gibi durumlar olduğunu unutmayın. Bence bu gerçekten bir disk / depolama altsistemi denetleyicisinin amacı: dosyaların depolanması işini makul bir şekilde beklendiği gibi en iyi şekilde boşaltmak.
jamesqf

17

Komut filefrag, dosyanızın fiziksel olarak cihazınızda nasıl saklandığını size söyleyecektir:

# filefrag -v /var/log/messages.1 
Filesystem type is: ef53
File size of /var/log/messages.1 is 41733 (11 blocks, blocksize 4096)
 ext logical physical expected length flags
   0       0  2130567               1 
   1       1 15907576  2130568      1 
   2       2 15910400 15907577      1 
   3       3 15902720 15910401      7 
   4      10  2838546 15902727      1 eof
/var/log/messages.1: 5 extents found

Dosyanızı bir geçişte yazarsanız, benim tahminim, dosyanızın bölünmeyeceğidir.

fallocate(1) ' in man sayfası oldukça açık:

fallocate blokları bir dosyaya önceden ayırmak için kullanılır. fallocateSistem çağrısını destekleyen dosya sistemlerinde , bloklar ayrılarak ve başlatılmamış olarak işaretlenerek veri bloklarına GÇ gerektirmeden hızlı bir şekilde yapılır. Bu, bir dosyayı sıfırlarla doldurmaktan çok daha hızlıdır.

Linux Çekirdeği v2.6.31'den itibaren, fallocatesistem çağrısı btrfs, ext4, ocfs2 ve xfs dosya sistemleri tarafından desteklenir.

Sıralı mı? Sistem önce blokları sırayla tahsis etmeye çalışacaktır. Olmazsa, sizi uyarmaz.


'Ef53' tipi nedir. Dosyalarımda da gördüm. Ama benim FS tipim ext4.
hudac

2
EF53, ext2, ext3 ve ext4'ün "SUPER_MAGIC" sayısıdır. Her dosya sisteminin tüm sihirli sayıları için çekirdek kaynaklarında "include / uapi / linux / magic.h" dosyasına bakın.
Vouze

Debian'da filefraggizlenir /usr/sbin. Ancak sıradan kullanıcılar için çalışıyor gibi görünüyor (en azından ext4'te). straceUyarı eksikliği size bir engel teşkil ediyorsa, kendiniz için parçalanmanın nasıl ölçüleceğini görmek operasyon için öğretici olabilir .
Toby Speight

6

Seyrek dosyalardan bahsediyorsunuz ve diğer cevapların hiçbiri onlardan bahsetmiyor.

Çoğu dosya seyrek değildir. Bir dosya oluşturmanın en yaygın yolu, baştan sona kadar hepsini bir seferde yazmaktır. Orada delik yok.

Ancak, "1.000.000.000.000 pozisyonuna taşı ve oraya bir bayt yaz" diyebilirsin. Bu, büyük bir etabayt büyüklüğüne benzeyen bir dosya oluşturur, ancak aslında diskte yalnızca (muhtemelen) 4k kullanır. Bu seyrek bir dosyadır.

Bunu aynı dosya için birçok kez yapabilirsiniz ve büyük miktarda boşluğa dağılmış az miktarda veri bırakın.

Bu faydalı olabilirken, iki dezavantajı vardır.

Birincisi, dosyanın parçalanacağı, yani endişelendiğin şey.

İkincisi, tüm programların bu dosyaları iyi işlememesidir. Örneğin, bir yedekleme yazılımı boşluğu yedeklemeye çalışacak ve böylece gerekenden daha büyük, muhtemelen yedekleme ortamı için çok büyük bir yedek oluşturacaktır .


Ancak seyrek bir dosya bile çoğu zaman diskte bitişik olmayacaktır.
Barmar

2

Bir şekilde dosya sıralamasını kontrol edebilir miyim? 10GB'lık bir dosya tahsis etmek istiyorum. Diskte sıralı olmasını ve farklı ofsetler arasında bölünmemesini istiyorum.

Bunu başarmanın en az birkaç yolu var.

  1. Çok fazla boş alana sahip bir dosya sistemi kullanın ve alanı önceden tahsis edin (örneğin, uygulamaya özel bir veri sonu işaretçisi kullanın ve dosya boyutu 10 GB'a ulaşana kadar rasgele veri ekleyin). Bunun, parçalanmamış verilerle sonuçlanması garanti edilmez.

  2. Bir kullan ham (pişmemiş) dosya sistemi bazen performans nedenlerle yapmak yerine ext4 vb DBMSs arasında. Tradeoff, gerekirse kendi önbelleğe alma / dergiye alma / kurtarma vb.

Bunu yaparak daha fazla kazandığınız örnekler oldukça nadirdir - ilk önce performansı optimize etmek için başka bir yere bakardım.


Ayrıca bakınız

Veritabanı yönetim sistemlerinin tipik olarak dosya sistemlerini atladığı doğru mu?


-1

Bu sadece bir defalık bir şeyse ve dosyanın orijinal olarak nasıl saklandığı önemli değilse, sadece sonuç önemlidir, o zaman dosyayı normal şekilde kaydedebilir ve işletim sisteminizin birleştiricisini çalıştırabilirsiniz. Ardından , dosyanızın tek bir parça halinde olup olmadığını kontrol ederek bu cevabı kontrol edebilirsiniz . Bu, komutları veya harici programları kullanmadan bunu yapmanın en kolay yoludur, ancak kesinlikle en hızlı yöntem değildir, çünkü tüm diskinizi birleştirir.


1
"Birleştiriciyi çalıştır"? Böyle bir program var mı Ben aradığında tek şey buldum aptitude search ~ddefragvardı ddrescueviewve nidsTCP segmenti yeniden birleştirme kütüphanesi. Programın ne dendiğini veya hangi argümanların iletilmesi gerektiğini söylemezseniz cevabınız çok yardımcı olmaz.
Toby Speight

1
@TobySpeight - evet bir birleştirici var; e4defrag.
30’da ravery
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.