To, że TrueNAS i ZFS to świetna para to już wiemy. O TrueNS jako takim opowiadałem <TU> . O tym jak działa i dlaczego tak fajny jest sam ZFS no i jak go optymalizować i kiedy warto to robić opowiadałem <TU>. Czas na optymalizację wykorzystania miejsca na naszych dyskach. Spróbujemy sprawić, że będziemy potrzebowali mniej dysków niż potrzebujemy, ale znowu kiedy warto, i ile da się zaoszczędzić.
ZFS Deduplikacja
Zacznijmy od deduplikacji. Mówimy tutaj o sytuacji kiedy przechowujemy powtarzające się dane, Najprostszym przypadkiem jest kiedy na naszym TrueNAS leżą sobie kilkukrotnie te same filmy zdjęcia dokumenty itp. Podczas zapisu na dysk mechanizmy deduplikacji wykrywają, że mamy już takie dane na dysku i zamiast zapisywać je jeszcze raz zapisujemy tylko informacje linkujące do już zapisanych danych oszczędzają miejsce. Fajne prawda?
ZFS Deduplikacja – jak działa
Działa to tak, że jeżeli mamy włączoną deduplikację to podczas zapisu danych dane dzielone są na z góry określone cząstki danych z od 4 Kb to 1 MB. Na dysku zapisywane są bloki danych. Z każdego bloku wykonywany jest hash, funkcja skrótu która na podstawie zawartości generuje wysoko unikalny, identyfikator danego bloku danych. Metadane w postaci adresu bloku na dysku i jego hash zapisywane są w osobnym zbiorze danych. Przed każdym zapisem nowych danych najpierw robi się hash danych i sprawdza się w metadanych czy mamy już blok z takim hash. Jeżeli tak to na dysku nie ląduje nowy blok danych tylko w tablicy metadanych zapisywany jest informacja o położeniu takiego bloku.
Zwróćcie proszę uwagę na to, że wcale nie mówi się tutaj o plikach tylko i blokach danych. Sprawia to, że wystarczy żeby pliki porywały się częściowo, na przykład różniły się końcówką i już zacznie dla nas działać proces deduplikacji. Zostanie zapisana na dysk tylko różniąca się cześć a nie cały plik. W tym momencie ważnym staje się wielkość bloku. Przez zmniejszenie wielkości bloków sprawiamy, że prawdopodobieństwo identyczności dwóch bloków roście a więc i prawdopodobieństwo deduplikacji ale równocześnie rośnie ilość metadanych do obsłużenia. Zestaw metadanych zbierany jest per vPool czyli jeżeli mamy powtarzające się bloki w różnych Dataset to będą one deduplikowane.
ZFS Deduplikacja – zalety
Jedyną ale niepodważalną zaletą deduplikacji jest redukcja zajętości miejsca na dyskach. Jeżeli dziesięciu użytkowników wrzuci do swoich folderów na serwerze te same obrazy dysków, filmy, dokumenty, pdf czy inne, to redukcja danych może sięgnąć dziesięciokrotna. To oczywiście skrajnie optymistyczne przypadek i raczej rzadki ?
ZFS Deduplikacja – wady
Wszystko ładnie, pięknie ale, co może pójść nie tak? ? a no przy najmniej kilka rzeczy. Pierwszą wadą jest konieczne zasoby procesora na obliczenie hash każdego bloku danych. Warto tu wspomnieć, że dużym wsparcie jest tutaj AES-NI to zestaw instrukcji procesora związany z wsparciem sprzętowym szyfrowania ale przydaje się również przy wyliczaniu hash. Procesor bez AES-NI może wyliczać sumy kontrole hash kilkukrotnie wolniej. Jeżeli wydajność naszego serwera danych nie jest kluczowa, lub po prostu prawie nie jest obciążony to nie ma znaczenia. W wypadku mocnego obciążenia serwera ważnym jest żeby sprawdzić przez zakupem używanego serwera czy procesor posiada taką funkcję. Chyba wszystkie nowe procesory mają wsparcie AES-NI.
W skrócie deduplikacja zwiększa obciążenie procesora.
Drugą wadą deduplikacji jest konieczność zapisu dodatkowych metadanych. Wiąże się to z potrzebą dodatkowego miejsca oraz z obciążeniem dysków podczas zapisu, czyli spowolnieniem zapisu. Jeżeli dane są niepowtarzalne to na dysk musimy zapisać więcej danych, same dane oraz metadane. Ilość metadanych z grubsza zależy od, co oczywiste, od ilości danych, oraz, co mniej oczywiste, od wielkości bloków. Przy małych blokach powstaje relatywnie więcej metadanych. W efekcie przy unikalnych danych możemy zwiększyć zapełnienie dysku o kilkadziesiąt procent. A nie o to na tutaj chodzi ?
Dobrym pomysłem żeby przyspieszyć działanie jest zastosowanie dedykowanego dysku NVMe na metadane deduplikacji. Jest on szybki i operacje na niem nie konkurują z operacjami na dyskach z danymi. Pamiętajmy jednak, że dane dedupkilacji są nieodtwarzalne, jak stracimy dane deduplikacji to tracimy też same dane. Czyli vDev dla metadanych deduplikacji musi być redundantny, minimum dwa dyski.
W skrócie jeżeli mamy niepowtarzalne dane to efektem włączenia deduplikacji będzie zwiększenie zajętości dysku i wydłużenie czasu zapisu.
Dodatkową wadą deduplikacji jest również zwiększenie zapotrzebowanie na RAM przez obecność w nich metadanych. Czyli włączając deduplikację automatycznie redukujemy sobie dostępną wielkość ARC cache czyli pamięci podręcznej na dane, <TU> opisuje szczegóły tego mechanizmu.
ZFS Deduplikacja – podsumowanie
Podsumowując deduplikację, jest bardzo ciekawym rozwiązaniem ale na pewno nie powinna być włączana domyślnie na wszystkich instalacjach. Podstawą rozpatrywania deduplikacji jest odpowiedzieć sobie na pytanie: czy mam na dysku powtarzające się dane? Jeżeli mamy powtarzające się dane to zdecydowanie warto rozważyć włączenie. Jeżeli natomiast nie mamy powtarzających się danych to zwiększymy zajętość dysku, spowolnimy zapis, obciążymy procesor. Pamiętajmy, że deduplikację możemy włączyć per Dataset czyli jeżeli uznamy, że mamy powtarzające tylko w jednym Dataset to tylko w tylko w nim włączymy. Miejsca gdzie możemy się ogólnie spodziewać efektywnego działania to miejsca z powtarzającymi się plikami dla kilku użytkowników jak pliki systemowe podobnych wirtualnych systemów, pliki silnika WordPress w hostingu itp.
ZFS Kompresja
Kompresja w ZFS jest chyba zupełnie samo opisującym się terminem. Mechanizm polega na kompresowaniu w locie danych przed zapisem na dysk i dekompresji przy odczycie. Warto dodać, że funkcja kompresji w TrueNAS jest domyślnie włączona przy tworzeniu nowych vPool. Kompresja jest konfigurowalna per Detaset czyli możemy wybrać która dane mają być kompresowane a które nie. Dodatkowo możemy wybrać mechanizm kompresji takie jak ZSTD, GZIP, LZ4 ale jest ich sporo więcej. Domyślnym jest LZ4. Każdy z nich ma trochę inny zestaw parametrów takich jak:skuteczność kompresji, obciążenie procesora przy kompresji i przy dekompresji. Ogólną zasadą jest, że im lepsza kompresja tym większe obciążenie procesora ale to tylko ogólna zasada. Czasem niektóre mechanizmy są po prostu lepsze od innych. Skuteczność i porównanie kompresji poszczególnych mechanizmów to zdecydowanie materiał do osobny odcinek.
ZFS Kompresja – zalety
Zaletą kompresji, co nie jest zaskakujące, kompresja danych i zmniejszenie ilości potrzebnego miejsca. W skrajnych wypadkach nawet kilku, kilkunastokrotne. Dodatkową zaletą w TrueNAS jest to, że jest włączone w tle i po prostu działa.
ZFS Kompresja – wady
Wadą kompresji jest obciążenie procesora przy każdorazowym zapisie i odczycie z dysku. Są dane które są w praktyce nie dają się już kompresować ponieważ już są optymalnie skompresowane jak filmy i zdjęcia. W takim wypadku każdorazowa ich kompresja i dekompresja jest tylko marnowaniem czasu procesora, prądu, wydzielanego ciepła, CO2 i czego tam jeszcze.
ZFS Kompresja – podsumowanie
Podsumowując kompresję w ZFS ogólnie jest dobrym rozwiązaniem i w większości wypadków będzie dawało oszczędność miejsca na dysku. Efektywność kompresji jest znów zależna głównie od rodzaju danych i wybranego sposobu kompresji. Bardzo dobrze natomiast kompresują się wszelkie dane przechowywane w postaci tekstowej, nieźle kompresują się też dokumenty. Jeżeli chodzi o przeciwwskazania to na przykład, będziemy tworzyli Dataset do przechowywania zdjęć czy filmów to zalecam wyłączyć kompresję ponieważ te dane generalnie i tak nie dadzą się skompresować. Generalnym przeciwwskazaniem jest kompresowanie danych już kompresowanych: zdjęcia, filmy, skompresowane backupy, kompresowane obrazy maszyn wirtualnych itp.
Podsumowanie
Warto wspomnieć, że ARC cache przechowuje w RAM najczęściej używane dane. Oznacza to, że dostęp do tych danych nie jest opóźniony procesami deduplikacji i dekompresji. Dane są dostępne od razu w praktyce bez żadnych opóźnień.
Dodam też, że wszystkie wprowadzone zmiany zmiany na Dataset zaczynają działać od następnego zapisu. Czyli, jeżeli zmienimy jakieś ustawienia odnośnie kompresji czy deduplikacji każdy następny zapis będzie wykonywany zgodnie z nowymi ustawieniami. Nie odpala żaden automatyczny procesu konwersji danych w tle czy czegoś podobnego. Ze tego co wiem, choć nie mam pewności, najprostszym sposobem na deduplikację lub kompresję istniejących danych po zmianie ustawień to ponowne ich tam wgranie. Po prostu przenosimy je na inny Dataset i przenosimy z powrotem. W ten sposób dane zostaną przemielone przez mechanizmy zapisujące deduplikacji i kompresji. To samo jeżeli zaszła by potrzeba de-deduplikacji czy de-kompresji danych na dyskach. Procesy deduplikacji czy kompresji raz zapisanych danych są w prost nie odwracalne.
Na szczęście zmiany ustawień kompresji i deduplikacji są „wstecznie kompatybilne”. Chodzi o to, że możemy zmieniać ustawienia nowo zapisywanych danych a dane zapisane wcześniej w innych ustawieniach odczytywane będą bez problemu niezależnie od aktualnych ustawień zapisu.
Jeżeli chodzi o uniwersalne przewidywanie efektywności deduplikacji i kompresji .. cóż to jest po prostu nie możliwe ponieważ nie ma jednego reprezentatywnego zestawu danych, każdy ma inny zestaw danych, a skuteczność tych mechanizmów zależy głównie od przechowywanych danych.
Jeszcze jedna uwaga, to pewnie jest jasne ale dla porządku powiem, że zarówno kompresja jak i deduplikacja odbywa się na poziomie serwera oznacza to, że dane najpierw muszą tam dotrzeć zanim zostaną przeanalizowane. Jeżeli wąskim gardłem jest łącze internetowe to żaden z przedstawionych mechanizmów na serwerze nie przyspieszy nam zapisu ani odczytu anie nie zredukuje ilości przesyłanych danych.
Podsumowując deduplikacje i kompresję w ZFS znowu trzeba by powiedzieć, że to fajne rozwiązania ale jak zwykle trzeba przede wszystkim rozumieć co się robi zanim się zacznie klikać na produkcyjnej maszynce. Włączanie „na pałę” tych funkcji co prawda nie powinno nic zepsuć ale może po prostu znacznie spowolnić nam serwer.
ZAPRASZAM DO OGLĄDANIA
Przydanet polecenia
Symulacja korzyści z deduplikacji
zdb -U /data/zfs/zpool.cache -S [nazwa pool]
Stan deduplikacji
zpool list [nazwa pool]