ZFS yazı dizisi vol. 5: Sıkıştırma ve deduplication

ZFS’in çok dikkat çeken, biri gerçekten de işlevsel olan iki özelliğinden bahsedeceğim: Sıkıştırma ve deduplication. Özellikle sıkıştırma işlevi benim 2011 model Lenovo Thinkpad X220 dizüstü bilgisayarımda bile hissedilmez derecede hızlı çalışıyor.

Bu iki işlevin disk alanı kazancı, performans ve SSD’lerde potansiyel ömür uzatma gibi artıları var.

  • Disk alanı kazancı hem sıkıştırma, hem de deduplication ile zaten geliyor. Her ikisi de kullandığınız uygulamalara bağlı olarak 1.5-2 kat gibi kazançlar çok normal olabilir.
  • Her iki işlevde de sabit diske yazılan veri miktarı azalıyor. Genel olarak bir bilgisayarın en yavaş bileşeni sabit disk olduğu için bu da beklemeleri azaltıyor.
  • SSD’leri doldurdukça performans ve ömür sorunları ortaya çıkıyor. Az veri çok ömür demek.

Sıkıştırma

ZFS veriyi canlı olarak sıkıştırıp kaydedebilir. Bunu dataset seviyesinde seçebilirsiniz; örneğin kullanıcıların ev klasörlerinin olduğu dataset’te sıkıştırmayı açık tutup, zaten sıkıştırılmış yedeklerin olduğu bir dataset’te sıkıştırmayı kapatabilirsiniz.

Sıkıştırmayı zfs set komutuna compression=on veya compression=lz4 argümanını ekleyerek etkinleştirebiliriz.

zfs set compression=lz4 tank/home

“on” yerine “lz4” yazmamın sebebi sıkıştırma seviyelerini seçebiliyor olmanız. Daha az alan kaplayan ama daha yavaş bir sıkıştırmayı da kullanabilirsiniz, tam tersi çok hızlı ama pek alan tasarrufu sağlamayan bir sıkıştırmayı da. ZFS’in varsayılan sıkıştırma seviyesi lz4; benim kullanımım için de gayet yeterli geldi.

Gerçek hayattan tecrübe için bir süredir ZFS’le kullandığım kendi dizüstü sistemimi örnek vereceğim (yani havuz adı vb. buna özgü olacak). Sıkıştırma durumu hakkında bilgi almak için aşağıdaki iki komutu kullanabilirsiniz. Birincisi sıkıştırmanın açık olup olmadığı ve seviyesini, ikincisi ise o anda ne kadar sıkıştırma uygulandığını gösterir. Sonlarına dataset adı eklerseniz de özel olarak o dataset’in sıkıştırma durumunu söyler.

zfs get compression

zfs get compressratio

ZFS’in sıkıştırma özelliği depolama verimini artırmanın yanısıra hızınızı da artırıyor. Eğer depolamanız SSD üzerinde değilse sabit disk bilgisayarınızın performans açısından zayıf halkası. Sıkıştırma sayesinde daha az miktarda veri yazmış oluyorsunuz aslında. Bu da performans artışı demek.

SSD kullanıyor olsanız bile sıkıştırmayı açmanızı öneriyorum. SSD zaten hızlı evet ama daha az veri yazıyor olmak hem onun da hızını (write amplification nedeniyle) biraz artırabilir, hem de ömrünü uzatabilir. Depolama alan kazancının üzerine ek tabii bunlar.

ZFS sıkıştırması açıldığı andan sonra kaydedilen dosyaları sıkıştırır. Yani 5GB veri koyduktan sonra sıkıştırmayı açarsanız, o 5GB’lık kısım sıkıştırılmaz. Sıkıştırmanın getirdiği sistem yükünün çok düşük olduğunu gözönünde bulundurursanız benim tavsiyem ZFS havuzunuzu yaratır yaratmaz üst seviye dataset’inde (yani havuzun ana dataset’inde) sıkıştırmayı açmanız. Sıkıştırma işlevi alt datasetleri de etkiler, böylece gelecekte oluşturduğunuz tüm dataset’ler (siz aksini söylemediğiniz sürece) sıkıştırmalı çalışır.

Deduplication

ZFS blok seviyesi deduplication da yapabilir. Bu özelliği anlamak için sabit disklerde dosyaların “veri blokları” halinde tutulduğunu hatırlayın. ZFS, birden fazla dosya içinde birbiriyle aynı veri blokları gördüğünde, bunları diske yazmaktan kaçınarak deduplication sağlar.

Sıkıştırma gibi, deduplication da açıldığı andan sonraki kayıtları etkiler. Sıkıştırmaya çok benzer şekilde açılıp kapatılır:

zfs set deduplication=on tank/dataset

Deduplication oranını öğrenmek için de:

zpool get dedupratio

Şimdi bizim test sistemine dönüp tank/home dataset’inde deduplication’ı açalım. Sonra da belirli bir dosyayı farklı isimlerle üç kere kopyalayıp deduplication oranını göstereceğim.

İkinci ve üçüncü kopyalamaların ne kadar kısa sürdüğüne dikkat edin. Aslında kopyalamadı bile. Sadece blokların nerede olduğunu söyleyen tabloyu güncelledi. Dolayısıyla aslında 14 saniye sürmesi gereken işlem 2 saniyeden biraz uzun bir sürede tamamlanabildi.

Kazancınız ne kadar olur? Yediği sistem kaynağı gözümü korkutmadan önce bunu biraz denedim. Sanal makinalarımda doğal olarak çok yüksek oranlar yakaladım. Aynı işletim sisteminin 5 kopyasını tutuyorsanız böyle olacak. 🙂

Beni korkutan şey ise deduplication tarafından RAM kullanımı. Şimdi bu deduplication işini yapmak için bloklar takip ediliyor ve ortak kullanılan bir veri bloğu belirlendiğinde bunun diskteki yeri bir tabloya yazılıyor. İşte bu tablo (dedup table) normalde RAM’de tutuluyor. Blok kaydı başına 320 bayt alan ihtiyacı var. Ortak kullanılan blok sayısı arttıkça bu kaydın büyüklüğü de artıyor.

Üstelik, dedup tablosunun bir sınırı var: ZFS’in RAM’de kullanacağı miktarın dörtte biri. Bu değiştirilebilir olsa bile bir RAM kısıtlaması var yani. Genelgeçer tavsiyeler saklayacağınız TB başına 5GB RAM şeklinde. Oracle’ın hesaplaması ise şöyle:

C: Deduplication uygulanabilecek kapasite, TB cinsinden

D: Sistemdeki toplam RAM miktarı, GB cinsinden

S: Blok büyüklüğü, KiB cinsinden

R: Hedef dedup oranı

C = (0.1 x D x S x R)/320

Bu hesap, dedup tablosunun toplam sistem belleğinin 1/10’u olduğunu kabul ediyor. 0.1 ile çarpması ondan. Burada iki önemli değişken var; biri blok büyüklüğü. ZFS’te (aksini söylemezseniz) değişken blok büyüklüğü var. Yani depolama sisteminizi kurduktan bir süre sonra, aslında başta hesapladığınız ortalama blok büyüklüğünden daha düşük değerlerle karşılaşabilirsiniz. Bir de R; deduplication oranı var. Bunu da ilk başta öngöremeyebilirsiniz.

Eğer hızlı SSD’lerle önbellekleme de yapmamışsanız RAM sıkıntısı başgösterebilir. Dedup tablosu bellekten taşıp disklere yazılmaya başlar, diske yapılacak okuma/yazma istekleri bir de dedup tablosuna bakmayı da gerektireceğinden ikiye katlar ve elinizde fena halde yavaş bir sistemle kalabilirsiniz.

Dolayısıyla deduplication özelliği için temel birkaç öneri şöyle özetlenebilir:

  • Yüksek ve tutarlı performans isteyen yük altındaki sunucularda pek yapmamaya çalışın. TB başına disk maliyeti 5GB RAM maliyetinden ucuz olabilir
  • İlla ki yapacaksanız mutlaka SSD önbellekler kullanın, bunların da hızlılarından olsun.
  • Geceden geceye çalışacak, yedekleme amaçlı depolamalarınızda kullanılabilir, nye olmasın?
  • Çok da performans beklemediğiniz ev sunucuları gibilerinde de SSD takviyesi şartıyla kullanılabilir.
  • Önbellek ince ayarı yapmaya hazır olun.

 

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir