Przejrzysty system plików kompresji w połączeniu z ext4

26

Próbuję przetestować projekt, który wymaga skompresowanej pamięci masowej przy użyciu systemu plików ext4, ponieważ aplikacja, której używam, opiera się na funkcjach ext4.

Czy są dostępne jakieś rozwiązania produkcyjne / stabilne do przezroczystej kompresji na ext4?

Co próbowałem:

Ext4 ponad wolumin ZFS z włączoną kompresją. To faktycznie miało negatywny wpływ. Próbowałem utworzyć wolumin ZFS z włączoną kompresją lz4 i stworzyć system plików ext4 na / dev / zvol / ... ale wolumin zfs pokazał dwukrotnie rzeczywiste użycie, a kompresja nie wydawała się mieć żadnego efektu.

# du -hs /mnt/test
**1.1T**    /mnt/test
# zfs list
NAME        USED  AVAIL  REFER  MOUNTPOINT
pool       15.2T  2.70G   290K  /pool
pool/test  15.2T  13.1T  **2.14T**  -

Polecenia tworzenia ZFS

zpool create pool raidz2 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde2 /dev/sdf1 /dev/sdg1 /dev/sdh2 /dev/sdi1
zfs set recordsize=128k pool
zfs create -p -V15100GB pool/test
zfs set compression=lz4 pool/test
mkfs.ext4 -m1 -O 64bit,has_journal,extents,huge_file,flex_bg,uninit_bg,dir_nlink /dev/zvol/pool/test

Fusecompress: Wydaje się, że działa, ale nie jest w 100% stabilny. Poszukuję alternatyw.

LessFS: Czy można używać Lessfs w połączeniu z ext4? Nie próbowałem jeszcze, ale byłbym zainteresowany wglądem użytkowników.

Jeden główny problem: nieprawdziwa przejrzystość

Problem, który widziałem w przypadku fusecompress, to kwoty. Na przykład, jeśli włączyłem kompresję w systemie plików, chciałbym, aby mój system skorzystał z kompresji, niekoniecznie użytkownika końcowego. Gdybym włączył limit 1 GB dla użytkownika o współczynniku kompresji 1,5, byłby on w stanie przesłać 1,5 GB danych zamiast 1 GB danych, a system korzystałby z kompresji. To również wydawało się pokazywać na df-h. Czy istnieje rozwiązanie, aby kompresja była przezroczysta dla kwot?

użytkownik235918
źródło
Pewnie. Czy możesz podać listę OS / dystrybucji / wersji i szczegóły dotyczące charakteru danych, które zamierzasz przechowywać?
ewwhite
Również szczegóły sprzętu.
ewwhite
1
@ewwhite 8x3TB w oprogramowaniu RAID6. Dane będą rsynchronizowane kopiami zapasowymi z innych serwerów, więc mieszane typy danych i różni użytkownicy końcowi, dokumenty itp. CentOS 6.5 x64.
user235918,
Czy na pewno tego potrzebujesz? Czy masz wiele dużych, rzadkich plików? Miejsce na dysku jest obecnie tanie.
Andrew Schulman,
@AndrewSchulman: Wykorzystanie kompresji jest lepszą metodą z moich obliczeń. Koszt dodatkowych dysków i kontrolerów, które je obsługują, jest wyższy niż koszt procesora.
user235918,

Odpowiedzi:

27

Używam ZFS w systemie Linux jako menedżera woluminów i jako środek zapewniający dodatkową ochronę i funkcjonalność tradycyjnym systemom plików. Obejmuje to dostarczanie migawek na poziomie bloków, replikacji, deduplikacji, kompresji i zaawansowanego buforowania w systemach plików XFS lub ext4.

Zobacz: https://pthree.org/2012/12/21/zfs-administration-part-xiv-zvols/ w celu uzyskania innego wyjaśnienia.

W moim najczęstszym przypadku wykorzystuję funkcję Zvol ZFS, aby utworzyć rzadki wolumin na istniejącym Zpool. To właściwości zvola można ustawić tak jak normalny system plików ZFS. W tym momencie możesz ustawić właściwości takie jak typ kompresji, rozmiar woluminu, metoda buforowania itp.

Utworzenie tego zvola stanowi dla Linuksa urządzenie blokowe, które można sformatować w wybranym systemie plików. Użyj fdisklub, partedaby utworzyć partycję i mkfsgotowy wolumin.

Zamontuj to, a zasadniczo masz system plików wspierany przez Zvol i wszystkie jego właściwości.


Oto mój obieg pracy ...

Utwórz zpool składający się z czterech dysków:
Będziesz potrzebować ashift=12dyrektywy dla rodzaju używanych dysków. W tym przypadku nazwa zpool to „vol0”.

zpool create -o ashift = 12 -f vol0 mirror scsi-AccOW140403AS1322043 scsi-AccOW140403AS1322042 mirror scsi-AccOW140403AS1322013 scsi-AccOW140403AS1322044

Ustaw początkowe ustawienia Zpool:
Ustawiam autoexpand=onna poziomie Zpool na wypadek, gdyby kiedykolwiek wymieniłem dyski na większe dyski lub rozszerzę pulę w ustawieniach serwerów lustrzanych ZFS . Zazwyczaj nie używam ZFS raidz1 / 2/3 z powodu niskiej wydajności i niemożności rozszerzenia zpool.

zpool set autoexpand=on vol0

Ustaw początkowe właściwości systemu plików ZFS:
użyj lz4algorytmu kompresji dla nowych instalacji ZFS. Można pozostawić to włączone cały czas.

zfs set compression=lz4 vol0
zfs set atime=off vol0

Utwórz Zvol ZFS:
W przypadku ZFS w systemie Linux bardzo ważne jest, aby używać dużego rozmiaru bloku. -o volblocksize=128kjest tu absolutnie niezbędny. Ta -sopcja tworzy rzadki zvol i nie zużywa miejsca w puli, dopóki nie będzie potrzebne. Możesz tu przesadzić, jeśli dobrze znasz swoje dane. W tym przypadku mam około 444 GB dostępnego miejsca na dysku w puli, ale prezentuję wolumin 800 GB dla XFS.

zfs create -o volblocksize=128K -s -V 800G vol0/pprovol

Urządzenie zvol partycji:
( powinno być / dev / zd0 dla pierwszego zvol; / dev / zd16, / dev / zd32 itp. Dla kolejnych zvoli )

fdisk /dev/zd0 # (create new aligned partition with the "c" and "u" parameters)

Utwórz i zamontuj system plików:
mkfs.xfs lub ext4 na nowo utworzonej partycji, / dev / zd0p1.

mkfs.xfs -f -l size=256m,version=2 -s size=4096 /dev/zd0p1

Chwyć UUID blkidi zmodyfikuj /etc/fstab.

UUID=455cae52-89e0-4fb3-a896-8f597a1ea402 /ppro       xfs     noatime,logbufs=8,logbsize=256k 1 2

Zamontuj nowy system plików.

mount /ppro/

Wyniki ...

[root@Testa ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sde2        20G  8.9G  9.9G  48% /
tmpfs            32G     0   32G   0% /dev/shm
/dev/sde1       485M   63M  397M  14% /boot
/dev/sde7       2.0G   68M  1.9G   4% /tmp
/dev/sde3        12G  2.6G  8.7G  24% /usr
/dev/sde6       6.0G  907M  4.8G  16% /var
/dev/zd0p1      800G  398G  403G  50% /ppro  <-- Compressed ZFS-backed XFS filesystem.
vol0            110G  256K  110G   1% /vol0

Lista systemów plików ZFS.

[root@Testa ~]# zfs list
NAME           USED  AVAIL  REFER  MOUNTPOINT
vol0           328G   109G   272K  /vol0
vol0/pprovol   326G   109G   186G  -   <-- The actual zvol providing the backing for XFS.
vol1           183G   817G   136K  /vol1
vol1/images    183G   817G   183G  /images

Lista Zpool ZFS.

[root@Testa ~]# zpool list -v
NAME   SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
vol0   444G   328G   116G    73%  1.00x  ONLINE  -
  mirror   222G   164G  58.1G         -
    scsi-AccOW140403AS1322043      -      -      -         -
    scsi-AccOW140403AS1322042      -      -      -         -
  mirror   222G   164G  58.1G         -
    scsi-AccOW140403AS1322013      -      -      -         -
    scsi-AccOW140403AS1322044      -      -      -         -

Właściwości ZFS zvol ( Należy wziąć pod uwagę referenced, compressratioivolsize ).

[root@Testa ~]# zfs get all vol0/pprovol
NAME          PROPERTY               VALUE                  SOURCE
vol0/pprovol  type                   volume                 -
vol0/pprovol  creation               Sun May 11 15:27 2014  -
vol0/pprovol  used                   326G                   -
vol0/pprovol  available              109G                   -
vol0/pprovol  referenced             186G                   -
vol0/pprovol  compressratio          2.99x                  -
vol0/pprovol  reservation            none                   default
vol0/pprovol  volsize                800G                   local
vol0/pprovol  volblocksize           128K                   -
vol0/pprovol  checksum               on                     default
vol0/pprovol  compression            lz4                    inherited from vol0
vol0/pprovol  readonly               off                    default
vol0/pprovol  copies                 1                      default
vol0/pprovol  refreservation         none                   default
vol0/pprovol  primarycache           all                    default
vol0/pprovol  secondarycache         all                    default
vol0/pprovol  usedbysnapshots        140G                   -
vol0/pprovol  usedbydataset          186G                   -
vol0/pprovol  usedbychildren         0                      -
vol0/pprovol  usedbyrefreservation   0                      -
vol0/pprovol  logbias                latency                default
vol0/pprovol  dedup                  off                    default
vol0/pprovol  mlslabel               none                   default
vol0/pprovol  sync                   standard               default
vol0/pprovol  refcompressratio       3.32x                  -
vol0/pprovol  written                210M                   -
vol0/pprovol  snapdev                hidden                 default
ewwhite
źródło
Po co partycjonować Zvol? Czy nie można tego użyć bezpośrednio?
Michael Hampton
3
@MichaelHampton Głównie dla wyrównania i spójności. Chcę też elastyczności, jeśli zwiększę objętość. Jest tu kilka warstw abstrakcji. Jest podobny do argumentu używania /dev/sdbkontra /dev/sdb1.
ewwhite
1
Dziękuję za informację. Wiele dobrych porad tutaj. Mam zamiar to przetestować.
user235918,
2
@MichaelHampton BTW, obecnie nie dzielę się już na partycje ... szczególnie z maszynami wirtualnymi.
ewwhite
1
Czy możesz powiedzieć o dodatkowych kosztach zasobów dla warstwy ZFS w tej konfiguracji (RAM, procesor)?
Sz.
4

Musisz także włączyć odrzucanie w systemie plików ext4. Bez odrzucania, zfs nie odzyskuje miejsca po usunięciu plików. Może to prowadzić do dużych rozbieżności w przestrzeni między raportami systemu plików ext4 a raportami woluminu ZFS.

Devon
źródło
4
Red Hat nie zaleca robienia tego online z opcją montażu discard (z ext4 lub xfs), ponieważ ma to wpływ na wydajność. Od czasu do czasu uruchamianie fstrimpolecenia jest czystsze .
ewwhite
komentarz na temat odrzucania montowań wpływających na wydajność: dotyczy to starych dysków SSD niskiej jakości. Nie dotyczy to nowszych.
Stoat