Kompresja

Kompresja Systemów Plików

Przezroczysta kompresja w nowoczesnych systemach plików takich jak NTFS, ZFS i Btrfs.

System Plików: Organizacja Danych na Nośniku

Przed omówieniem kompresji trzeba określić rolę . Jest to warstwa oprogramowania systemu operacyjnego, takiego jak Windows, macOS lub Linux, która opisuje sposób przechowywania i odczytu danych. Sam dysk twardy lub dysk SSD przechowuje ciągi bitów i nie interpretuje pojęć "plik" oraz "folder".

System plików utrzymuje metadane i odwzorowania bloków, w tym nazwy plików, ich położenie, rozmiary, uprawnienia oraz inne atrybuty. Podczas zapisu dokumentu wybiera dostępne miejsce, zapisuje dane i aktualizuje te struktury. Podczas otwierania pliku odczytuje metadane, wyznacza odpowiednie bloki i przekazuje dane aplikacji. Aplikacje operują więc na logicznej strukturze plików i katalogów niezależnie od fizycznego układu danych.

Wraz ze wzrostem ilości danych, od zdjęć i filmów po dokumenty oraz pliki systemu operacyjnego, rośnie znaczenie zajętej przestrzeni. To uzasadnia włączenie kompresji do warstwy systemu plików, tak aby ograniczyć liczbę zapisywanych bajtów bez zmiany interfejsu widocznego dla aplikacji. System operacyjny nadal udostępnia aplikacji logiczne bloki i rozmiar pliku, a mapowanie na bloki fizyczne pozostaje szczegółem implementacji. Kompresja może także zmniejszyć ilość danych przesyłanych między pamięcią operacyjną a nośnikiem.

Kompresja Ręczna i Przezroczysta

Kompresja ręczna odbywa się poza systemem plików. Użytkownik wybiera pliki lub katalogi, uruchamia program taki jak WinRAR albo 7-Zip lub funkcję "Skompresuj do pliku ZIP" i otrzymuje pojedyncze archiwum, na przykład archiwum.ziparchiwum.zip. Dostęp do zawartości wymaga otwarcia albo zdekompresowania archiwum przez użytkownika. Operacja jest jawna i ma własny format wyjściowy.

Kompresja w systemie plików może działać jako . System kompresuje dane podczas zapisu i dekompresuje je przy odczycie. Aplikacje otrzymują tę samą logiczną zawartość, więc nie muszą znać fizycznego formatu bloków. W zależności od systemu kompresja jest włączana dla całego systemu plików, zbioru danych, katalogu, pliku albo przez opcję montowania. Zakres ustawienia określa, które nowe dane zostaną skompresowane i jak traktowane są istniejące bloki.

Przebieg operacji można opisać następująco:

  1. Użytkownik zapisuje dokument w edytorze tekstu.
  2. System plików otrzymuje dane przed ich fizycznym zapisaniem na nośniku.
  3. Uruchamia wybrany algorytm kompresji dla odpowiedniego fragmentu danych.
  4. Zapisuje wersję skompresowaną, jeśli daje ona oszczędność miejsca, albo zachowuje fragment nieskompresowany. Użytkownik i edytor widzą tylko poprawnie zapisany plik.
  5. Później, gdy użytkownik klika dwukrotnie dokument, aby go otworzyć, system plików przechwytuje żądanie odczytu.
  6. Odczytuje skompresowane dane z dysku.
  7. Uruchamia algorytm dekompresji dla skompresowanych fragmentów w pamięci.
  8. Przekazuje odtworzone dane do edytora tekstu, który otwiera dokument w zwykły sposób.

Z perspektywy aplikacji plik zachowuje nazwę, logiczny rozmiar i sposób otwierania. Różnica dotyczy fizycznego miejsca zajmowanego na nośniku. System musi jednak prowadzić metadane pozwalające rozróżnić fragmenty skompresowane i nieskompresowane oraz odtworzyć kolejność danych. Wpływ na czas operacji zależy od stopnia kompresji, rodzaju urządzenia i obciążenia systemu.

Wpływ Kompresji na Wydajność

Kompresja i dekompresja wymagają dodatkowych operacji procesora, lecz ich wpływ na czas wykonania zależy od urządzenia oraz obciążenia. W wielu zadaniach ograniczeniem jest , czyli przewaga czasu odczytu lub zapisu nad czasem przetwarzania.

Procesor wykonuje miliardy operacji na sekundę, podczas gdy opóźnienia i przepustowość nośnika są ograniczone. Popularne uproszczenie mówi o tysiącach razy mniejszej szybkości SSD i milionach razy mniejszej szybkości dysku talerzowego względem pracy procesora, lecz wartości zależą od operacji i sprzętu. Przy otwieraniu dużego pliku część czasu procesor oczekuje na dane z urządzenia pamięci masowej.

Przezroczysta kompresja może wykorzystać tę różnicę, gdy koszt obliczeń jest mniejszy od oszczędności na transferze. Odczyt i zapis tego samego pliku mogą mieć różny wynik, ponieważ dekompresja zwykle jest prostsza niż kompresja, a dane mogą mieć różną podatność na skrócenie.

  • Podczas odczytu pliku system pobiera mniej danych z nośnika, po czym dekompresuje je w pamięci. Jeżeli oszczędność transferu przewyższa koszt obliczeń, skraca się czas oczekiwania. Na szybkim SSD lub przy słabo kompresowalnych danych wynik może być neutralny albo gorszy, dlatego nie należy zakładać automatycznego przyspieszenia. Znaczenie ma także rozmiar jednostki I/O i możliwość równoległego odczytu wielu fragmentów.
  • Podczas zapisu pliku procesor kompresuje dane przed ich zapisaniem. Zapis mniejszej liczby bajtów może ograniczyć operacje I/O, lecz sam etap kompresji zwiększa obciążenie i może wydłużyć operację przy szybkim nośniku. Zysk pojemności pozostaje niezależny od tego bilansu czasowego. Przy częstych modyfikacjach małych fragmentów trzeba dodatkowo uwzględnić koszt ponownego zapisu jednostki kompresji.

Kompresja wymienia część czasu procesora na mniejszy transfer danych. Dla obciążeń z dużą liczbą odczytów może to być korzystne, lecz decyzję trzeba ocenić na podstawie pomiarów konkretnego nośnika i danych.

Implementacje: NTFS, ZFS i Btrfs

Przezroczysta kompresja jest funkcją kilku systemów plików, lecz szczegóły zależą od implementacji. NTFS, OpenZFS i Btrfs różnią się algorytmami, jednostką kompresji, obsługą zapisu oraz konfiguracją.

Kompresja NTFS: Mechanizm w Systemie Windows

NTFS (New Technology File System) jest podstawowym systemem plików Microsoft Windows od dziesięcioleci. Udostępnia kompresję plików i katalogów przez interfejs systemu oraz polecenie compact. W interfejsie graficznym można zaznaczyć opcję "Kompresuj zawartość, aby zaoszczędzić miejsce na dysku". Obsługa zależy od parametrów woluminu, między innymi od rozmiaru klastra, oraz od wybranych atrybutów pliku. Kompresja NTFS nie jest tym samym mechanizmem co kompresja wykonywalnych plików Compact OS.

Jak to działa: NTFS używa formatu LZNT1, należącego do rodziny LZ77 używanej także w formatach archiwów. Dane pliku są przetwarzane porcjami. Plik jest dzielony na , czyli bloki 16 klastrów. Klaster jest najmniejszą jednostką alokacji, zwykle o rozmiarze 4 KB. NTFS próbuje kompresować każdą jednostkę osobno i zapisuje wynik, gdy oszczędność wynosi co najmniej jeden klaster. W przeciwnym razie dana jednostka pozostaje nieskompresowana. Każda decyzja dotyczy więc pełnej jednostki 16 klastrów.

Kompromisy:

  • Zalety: Funkcja jest dostępna w systemie Windows i można ją włączyć dla pliku lub katalogu. Aplikacje korzystają z pliku przez zwykły interfejs systemowy.
  • Wady: Współczynnik kompresji bywa umiarkowany względem nowszych algorytmów. Modyfikacja małego fragmentu może wymagać odczytania całej jednostki, jej dekompresji, zmiany, ponownej kompresji i zapisu. Taki cykl odczyt-modyfikacja-zapis zwiększa koszt zapisu. Jeśli wynik nie mieści się w dotychczas przydzielonym miejscu, alokacja może zostać zmieniona, co sprzyja .

ZFS i Btrfs: Kompresja Inline

ZFS, pierwotnie opracowany przez Sun Microsystems, oraz Btrfs, system plików B-drzewa dla Linuksa, obsługują przezroczystą kompresję inline. Ich mechanizmy alokacji i konfiguracji nie są jednak identyczne. OpenZFS kompresuje rekordy zbioru danych, natomiast Btrfs dzieli dane na ekstenty i może ustawiać algorytm dla pliku lub punktu montowania.

Jak to działa: Kompresja inline odbywa się podczas zapisu, przed przydzieleniem trwałych bloków. Jest zintegrowana z architekturą . Przy modyfikacji nowe, skompresowane ekstenty mogą zostać zapisane w innym miejscu, a metadane wskazują nową wersję. Ogranicza to część operacji odczyt-modyfikacja-zapis, lecz liczba ekstentów i fragmentacja nadal zależą od danych oraz sposobu alokacji.

Istotna jest także konfiguracja algorytmu. W ZFS wybiera się go zwykle dla zbioru danych, natomiast Btrfs pozwala ustawić kompresję między innymi opcją montowania lub właściwością pliku:

  • LZ4: OpenZFS oferuje ten szybki algorytm jako typowy wybór dla zbiorów danych. Zapewnia umiarkowany stopień kompresji przy małym koszcie obliczeń. Btrfs nie używa LZ4 jako jednego ze swoich podstawowych algorytmów kompresji.
  • Zstandard (zstd): Algorytm o regulowanym poziomie kompresji, dostępny w OpenZFS oraz Btrfs. Wyższy poziom zwykle zwiększa oszczędność miejsca kosztem czasu procesora. Wynik zależy od rodzaju danych, więc nie ma jednego poziomu odpowiedniego dla każdego obciążenia.
  • Gzip: OpenZFS udostępnia warianty od gzip-1 dla szybszej kompresji do gzip-9 dla większej oszczędności miejsca. Btrfs udostępnia algorytm ZLIB z poziomami od 1 do 9, spokrewniony z formatem deflate, lecz nie jest to interfejs Gzip.
  • LZO: Btrfs udostępnia ten starszy algorytm nastawiony na szybkość i mniejszy stopień kompresji. Nie jest on standardowym algorytmem OpenZFS.

Obie implementacje stosują heurystyki lub progi zapisu, które mogą pozostawić słabo kompresowalny fragment nieskompresowany. Dotyczy to między innymi danych JPEG. Szczegółowy próg zależy od systemu, rozmiaru rekordu lub ekstentu i wybranego algorytmu. Taki wybór ogranicza koszt obliczeń dla danych, w których kompresja nie daje wymaganej oszczędności.

Uwagi i Praktyka

Kompresowanie Danych Już Skompresowanych

Kompresja systemu plików zwykle daje mały efekt dla danych już skompresowanych. Dotyczy to większości plików multimedialnych (JPEG, MP3, wideo MP4) oraz archiwów (ZIP, RAR), które wcześniej usunęły znaczną część przewidywalności.

Wyspecjalizowane kodeki i formaty usunęły już dużą część redundancji, więc dane mogą wyglądać losowo dla algorytmu ogólnego przeznaczenia. Ponowna próba kompresji może zużyć czas procesora bez oszczędności. W skrajnym przypadku wynik staje się nieco większy z powodu metadanych formatu. System plików może pominąć taki fragment, lecz ustawienie kompresji dla katalogu warto dobrać po pomiarze i uwzględnieniu rodzaju zawartości.

Kiedy Kompresja Systemu Plików Ma Sens?

Kompresja systemu plików może być korzystna dla danych ustrukturyzowanych i powtarzalnych, które nie zostały wcześniej skompresowane. Przykłady obejmują:

  • Dokumenty Tekstowe i E-booki: Język pisany jest pełen powtarzających się słów i wzorców.
  • Pliki Programów i Systemu Operacyjnego: Pliki wykonywalne i biblioteki mogą zawierać powtarzalne fragmenty. Kompresja może ograniczyć zajęte miejsce, lecz wpływ na uruchamianie zależy od nośnika i konfiguracji.
  • Pliki Bazy Danych: Surowe pliki bazy danych bywają kompresowalne. Mniejszy transfer może skrócić zapytania I/O, lecz trzeba uwzględnić obciążenie procesora i kompresję realizowaną już przez samą bazę.
  • Obrazy Dysków Maszyn Wirtualnych: Obrazy dysków maszyn wirtualnych mogą zawierać puste lub powtarzalne bloki, więc często nadają się do kompresji, szczególnie gdy format obrazu nie kompresuje ich wcześniej.

Przezroczysta kompresja służy przede wszystkim ograniczeniu zajętej pojemności i liczby przesyłanych bajtów. Włączenie jej dla ZFS lub Btrfs wymaga sprawdzenia stopnia kompresji, kosztu procesora, opóźnienia zapisu oraz sposobu wykonywania kopii i migawek. Pomiar konkretnego obciążenia jest bezpieczniejszą podstawą konfiguracji niż ogólne założenie o przyspieszeniu. Warto mierzyć osobno odczyt, zapis, zajętą przestrzeń i zachowanie po zmianie algorytmu dla danego systemu plików, także przy migawkach, kopiach zapasowych i częstych aktualizacjach. Te same pomiary ujawniają dodatkowe metadane, wzrost liczby ekstentów i większą liczbę zapisów fizycznych przy długotrwałym obciążeniu oraz równoległych operacjach. Pozwalają też sprawdzić, czy oszczędność utrzymuje się przy mieszanym obciążeniu odczytem, zapisem i operacjami na migawkach.

Powiązane artykuły