Yazma önbelleği, farklı hızlara sahip diskleri kapsayan bir dosya sistemiyle nasıl çalışır?


9

Birden çok diske sahip modern bir Linux sisteminde ve hem yavaş (HDD) hem de hızlı (SSD) sürücüleri kapsayan bir yazılım RAID'inde dosya sistemine önbellek nasıl yazılır?

Md-raid RAID1 için dizi disklerle yapılandırılabilir --write-mostlyve --write-behindbu da okumaların daha hızlı diskten yapıldığını ve daha yavaş diske yazmanın geride kaldığını gösterir. Ama bu çekirdek düzeyinde nasıl önbelleğe alınır? Çekirdek, diskin yazdığı md-raid katmanından önce veya sonra önbelleği alıyor mu? Write () çağrısının sonunda verilerin notklardan birine yazılması garanti edilir --write-behindmi?

Bir btrfsRAID1 için aynı durum nasıl olur? Hiçbir --write-behindişlevsellik yok , bu nedenle kirli sayfalar cihaz düzeyinde mi yoksa dosya sistemi düzeyinde mi sayılıyor? Bir yazma () hangi noktada dönecektir?

vm.dirty_*ratioAyarlanabilirler bu kurulumları nasıl etkiler?

Yanıtlar:


7

--write-mostly, --write-behindTarafından ele alınır mdiçten sürücüsü. mdtemel olarak henüz yazılmamış olan verileri ve hangi verilerin hala eksik olduğunu günlüğe kaydeden (arkaya yazma özelliği için zorunlu olan) yazma amacı bitmap'i gibi meta verileri tutar. Bu, verilerin henüz çoğunlukla yazılan aygıtlara ulaşmadığı bir güç kaybı olayı olması durumunda gereklidir. Bu durumda, etkilenen veri alanı yeniden senkronize edilir (durumunuzda SSD'den okuyorsanız, HDD'ye yazın).

Ama bu çekirdek düzeyinde nasıl önbelleğe alınır?

Arkaya yazma durumunda, md sürücüsü temel olarak yazma isteğini dahili olarak çoğaltır. Ana yazma isteği birincil sürücü (ler) e gider ve üst katmanlara "Tamam Bunu zaten yaptım"; kopyalanan yazma isteği daha sonra RAID'in çoğunlukla arka tarafındaki yazma tarafında kalır ve umarım kimse fark etmeden daha uzun sürebilir.

Daha sonra, baskın katmanı, sırada bekleyen bekleyen geri yazma istekleri varken çoğunlukla yazma aygıtından hiçbir verinin okunmamasını sağlamak için birçok adım atar. Veriler neden çoğunlukla yazma aygıtından okunsun? SSD başarısız olmuş olabilir, bu yüzden geriye kalan her şey var. Karmaşık ve arkaya yazma bazı köşe vakalarını tanıtıyor.

Muhtemelen diğer RAID-1 seviyesi için de destekleniyor. Teoride, SSD'lerin temelde RAID-0 ve iki eşlik HDD'si arkadan yazma modunda olması mantıklı olsa da, böyle bir arkadan yazma RAID-6 desteği yoktur. Sadece RAID-1'dir ve orada bile nadiren kullanılır.

Diğer önbellek ayarları bundan etkilenmez, temel olarak genel önbellek mekanizması, mdsürücünün dahili olarak işleri nasıl uyguladığı konusunda en azından umursamaz . Önbellek işini yapar ve md işini yapar. Bu yüzden bir dosya sistemi önbelleği, çıplak sürücünün üstünde bir dosya sistemi ile md'nin üstünde bir dosya sistemi için aynı şekilde çalışır. (Gerçek bundan biraz daha karmaşıktır, ancak bunu bu şekilde düşünebilirsiniz.)


3

Md-raid RAID1 için dizi disklerle yapılandırılabilir --write-mostlyve --write-behindbu da okumaların daha hızlı diskten yapıldığını ve daha yavaş diske yazmanın geride kaldığını gösterir. Ama bu çekirdek düzeyinde nasıl önbelleğe alınır? Çekirdek, diskin yazdığı md-raid katmanından önce veya sonra önbelleği alıyor mu?

Sonra, bu özellik md-raid'e özgü olduğundan.

Bu md-raid özelliğini önbellekleme değil tamponlama olarak düşünmelisiniz. Aşağıdaki mdadmseçenekle sınırlıdır :

--write arkasında =

Arkaya yazma modunun etkinleştirilmesi gerektiğini belirtin (yalnızca RAID1 için geçerlidir). Bir bağımsız değişken belirtilirse, izin verilen maksimum bekleyen yazma sayısı ayarlanır. Varsayılan değer 256'dır.

Ben sadece normal çekirdek ve donanım arabellekleme ile sınırlı olduğunu düşünebilirsiniz (yani daha küçükse). Normal çekirdek tamponlama tarafından sınırlanmaktadır nr_requestsve max_hw_sectors_kb. Bkz /sys/class/block/$write_behind_device/queue/. Donanım tamponlaması ile, sürücüdeki yazma önbelleğini kastediyorum.

Write () çağrısının sonunda verilerin notklardan birine yazılması garanti edilir --write-behindmi?

Tabii ki, write () öğesinin O_SYNC / O_DSYNC ile açılmış bir dosyada olduğunu veya aslında write () + fsync () anlamına geldiğini varsayarsak. Aksi takdirde, hiçbir garanti uygulanmaz.


Teşekkürler, ancak bu başka bir soru ortaya çıkarır: dosya O_SYNC ile açılmışsa, ilk disk yazıldıktan veya bu durumda tüm diskler yazıldıktan sonra write () döner mi?
Steve

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.