Dosya sistemi yazma işlemleri ext4 ile ne kadar süreyle önbelleğe alınabilir?


14

Bir süre önce, bu makalede oldukça iyi özetlenen kirli bir ayrılmadan sonra ext4'ün potansiyel olarak boş dosyaları bırakması hakkında bazı tartışmalar oldu . Temel olarak, gecikmeli ayırma nedeniyle, yazma işlemleri, yazma günlüğünün ext günlüğünün varsayılan işleme aralığından (5 saniye) çok daha uzun süre tutulabilir.

Sorunlar, belirli durumlarda blok tahsisini zorlayan ve böylece varsayılan olarak en fazla 5 saniye sonra verileri diske zorlayan bir düzeltme ekinde giderilmiş gibi görünüyor.

Bir uygulama, dosyanın kendisini kesmeden veya eklemeden bir dosyanın mevcut bölümlerinin üzerine yazdığında ne olacağını merak ediyorum. Bu da 5 saniye içinde diske zorlanacak mı?

Bir dosyaya eklemekten farklı bir durum gibi görünüyor: Eklerken dosya boyutu değişir, bu da bir meta veri değişikliğidir; bu nedenle, bir dergi taahhüdü 5 saniye içinde gerekli olacaktır ve veriler = sipariş nedeniyle, güvenlik endişeleri nedeniyle verilerin bundan önce yazılması gerekecektir (aksi takdirde diğer kullanıcıların silinen dosyalarının bir kısmı ekteki sahibine görünebilir dosya).

Yalnızca dosya verilerinin üzerine yazarken, eski veriler yenisiyle aynı kullanıcıya ait olduğundan, veri yazma işleminin meta veri günlüğü işleminden önce gerçekleşmesi için hiçbir neden yoktur. Yani yazma zaten taahhütten önce olur mu yoksa dergi taahhüt aralığından daha uzun geciktirilebilir mi? Eğer öyleyse, ne kadar?

Güncelleme: Doğru olanı, yani fsync () kullanarak tüm bunların önemsiz olduğunu biliyorum. (Bu ext4 ve veri kaybı ile ilgili tüm tartışmaların ana nedeniydi - sorun sadece fsync () ing değil, doğru anlarda değil uygulamalar ile ilgili.) Kendi başvurumu yazmıyorum, soruyorum çünkü ben tüm uygulamalarımın doğru olanı yapıp yapmadığını bilmiyorum ve böyle "tehlikeli" yazarlar için yaklaşık bir zaman dilimi bilmek istiyorum. Sormamın nedeni, grafik sürücümün çekirdek paniklerine düzenli olarak neden olması ve son 5 saniyeden fazla veri yazma konusunda endişelenmem gerekip gerekmediğini bilmek istiyorum.

Yanıtlar:


16

Tamamlama aralığını, 32 bit işaretsiz tam sayı saniye kadar yüksek olabileceğine inandığım özel bir değere ayarlayabilirsiniz; yani yaklaşık 4 milyar saniye veya 136 yıl. Bu, commitaşağıdaki gibi yürürlüğe koyabileceğiniz bağlama seçeneği ile kullanılabilir (bu sadece bir örnektir; bunu da ayarlayabilirsiniz fstab):

mount /dev/sda1 -t ext4 -o rw,data=writeback,nobh,commit=12345678

Taahhüt aralığı, verinin eklenip eklenmediği veya mevcut verilerin üzerine ya da başka bir şeyin üzerine yazılması gibi herhangi bir koşul türüne dayanmaz. commit(Eğer hiç montaj seçeneği kaynağı yoksa 5 saniye varsayılan) seçeneğini monte bir bash kabuk böyle bir şey yaptığını eşdeğerdir:

#!/bin/bash
while :
do
    echo "Syncing all uncommitted data and journal to disk"
    sync
    sleep 5
done

Karıştırmayın data=orderedve bu global dosya sistemi senkronizasyon aralığı ("kesinleştirme aralığı" belki de komut satırı programının işlevselliğini anlayanlar için daha az anlamlı bir terimdir, bu syncdurumda "senkronizasyon aralığı" olarak adlandırılabilir). data=orderedhakkındadır sırayla (veri ve meta güncellenen edildiği data=writeback"hızlı / daha az güvenli" ve data=journal"yavaş / daha güvenli" dır). commit=12345678dosya sistemi sürücüsünün fiziksel veriyle TÜM kirli verilerin / günlük / meta verilerin / tam bir senkronizasyonunu zorlama sıklığıyla ilgilidir. Ve kesinlikle isterseniz 136 yıla ayarlayabilirsiniz ve aramayan veya kirli sayfalara sahip kirli sayfalara sahip data=writeback,nobhprogramlara bağlanın ...fsync()sync()

Güncelleme: Soru düzenlemenizdeki bağlamınıza bağlı olarak, grafik sürücünüzün çekirdek paniklerini çözene kadar dosya sisteminizi bağlama seçenekleriyle data=journal,commit=1veya hatta syncbağlama seçeneğiyle çalıştırmanız gerektiğini söyleyebilirim . Bu, maksimum veri bütünlüğünü, ancak performans maliyetini koruyacaktır. Özellikle, kaybetmeyi göze alamayacağınız bir diske veri yazıyorsanız ve bunu kullanmak için kullandığınız uygulamalara "güvenmiyorsanız" iki kat önemlidir fsync().

Kaynak: burada ve kişisel deneyim


1
Teşekkürler, "TÜM kirli veri" kısmı tam olarak ne hakkında endişe oldu! Gecikmeli ayırmaya ek olarak daha fazla istisna olduğundan endişeliydim (bu, yeni verilerin yazma aralığından sonra bile yazma önbelleğinde kalmasına neden olabilir).
lxgr

1
Gecikmeli tahsinin arama yaparken sync(veya aynı zamanda, taahhüt aralığı zamanlayıcısı ateşlendiğinde) tamamen ilgisiz olduğundan eminim . syncTamamlandığı zaman, kesinlikle kirli veri, meta veri veya günlük sayfası yoktur. Eşzamanlı veri aktarımı sırasında dosya sisteminde yapılan değişiklikler tamamlanıncaya kadar engellenir.
allquixotic

1
Gerçekten mi? Gelen bugs.launchpad.net/ubuntu/+source/linux/+bug/317781/comments/45 o özellikle ayrılmamış sayfaları işlemek üzerinde diske yazılacak YAYINLAMAYACAĞINI belirtilen (ancak bir fsync üzerinde elbette ()). Yama, tahsisi zorlayarak bu davranışın sorunlu olduğu bazı yaygın durumları giderir; ancak, verilerin üzerine yazma hakkında söylenen bir şey yoktur.
lxgr

1
Ah, yani commit=...ve synceşdeğer DEĞİLDİR? Yoksa tytso, onunla bile syncayrılmamış sayfalar işlemediğini ima etti mi? POSIX spesifikasyonlarını ihlal edeceğinden, böyle olduğunu düşünemiyorum. Belki daha iyi veri güvenliği için sağladığım bash betiğini kullanabilirsiniz: P
allquixotic

1
Eminim o eski demek, ikincisi Linux üzerinde ext4 kullanmak oldukça tehlikeli bir dosya sistemi yapar;) Senaryo güzel bir çözüm gibi görünüyor; Bir deneyeceğim ve belki de en önemli uygulamalardan bazılarını strace ile değerlendireceğim - belki de hepsi fsync () kullanıyorlar ve çok endişeleniyorum ...
lxgr

1

Sorunuzun cevabı ne olursa olsun önemli değil.

Garantili maruz ext4 dosya sisteminin davranışı "veri Başarılı sonra diskte olacağıdır sync/ fsyncçağrı". Bu nedenle, bu soruyu soran bir uygulamanız varsa, veri bütünlüğünün sağlanması gereken kritik noktalara senkronizasyon çağrıları eklemelisiniz. Aynı sorundan endişe duyan bir kullanıcıysanız, synckirli bir kapatmaya neden olabilecek tehlikeli davranışları gerçekleştirmeden önce komut satırı yardımcı programını çağırabilirsiniz .


Fsync (); Kullanabilecek veya kullanamayan uygulamaların bir kullanıcısı olarak soruyorum. Sorumu güncelledim.
lxgr
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.