Transparentes Komprimierungsdateisystem in Verbindung mit ext4


26

Ich versuche, ein Projekt zu testen, das komprimierten Speicher benötigt, indem ich das ext4-Dateisystem verwende, da die von mir verwendete Anwendung auf ext4-Funktionen basiert.

Gibt es produktionssichere / stabile Lösungen für die transparente Komprimierung auf ext4?

Was ich ausprobiert habe:

Ext4 über ZFS-Volume mit aktivierter Komprimierung. Dies hatte tatsächlich einen negativen Einfluss. Ich habe versucht, ein ZFS-Volume mit aktivierter lz4-Komprimierung zu erstellen und ein ext4-Dateisystem unter / dev / zvol / ... zu erstellen, aber das zfs-Volume zeigte die doppelte tatsächliche Nutzung, und die Komprimierung schien keine Auswirkungen zu haben.

# 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**  -

ZFS-Erstellungsbefehle

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: Scheint zu funktionieren, ist aber nicht 100% stabil. Alternativen suchen.

LessFS: Ist es möglich Lessfs in Verbindung mit ext4 zu verwenden? Ich habe es noch nicht ausprobiert, würde mich aber für User Insight interessieren.

Ein Hauptproblem: keine echte Transparenz

Ein Problem, das ich bei Fusecompress sah, waren Quoten. Wenn ich zum Beispiel die Komprimierung im Dateisystem aktiviere, möchte ich, dass mein System von der Komprimierung profitiert, nicht unbedingt der Endbenutzer. Wenn ich ein Kontingent von 1 GB für einen Benutzer mit einer Komprimierungsrate von 1,5 aktivieren würde, wäre er in der Lage, 1,5 GB Daten anstelle von 1 GB Daten hochzuladen, und das System würde von der Komprimierung profitieren. Dies schien sich auch auf df -h zu zeigen. Gibt es eine Lösung, um die Komprimierung für Quoten transparent zu machen?


Sicher. Können Sie bitte das Betriebssystem / die Distribution / die Version sowie Einzelheiten zur Art der Daten, die Sie speichern möchten, auflisten?
ewwhite

Auch Hardware-Details.
ewwhite

1
@ewwhite 8x3TB in einem Software-RAID6. Bei den Daten handelt es sich um rsynchrone Sicherungen von anderen Servern, also gemischten Datentypen und verschiedenen Endbenutzern, Dokumenten usw. CentOS 6.5 x64.
user235918

Bist du sicher, dass du das brauchst? Haben Sie viele große, spärliche Dateien? Speicherplatz ist heutzutage billig.
Andrew Schulman

@ AndrewSchulman: Ausnutzung der Komprimierung ist die bessere Methode aus meiner Berechnung. Die Kosten für zusätzliche Festplatten und Controller, die diese unterstützen, sind höher als die Kosten für die CPU.
user235918

Antworten:


27

Ich verwende ZFS unter Linux als Volume-Manager und als Mittel, um herkömmlichen Dateisystemen zusätzlichen Schutz und zusätzliche Funktionen zu bieten. Dies umfasst das Bringen von Snapshots, Replikation, Deduplizierung, Komprimierung und erweitertem Caching auf Blockebene in die XFS- oder ext4-Dateisysteme.

Weitere Erklärungen finden Sie unter: https://pthree.org/2012/12/21/zfs-administration-part-xiv-zvols/ .

In meinem häufigsten Anwendungsfall nutze ich die zvol-Funktion von ZFS, um ein spärliches Volume in einem vorhandenen zpool zu erstellen. Die Eigenschaften dieses ZVOL können genau wie die eines normalen ZFS-Dateisystems festgelegt werden. An dieser Stelle können Sie Eigenschaften wie Komprimierungstyp, Volume-Größe, Caching-Methode usw. festlegen.

Wenn Sie dieses zvol erstellen, wird Linux ein Block-Gerät angezeigt, das mit dem Dateisystem Ihrer Wahl formatiert werden kann. Verwenden Sie fdiskoder parted, um Ihre Partition und mkfsdas fertige Volume zu erstellen .

Hängen Sie dies ein und Sie haben im Wesentlichen ein Dateisystem, das von einem zvol mit all seinen Eigenschaften unterstützt wird.


Hier ist mein Workflow ...

Erstellen Sie einen Zpool, der aus vier Datenträgern besteht:
Sie möchten die ashift=12Direktive für den Typ von Datenträgern, den Sie verwenden. Der zpool-Name ist in diesem Fall "vol0".

zpool create -o ashift = 12 -f vol0 mirror

Festlegen der anfänglichen Zpool-Einstellungen:
Ich autoexpand=onstelle die Zpool-Ebene ein, falls ich jemals die Festplatten durch größere Laufwerke ersetzen oder den Pool in einem ZFS-Spiegelsetup erweitern möchte. Normalerweise verwende ich ZFS raidz1 / 2/3 nicht, weil die Leistung schlecht ist und der Zpool nicht erweitert werden kann.

zpool set autoexpand=on vol0

Festlegen der anfänglichen Eigenschaften
des ZFS- Dateisystems: Verwenden Sie den lz4Komprimierungsalgorithmus für neue ZFS-Installationen. Es ist in Ordnung, es die ganze Zeit eingeschaltet zu lassen.

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

ZFS erstellen zvol:
Für ZFS unter Linux ist es sehr wichtig, dass Sie eine große Blockgröße verwenden. -o volblocksize=128kist hier unbedingt erforderlich. Die -sOption erstellt ein spärliches zvol und belegt erst dann Speicherplatz im Pool, wenn er benötigt wird. Sie können hier ein Overcommit durchführen, wenn Sie Ihre Daten gut kennen. In diesem Fall habe ich ungefähr 444 GB nutzbaren Speicherplatz im Pool, aber ich präsentiere XFS ein 800 GB-Volume.

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

Partition zvol device:
( sollte / dev / zd0 für das erste zvol sein; / dev / zd16, / dev / zd32 usw. für nachfolgende zvols )

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

Erstellen Sie das Dateisystem:
mkfs.xfs oder ext4 und hängen Sie es in die neu erstellte Partition / dev / zd0p1 ein.

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

Nimm die UUID mit blkidund ändere sie /etc/fstab.

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

Hängen Sie das neue Dateisystem ein.

mount /ppro/

Ergebnisse...

[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

Auflistung des ZFS-Dateisystems.

[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

ZFS-Zpool-Liste.

[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      -      -      -         -

ZFS-ZVOL-Eigenschaften ( beachten Sie referenced, compressratioundvolsize ).

[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

Warum das Zvol aufteilen? Kann es nicht einfach direkt verwendet werden?
Michael Hampton

3
@MichaelHampton Hauptsächlich für die Ausrichtung und Konsistenz. Außerdem möchte ich Flexibilität, wenn ich das zugrunde liegende Volumen erweitere. Hier gibt es mehrere Abstraktionsebenen. Es ähnelt dem Argument der Verwendung von /dev/sdbversus /dev/sdb1.
Ewwhite

1
Vielen Dank für Ihre Informationen. Viele gute Ratschläge hier. Ich werde es ausprobieren.
user235918

2
@MichaelHampton Übrigens, heutzutage partitioniere ich nicht mehr ... besonders nicht mit virtuellen Maschinen.
Ewwhite

1
Können Sie bitte die zusätzlichen Ressourcenkosten für die ZFS-Schicht in diesem Setup (RAM, CPU) angeben?
Gr.

4

Sie müssen auch Discard im ext4-Dateisystem aktivieren. Ohne Discard gewinnt zfs den Speicherplatz nicht zurück, wenn Dateien entfernt werden. Dies kann zu großen Speicherplatzdiskrepanzen zwischen den Berichten des ext4-Dateisystems und den Berichten des zfs-Volumes führen.


4
Red Hat rät davon ab, dies online mit der Option zum Verwerfen des Ladevorgangs (mit ext4 oder xfs) zu tun, da sich dies auf die Leistung auswirkt. Es ist sauberer, den fstrimBefehl regelmäßig auszuführen .
Ewwhite

In dem Kommentar zu Discard-Mounts, die sich auf die Leistung auswirken, heißt es: Dies gilt für alte SSDs mit geringer Qualität. Bei neueren ist das nicht der Fall.
Stoat
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.