Frage Transparentes Kompressions-Dateisystem in Verbindung mit ext4


Ich versuche, ein Projekt zu testen, das komprimierten Speicher mit dem ext4-Dateisystem benötigt, da die Anwendung, die ich verwende, auf ext4-Funktionen beruht.

Gibt es Production / Stable-Lösungen für eine transparente Kompression auf ext4?

Was ich versucht habe:

Ext4 über ZFS-Volume mit aktivierter Komprimierung Dies hatte tatsächlich eine nachteilige Wirkung. Ich habe versucht, ein ZFS-Volume mit aktivierter lz4-Komprimierung zu erstellen und ein ext4-Dateisystem auf / dev / zvol / ... zu erstellen, aber das zfs-Volume zeigte die doppelte Nutzung und die Komprimierung schien keine Wirkung 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:  Schien zu arbeiten, aber nicht 100% stabil. Auf der Suche nach Alternativen.

LessFS:  Ist es möglich, Lessfs in Verbindung mit ext4 zu verwenden? Ich habe es noch nicht ausprobiert, wäre aber an Benutzereinblicken interessiert.

Ein großes Problem: nicht wahre Transparenz

Ein Problem, das ich mit fusecompress sah, waren Quoten. Wenn ich beispielsweise die Komprimierung für das Dateisystem aktiviert habe, 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 aktiviert hätte, wären sie in der Lage, 1,5 GB Daten anstatt 1 GB Daten hochzuladen, und das System profitiert von der Komprimierung. Dies schien auch auf df-h zu zeigen. Gibt es eine Lösung, um die Komprimierung für Quoten transparent zu machen?


25
2017-08-04 00:49


Ursprung


Sicher. Können Sie bitte die OS / Distro / Version und Details über die Art der Daten, die Sie speichern möchten, auflisten? - ewwhite
Auch Hardware-Details. - ewwhite
@ewwhite 8x3TB in einer Software RAID6. Daten werden rsynced Backups von anderen Servern so gemischte Datentypen und verschiedene Endbenutzer, Dokumente, etc. 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: Die Komprimierung ist die bessere Methode aus meiner Berechnung. Die Kosten für zusätzliche Festplatten und Controller, die sie unterstützen, sind höher als die CPU-Kosten. - user235918


Antworten:


ich benutze ZFS unter Linux als Volume-Manager und Mittel, um traditionellen Dateisystemen zusätzlichen Schutz und Funktionalität zu bieten. Dazu gehören Snapshots auf Blockebene, Replikation, Deduplizierung, Komprimierung und Erweitertes Caching zu den XFS- oder ext4-Dateisystemen.

Sehen: https://pthree.org/2012/12/21/zfs-administration-part-xiv-zvols/ für eine andere Erklärung.

In meinem häufigsten Anwendungsfall nutze ich die Funktion ZFS zvol, um ein Sparse-Volume auf einem vorhandenen zpool zu erstellen. Diese Eigenschaften von zvol können wie normale ZFS-Dateisysteme eingestellt werden. An dieser Stelle können Sie Eigenschaften wie Komprimierungstyp, Volume-Größe, Caching-Methode usw. festlegen.

Durch die Erstellung dieses zvol wird Linux ein Blockgerät bereitgestellt, das mit dem Dateisystem Ihrer Wahl formatiert werden kann. Benutzen fdisk oder parted um deine Partition zu erstellen und mkfs das fertige Volumen.

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


Hier ist mein Workflow ...

Erstellen Sie einen Zpool, der aus vier Festplatten besteht:
Du wirst das wollen ashift=12 Direktive für die Art von Festplatten, die Sie verwenden. Der Name zpool lautet in diesem Fall "vol0".

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

Legen Sie die anfänglichen zpool-Einstellungen fest:
ich setze autoexpand=on auf der zpool - Ebene für den Fall, dass ich die Festplatten durch größere Laufwerke ersetzen oder erweitern Sie den Pool in einem ZFS-Spiegel Konfiguration. Normalerweise verwende ich ZFS raidz1 / 2/3 wegen der schlechten Leistung und der Unfähigkeit, den zpool zu erweitern.

zpool set autoexpand=on vol0

Legen Sie die anfänglichen zfs-Dateisystemeigenschaften fest:
Bitte benutzen Sie die lz4 Komprimierungsalgorithmus für neue ZFS-Installationen. Es ist okay, es die ganze Zeit zu lassen.

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

Erstellen Sie ZFS zvol:
Für ZFS unter Linux ist es sehr wichtig, dass Sie eine große Blockgröße verwenden. -o volblocksize=128k ist hier absolut notwendig. Das -s Die Option erstellt ein spärliches zvol und verbraucht keinen Pool-Speicherplatz, bis es benötigt wird. Sie können hier zu weit kommen, wenn Sie Ihre Daten gut kennen. In diesem Fall habe ich ungefähr 444 GB nutzbaren Speicherplatz im Pool, aber ich präsentiere ein 800 GB großes Volume für XFS.

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

Partition zvol Gerät:
(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 und mounten Sie das Dateisystem:
mkfs.xfs oder ext4 auf der neu erstellten Partition / dev / zd0p1.

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

Besorgen Sie sich die UUID mit blkid und modifizieren /etc/fstab.

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

Mounten Sie das neue Dateisystem.

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

ZFS-Dateisystemauflistung.

[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 (nimm zur Kenntnis referenced, compressratio und volsize).

[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

26
2017-08-04 14:20



Warum Partitionierung der Zvol? Kann es nicht einfach direkt benutzt werden? - Michael Hampton♦
@MichaelHampton Hauptsächlich für Ausrichtung und Konsistenz. Außerdem möchte ich Flexibilität, wenn ich das zugrunde liegende Volumen erweitern. Hier gibt es mehrere Abstraktionsschichten. Es ist ähnlich dem Argument der Verwendung /dev/sdb gegen /dev/sdb1. - ewwhite
Vielen Dank für Ihre Informationen. Hier gibt es viele gute Tipps. Ich werde es ausprobieren. - user235918
@MichaelHampton BTW, heutzutage partitioniere ich nicht mehr ... vor allem mit virtuellen Maschinen. - ewwhite
Verwenden Sie weiterhin 128K volblocksize? Bei einer so großen Blockgröße löst jede kleine (dh 4K) Schreiboperation eine Lese-Modifiziere-Prüfsumme-Schreiboperation aus, bei der I / O-Bandbreite verschwendet wird. Gibt es bestimmte Gründe, eine so große Blockgröße zu verwenden? - shodanshok


Sie müssen auch die Option "Verwerfen" im ext4-Dateisystem aktivieren. Ohne Verwerfen wird von zfs der Speicherplatz nicht zurückgenommen, wenn Dateien entfernt werden. Dies kann zu großen Diskrepanzen zwischen den Berichten des ext4-Dateisystems und den zfs-Volumenberichten führen.


3
2017-08-14 05:32



Red Hat empfiehlt nicht, dies online mit der Option zum Verwerfen von Ablehnungen (mit ext4 oder xfs) zu tun, da sich dies auf die Leistung auswirkt. Es ist sauberer, regelmäßig zu laufen fstrimBefehl. - ewwhite
Wenn der Kommentar zu den Auswirkungen der Ablagehalterung sich auf die Leistung auswirkt, gilt dies auch für alte, minderwertige SSDs. Es ist nicht wahr mit neueren. - Stoat