Kısa ömürlü dosyalar diske temizlenir mi?


9

Programım kısa ömürlü birçok küçük dosya oluşturur. Genellikle oluşturma işleminden sonraki bir saniye içinde silinir. Dosyalar gerçek bir sabit disk tarafından desteklenen bir ext4 dosya sistemindedir. Linux'un düzenli olarak pdflushkirli sayfaları diske temizlediğini biliyorum . Dosyalarım kısa ömürlü olduğundan, büyük olasılıkla önbelleğe alınmazlar pdflush. Sorum şu: Programım disk yazmalarına neden oluyor mu? Endişem sabit diskimin ömrü.

Dosyalar küçük olduğundan, onların büyüklüğü toplamı küçüktür varsayalım dirty_bytesve dirty_background_bytes.

Ext4'ün varsayılan günlüğü açık, yani meta veri günlüğü var. Ayrıca meta verilerin mi yoksa verilerin diske mi yazıldığını bilmek istiyorum.


> Programım çok sayıda kısa ömürlü dosya yaratıyor 'ne kadar'? Bu dosyaları siliyor veya dosyaları yeniden yazıyor musunuz? > Meta verilerin mi yoksa verilerin diske mi yazıldığını da bilmek istiyorum. Varsayılan meta veri modunun, veriler diske yazılmadan önce meta verilerin işlendiği anlamına geldiğine inanıyorum. Elbette bunu değiştirmek için ekleyebileceğiniz montaj seçenekleri vardır. > Sorum şu: Programım disk yazmalarına neden oluyor mu? verdiğiniz bilgileri dikkate alarak buna yanıt vermek zordur. Disk IO'sunu izlemek için iotop ve sysstat gibi araçlar kullanmayı düşündünüz mü ?
AngryWombat

ReiserFS küçük diskler için gerçekten daha iyi disk vurmak istiyorsanız daha iyi tmpfs umursamıyorsanız iyi
xenoterracide

Bazı açıklamalar: (1). ext4 dosya sistemi syncisteğe bağlı olarak monte edilmemiştir . Varsayılan yüklü bir fedora, debian veya ubuntu düşünebilirsiniz. Birini seç. (2). Her dosya yaklaşık 60 KB'dir. (3). Saniyede yaklaşık 1000 dosya oluşturulur ve silinir, ancak hiçbir zaman en fazla 10 dosya bulunur. Başka bir deyişle, G / Ç çıktısı büyük ancak işgal edilen alan küçük.
Wu Yongzheng

Yanıtlar:


5

Ext4 kullanarak basit bir deneme:

100 MB boyutunda bir resim oluşturun ...

# dd if=/dev/zero of=image bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.0533049 s, 2.0 GB/s

Bir döngü cihazı yapın ...

# losetup -f --show image
/dev/loop0

Dosya sistemi yap ve bağla ...

# mkfs.ext4 /dev/loop0
# mount /dev/loop0 /mnt/tmp

Kısa ömürlü dosyalar ile bir tür çalışma yapın. (Bunu istediğiniz herhangi bir yöntemle değiştirin.)

for ((x=0; x<1000; x++))
do
    (echo short-lived-content-$x > /mnt/tmp/short-lived-file-$x
     sleep 1
     rm /mnt/tmp/short-lived-file-$x ) &
done

Umount, sync, unloop.

# umount /mnt/tmp
# sync
# losetup -d /dev/loop0

Görüntü içeriğini kontrol edin.

# strings image | grep short-lived-file | tail -n 3
short-lived-file-266
short-lived-file-895
short-lived-file-909
# strings image | grep short-lived-content | tail -n 3

Benim durumumda tüm dosya adlarını listeledi, ancak dosya içeriğinin hiçbirini listelemedi. Yani sadece içerikler yazılmadı.


İyi deneme. Şimdi ikna oldum. Ayrıca ext2'yi denedim ve sizinle aynı sonucu aldım. Paralel G / Ç iş yükünüzü sırayla değiştirdim ve bir kısa ömürlü dosya-999 ve 8 kısa ömürlü içerik- * aldım. Herhangi bir açıklaması olan var mı?
Wu Yongzheng

@msw: belirsiz olması durumunda düzenlenmiştir. Aksi takdirde lütfen detaylandırın.
frostschutz

Bu sadece aptalca. Dosyalar eşzamanlı olarak var, üzerine yazılacak hiçbir şey yoktu ve dosya sistemleri silinen dosya içeriğinin üzerine yazmıyor, çünkü bu performansa zarar verebilir. Ancak, elbette, nbdtrafiği (ve tüm yazmaları izlemek için benzer bir yöntemi) kullanın ve günlüğe kaydedin.
frostschutz

7

Katı hal sürücüsünden bahsedmediğiniz sürece, çok sayıda disk yazımı sürücü ömrünün baskın faktörü olmayacaktır.

Disk yazma işlemlerinden gerçekten kaçınmak istiyorsanız, tmpfs'ye bakın ,


2
tmpfs bu durumda gerçekten iyi bir seçimdir, ancak yine de, genel bir işletim sistemi sorusu olarak, verilerin diske yazıldığını (gereksiz) bilmek istiyorum?
Wu Yongzheng

Sorunuzun kesin bir cevap almak için formüle edebileceğinizden çok daha spesifik olması gerekir. Tampon önbellek, performans ve kalıcılık arasında soyutta cevaplanamayan karmaşık bir değişime aracılık eder. Listelenen @AngryWombat araçlarını kullanarak, özel uygulamanızdaki gerçek yazımları ölçebilirsiniz, ancak çalıştırmadan çalışmaya değişiklik gösterebilecek birçok faktör vardır.
msw

Pdflush dosya silindikten sonra gelirse . Yazmak gereksiz olurdu.
Wu Yongzheng

1

Genel bir kural olarak, hayır, onlar yazılmaz. Bunun nedeni, iki koşuldan biri karşılandığında önbelleğin kirli sayfaları temizlemesidir:

  1. Veriler daha sonra /proc/sys/vm/dirty_writeback_centisecseskimiş ve varsayılan değer 5 saniyedir.

  2. Önbelleğin verileri tutamayacak kadar az belleği vardır, önbellekteki dirty_ratiokirli sayfalardan daha fazladır (varsayılan değer% 20'dir).

Bu nedenle, 5 saniyeden daha kısa bir sürede silinen küçük dosyalarınız dışında bol miktarda boş bellek ve az yazma trafiğine sahip bir sistemde veriler temizlenmez.


0

Kısa ömürlü dosyaların diske yazılıp yazılmayacağı, yalnızca çekirdek dosya önbelleğinin varsayılan davranışına değil, aynı zamanda dosya sistemi sürücüsü uygulamasının ayrıntılarına ve adı geçen dosya sisteminin bağlama seçeneklerine de bağlıdır. Sistemi, her şeyin her zaman derhal diske yazılacak şekilde yapılandırılması mümkündür (esasen DOS benzeri davranış).

İlgilendiğiniz davranışı ("gecikmeli ayırma" olarak adlandırılır) öne çıkaran bir dosya sistemi XFS'dir. Bununla birlikte, sadece silinmiş dosyalara ait blokların ara disk erişimi olmadan bellekte yeniden kullanılacağından (başka bir yerde komik yapılandırma seçenekleri verilmeden) az çok emin olabilirsiniz. XFS yine de meta veri günlüğünü güncellemek isteyebilir (bu oldukça sık diske yazılacaktır; ancak, XFS günlüğünün yalnızca meta veri olduğu göz önüne alındığında, pil destekli RAM gibi diğer bazı hızlı cihazlarda ayarlanacak kadar küçüktür birçok RAID denetleyicisinde).

Bu davranış nedeniyle, tamamen sıfırlanmış bulmak nadir değildir, ancak ani bir elektrik kesintisinden sonra yasal olarak XFS dosya sisteminde yasal görünümlü dosyalar (boyut ve diğer meta veriler bozulmamış) bulmaktır. Bu, hızlı "yarı geçici" dosya işlemlerini destekleme maliyetidir.

Bazı teoriler

Genel olarak, bir dosya sistemine erişen bir sistem çağrısı, dosya sistemi sürücüsü tanımlı yöntemde (VFS sürücüsü kaydedildiğinde "struct inode_operations" ve "struct file_operations" a eklenir) oldukça hızlı bir şekilde sona erer. Bundan sonra ne olacağı sadece dosya sistemi uygulamasının takdirine bırakılmıştır. Genellikle, aşağıdaki yaklaşıma benzeyen bir şey kullanılır (bu basit örnek linux FAT sürücüsündedir):

if (IS_DIRSYNC(dir))
    (void)fat_sync_inode(dir);
else
    mark_inode_dirty(dir);

Dosya sistemi "sync" modundaysa, tüm değişiklikler derhal diske gider (bu durumda fat_sync_inode () üzerinden). Aksi takdirde, blok "kirli" olarak işaretlenir ve makul bir fırsatta temizlenene kadar bellek önbelleğinde kalır.

Bu nedenle, dosya sistemi bağlama seçeneklerini düşünmeden ve uygulamasının kaynak kodunu incelemeden geçici dosyalara ilişkin sistem davranışını tahmin etmek imkansızdır (bu, elbette, çoğunlukla gömülü alanda bulunan her türlü egzotik dosya sistemi için geçerlidir) .


Cevabınız için teşekkürler. Ext4'ün de tahsisi geciktirdiği görülüyor. Bu, cevabımın HAYIR olduğu anlamına mı geliyor? (başka bir yerde komik yapılandırma seçenekleri verilmedi). Bu ext2 kullanıldığında cevabımın EVET olduğu anlamına mı geliyor?
Wu Yongzheng

Modern çekirdeğin ext2'sinde bile cevabın HAYIR olacağını düşünürdüm. Bu özel konu çok tartışıldı ve çekirdek kaynağına kısa bir bakış, ext2 sürücüsünün çoğunlukla "varsayılan" çekirdek işlemlerine yaptıklarını gösteriyor (böylece her şey blok önbellek tarafından ertelendi). Sanırım cevabımı bazı ekstra bilgiler içerecek şekilde güncellemeliyim.
oakad

Benim ext4 açıkçası syncseçenek ile monte değil . Bunu asla yapmam.
Wu Yongzheng

Bir inode kirli olarak işaretlenirken, dosya sisteminin ilgili sayfayı kirli olarak işaretlemekten sorumlu olduğunu varsayıyorum. Daha sonra inode silindiğinde, dosya sistemi kirli sayfayı temizliyor mu? Değilse, veriler gereksiz yere diske temizlenir.
Wu Yongzheng

2
Kullanılmayan veri blokları "serbest bırakılır", böylece kirlenmeyi durdururlar. Dosyalamak için bir şeyler yazdıysanız ve ardından yıkamadan önce keserseniz, EOF'u geçen önemsiz şey kaybolur (bir çeşit). Meta verilerle bu kadar basit olmayabilir, çünkü dosya sistemi veri yapılarının bütünlüğüne ilişkin çeşitli ödünleşimler olabilir. Bu arada, sorunuzdan her zaman platformunuzun tam kontrolünde olmasını beklediğiniz açık değildir - çoğu uygulama genellikle geliştiriciden uzak, yapılandırması bilinmeyen makinelerde çalışır.
oakad
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.