1 puan yazan GN⁺ 2024-10-31 | 1 yorum | WhatsApp'ta paylaş

OpenZFS'te tekilleştirme nedir?

  • Tekilleştirmenin tanımı: OpenZFS'te veriler diske yazılmadan önce aynı verinin diskte zaten bulunup bulunmadığı kontrol edilir; varsa yeni bir yazma yapılmaz ve mevcut kopyaya bir başvuru eklenir.
  • Tekilleştirmenin zorlukları: Verinin diskte zaten olup olmadığını doğrulamak ve yerini bilmek zordur. Bu ek giriş/çıkış (IO) gerektirir ve performans düşüşüne yol açabilir.

Tekilleştirme nasıl çalışır?

  • Çalışma biçimi: Tekilleştirme etkinleştirildiğinde veri bloğu hazırlanır ve sağlama toplamı hesaplanır. Normalde alanı metaslab allocator ayırır, ancak tekilleştirme etkinse sağlama toplamı tekilleştirme tablosunda aranır.
  • Tekilleştirme tablosu: Anahtar olarak sağlama toplamını, değer olarak ise disk konumu ve başvuru sayısını kullanan bir hash tablosu biçiminde tutulur. Bu, havuz meta verisinin bir parçası kabul edilir.

Geleneksel tekilleştirmenin sorunları

  • Tekilleştirme tablosunun sorunu: Geleneksel tekilleştirme, OpenZFS'in disk hash table nesnesi kullanılarak uygulanır. Bu yapı karmaşıktır ve tekilleştirme gibi kullanım senaryolarına uygun değildir.
  • Bellek kullanımı: Tekilleştirme tablosunun okunması ARC'de önbelleğe alınır; yeterli RAM varsa tablo güncellemelerinin okuma tarafı azaltılabilir.
  • Benzersiz girdiler sorunu: Tekilleştirme tablosunda benzersiz girdileri izlemenin kapladığı alan sorun yaratır. Başvuru sayısı 1 olan bloklar tabloda yer kaplar ve aynı veri yeniden yazılmazsa bu maliyet geri kazanılamaz.

Hızlı tekilleştirme bu sorunu nasıl çözüyor?

  • Canlı girdi listesini küçültme: Bellek kullanımını azaltmak için canlı girdi listesinin bellek ayak izi küçültülür. Yeni tekilleştirme tablosunda girdilerin "değer" kısmı 72 bayta indirilmiştir.
  • Tekilleştirme günlüğü: Canlı girdi listesi yerine değişiklikleri kaydetmek için bir günlük kullanılır ve çökme kurtarması sırasında bu günlük yeniden oynatılır. Günlük bellekte tutulur, bu da hızlı sorgulamayı mümkün kılar.
  • Artımlı günlük flush işlemi: Günlüğün boyutunu yönetmek için her transaction'da günlüğün bir kısmı ZAP'e yazılır. Bellek baskısı olduğunda günlük flush işlemi hızlandırılır.

GN⁺ özeti

  • OpenZFS'in yeni "FastDedup" özelliği, geleneksel tekilleştirmenin sorunlarını çözmek için geliştirildi. Bellek kullanımını azaltır ve günlük üzerinden daha verimli veri yönetimi sağlar.
  • Tekilleştirme yalnızca belirli iş yüklerinde faydalıdır; genel amaçlı kullanımda ise hâlâ verimsiz olabilir. Bunun nedeni, tekilleştirme tablosunu yönetmenin getirdiği ek yükün yüksek olmasıdır.
  • Benzer işlev sunan diğer projeler arasında Btrfs'in tekilleştirme özelliği de bulunuyor; bu, diğer dosya sistemlerinde bir alternatif olabilir.

1 yorum

 
GN⁺ 2024-10-31
Hacker News görüşleri
  • Başlığa kapılıp tıkladım, ama ZFS ile ilgilenmiyor olmama rağmen neredeyse tüm yazıyı okudum. Yazı çok açık anlatılmıştı ve özellikle mobil CSS teması çok hoşuma gitti. Kısa özet yazının alt kısmında yer alıyor.

  • copy_file_range tartışmasının yanı sıra, dosya sisteminde aynı hash'e sahip 1 MB ve üzeri dosyaları bulup bunlara seçmeli olarak tekilleştirme uygulayabilmek güzel olurdu.

  • Geleneksel tekilleştirmenin sorunu, ek yükünün çok fazla olması; bu yüzden belirli iş yükleri dışında faydasını görmek zor. Pure ve Dell/EMC dizilerinde VMWare iş yüklerinde 3:1 tekilleştirme/sıkıştırma tasarrufu gördüm.

  • Tekilleştirmenin etkisi, hash'i alınan blokların boyutundan büyük ölçüde etkilenir. Blok ne kadar küçükse eşleşen blok bulunma olasılığı o kadar artar. Ben kişisel olarak 4 KB blok boyutunu tercih ediyorum.

  • "Çevrimdışı" tekilleştirme ya da "tembel" tekilleştirme istiyorum. Tekilleştirme etkin olduğunda tüm yazma ve serbest bırakma işlemleri tekilleştirme tablosuna bakmayı ve yazmayı gerektiriyor. Veri yazarken bunun hızlıca tamamlanmasını isterim.

  • Hızlı tekilleştirme konusunda çok heyecanlıyım. ArchiveBox verilerinde ZFS tekilleştirmesini kullanmak istiyordum. Çok sayıda URL'yi arşivleyip dosya sisteminin her şeyi sıkıştırmasını sağlamak mümkün olacak gibi görünüyor.

  • Kişisel arşivimde ZFS tekilleştirmesi kullanıyorum ve şu anda disk alanını 3 kat azaltıyor. ZFS güvenilirlik açısından çok iyi çalıştı ve veri kaybını önleyebildi.

  • Genel amaçlı tekilleştirme teoride iyi, ama pratikte pek işe yaramıyor. IPFS veriyi tekilleştirmek için değişken boyutlu parçalar kullanmaya çalışıyor, ama gerçekte fark yaratmıyor ve sadece karmaşıklığı artırıyor.

  • Disk denetleyicisindeki özel donanımın, ECC benzeri hesaplamalar için blok hash'lerini sisteme açığa çıkarabilecek şekilde geliştirilmesi güzel olurdu.

  • Dosya sistemi API'sinin tamamen farklı bir yapıda olmasını isterdim. Tüm işletim sistemlerindeki dosya sistemi API'leri, uyumluluk yüzünden kilitlenmiş durumda.

  • Yazma performansı önemliyse, yazma sırasında tekilleştirme yapmaya gerek yok. Tekilleştirme daha sonra, eşzamanlı olarak ve düşük öncelikle yapılabilir.