Beste Komprimierung für ZFS-Send / Recv


15

Ich sende inkrementelle ZFS-Snapshots über eine Punkt-zu-Punkt-T1-Linie, und wir sind an einem Punkt angelangt, an dem die Snapshots eines Tages kaum noch über die Leitung übertragen werden können, bevor die nächste Sicherung beginnt. Unser send / recv Befehl lautet:

zfs send -i tank/vm@2009-10-10 tank/vm@2009-10-12 | bzip2 -c | \
ssh offsite-backup "bzcat | zfs recv -F tank/vm"

Ich habe viele CPU-Zyklen zu sparen. Gibt es einen besseren Komprimierungsalgorithmus oder eine alternative Methode, mit der ich weniger Daten über die Leitung übertragen kann?


1
Haben Sie überprüft, ob der Link der langsamste Teil ist? Vielleicht ist es das Lesen / Schreiben der Festplatte.
kbyrd

Ja, ich bekomme 80-100 MBps, die über NFS mit der Box verbunden werden. Die Netzwerkverbindung ist 1,5 Mbit / s
Sysadminicus

3
Haben Sie versucht, lzma --best zu verwenden?
Amok

1
Wie Amuck betonte, ist LZMA derzeit der beste allgemein verfügbare Datenkomprimierungsalgorithmus.
Chris S

Zum Beispiel Statistiken, die zeigen, dass zfs receivedies ein Schuldiger sein kann:received 953MB stream in 36 seconds (26.5MB/sec)
Poige

Antworten:


2

Es hört sich so an, als hätten Sie die besten Komprimierungsmechanismen ausprobiert und sind immer noch durch die Leitungsgeschwindigkeit begrenzt. Angenommen, es kommt nicht in Frage, eine schnellere Verbindung herzustellen. Haben Sie darüber nachgedacht, die Sicherungen nur seltener auszuführen, damit mehr Zeit für die Ausführung bleibt?

Gibt es eine Möglichkeit, die zu schreibende Datenmenge zu verringern? Ohne zu wissen, wie Ihr Anwendungsstapel funktioniert, ist es schwer zu sagen, aber es kann hilfreich sein, nur dafür zu sorgen, dass Apps vorhandene Dateien überschreiben, anstatt neue zu erstellen. Und stellen Sie sicher, dass Sie keine Backups von temporären / Cache-Dateien speichern, die Sie nicht benötigen.


9

Ich habe gelernt, genau das zu tun, was Sie tun. Ich schlage vor, mbuffer zu verwenden. Beim Testen in meiner Umgebung hat es nur auf der Empfangsseite geholfen, ohne dass es beim Senden zu Verzögerungen kam, während der Empfang aufholte.

Einige Beispiele: http://everycity.co.uk/alasdair/2010/07/using-mbuffer-to-speed-up-slow-zfs-send-zfs-receive/

Homepage mit Optionen und Syntax http://www.maier-komor.de/mbuffer.html

Der Sendebefehl aus meinem Replikationsskript:

zfs send -i tank/pool@oldsnap tank/pool@newsnap | ssh -c arcfour remotehostip "mbuffer -s 128k -m 1G | zfs receive -F tank/pool"

Dadurch wird mbuffer auf dem Remote-Host als Empfangspuffer ausgeführt, sodass das Senden so schnell wie möglich erfolgt. Ich verwende eine 20-MBit-Leitung und habe festgestellt, dass es nicht hilfreich ist, auch einen MBuffer auf der Sendeseite zu haben. Außerdem verwendet meine Haupt-ZFS-Box den gesamten RAM als Cache. Wenn ich also auch nur 1 g MBuffer zur Verfügung habe, müsste ich einige Cache-Größen reduzieren.

Außerdem, und das ist nicht wirklich mein Fachgebiet, denke ich, ist es am besten, ssh die Komprimierung zu überlassen. In Ihrem Beispiel verwenden Sie vermutlich bzip und dann ssh, das standardmäßig die Komprimierung verwendet. Daher versucht SSH, einen komprimierten Stream zu komprimieren. Am Ende habe ich arcfour als Chiffre verwendet, da es die geringste CPU-Belastung hat und das war für mich wichtig. Möglicherweise erzielen Sie bessere Ergebnisse mit einer anderen Verschlüsselung, aber ich würde definitiv empfehlen, SSH die Komprimierung durchführen zu lassen (oder die ssh-Komprimierung zu deaktivieren, wenn Sie wirklich etwas verwenden möchten, das sie nicht unterstützt).

Was wirklich interessant ist, ist, dass die Verwendung von mbuffer beim Senden und Empfangen auf localhost die Dinge ebenfalls beschleunigt:

zfs send tank/pool@snapshot | mbuffer -s 128k -m 4G -o - | zfs receive -F tank2/pool

Ich fand, dass 4 g für lokale Hosttransfers der Sweetspot für mich zu sein scheint. Es zeigt nur, dass zfs send / receive Latenz oder andere Pausen im Stream nicht wirklich mag, um am besten zu funktionieren.

Nur meine Erfahrung, hoffe das hilft. Ich brauchte eine Weile, um das alles herauszufinden.


1
Vielen Dank für diesen Beitrag. Wenn ich mir zfs send genauer ansehe, habe ich sehr schnell das Gefühl, dass es ein schlechtes Verhalten (auch als "Design" bezeichnet) beim Senden an ein latenzgebundenes Ziel hat. Nach ungefähr einem Dutzend Ergebnissen, die besagen, dass ZFS niemals für irgendetwas verantwortlich sein kann. Ich bin sehr dankbar, dass Sie sich die Zeit genommen und Ihre Ergebnisse veröffentlicht haben.
Florian Heigl

2

Dies ist eine Antwort auf Ihre spezielle Frage:

Sie können rzip ausprobieren , aber es funktioniert auf eine andere Weise als compress / bzip / gzip:

rzip erwartet, dass die gesamte Datei gelesen werden kann, sodass sie nicht in einer Pipeline ausgeführt werden kann. Dadurch werden Ihre lokalen Speicheranforderungen erheblich erhöht, und Sie können keine Sicherung ausführen und die Sicherung in einer einzigen Pipe über das Kabel senden. Trotzdem sind die resultierenden Dateien, zumindest nach diesem Test, ziemlich viel kleiner.

Wenn Ihre Ressourcenbeschränkung Ihre Pipe ist, werden Sie ohnehin rund um die Uhr Backups ausführen. Sie müssen also nur ständig Snapshots kopieren und hoffen, dass Sie auf jeden Fall auf dem Laufenden bleiben.

Ihr neuer Befehl wäre:

remotedir=/big/filesystem/on/remote/machine/
while 
  snaploc=/some/big/filesystem/
  now=$(date +%s)
  snap=snapshot.$now.zfssnap
  test -f $snaploc/$snap
do
  sleep 1
done

zfs send -i tank/vm@2009-10-10 tank/vm@2009-10-12 > $snaploc/$snap &&
rzip $snaploc/$snap &&
ssh offsite-backup "
        cat > $remotedir/$snap.rzip && 
        rzip -d $remotedir/$snap.rzip && 
        zfs recv -F tank/vm < $remotedir/$snap &&
        rm $remotedir/$snap " < $snaploc/$snap &&
rm $snaploc/$snap

Sie sollten eine bessere Fehlerkorrektur verwenden und die Verwendung von rsync in Betracht ziehen, um die komprimierten Dateien zu übertragen. Wenn die Übertragung in der Mitte fehlschlägt, können Sie dort weitermachen, wo Sie aufgehört haben.


2

Dinge haben sich in den Jahren geändert, seit diese Frage gestellt wurde:

1: ZFS unterstützt jetzt die komprimierte Replikation. Fügen Sie einfach das Flag -c zum Befehl zfs send hinzu, und blockiert, was auf der Festplatte komprimiert wurde, und bleibt komprimiert, wenn sie durch die Pipe zum anderen Ende geleitet werden. Möglicherweise muss noch mehr Komprimierung erzielt werden, da die Standardkomprimierung in ZFS lz4 ist

2: Der in diesem Fall am besten zu verwendende Kompressor ist zstd (ZStandard). Er verfügt nun über einen 'adaptiven' Modus, mit dem die Komprimierungsstufe (zwischen den über 19 unterstützten Stufen und den neuen höheren zstd-schnellen Stufen) basierend auf geändert werden kann Die Geschwindigkeit der Verbindung zwischen zfs send und zfs recv. Es komprimiert so viel wie möglich, während die Warteschlange der Daten, die darauf warten, aus der Pipe herauszukommen, auf ein Minimum reduziert wird. Wenn Ihr Link schnell ist, wird keine Zeit mehr für das Komprimieren der Daten verschwendet, und wenn Ihr Link langsam ist, wird er weiter daran arbeiten, die Daten stärker zu komprimieren und Ihnen am Ende Zeit zu sparen. Es unterstützt auch die Komprimierung mit Threads, sodass ich mehrere Kerne nutzen kann, die gzip und bzip außerhalb spezieller Versionen wie pigzip nicht bieten.


1

Ich gehe davon aus, dass Sie die unformatierte Bandbreite Ihrer Website einfach nicht erhöhen können ...

Möglicherweise profitieren Sie davon, wenn Sie auf dem Host keine Komprimierung verwenden.

Wenn Sie so etwas wie einen WAN-Optimierer verwenden, kann er die Übertragung viel besser optimieren, wenn Sie die Datei vor dem Senden nicht komprimieren, dh genau das tun, was Sie tun, aber den bzip2 aus der Pipe entfernen. Nach einigen Sicherungsläufen hat das WAN-Optimierungsprogramm einen sehr großen Teil der Daten, die in der Übertragung angezeigt werden, zwischengespeichert, und Sie werden enorme Verbesserungen bei der Übertragungsgeschwindigkeit feststellen.

Wenn Sie sich in einem begrenzten Bereich befinden, können Sie möglicherweise eine ähnliche Verbesserung feststellen, indem Sie rsync verwenden und den nicht komprimierten Snapshot synchronisieren.

zfs send -i tank/vm@2009-10-10 tank/vm@2009-10-12 > /path/to/snapshotdir/snapshotfile
rsync /path/to/snapshotdir/snapshotfile offsite-backup:/remote/path/to/snapshotfile
ssh offsite-backup 'zfs recv -F tank/vm < /remote/path/to/snapshotfile'

Dies wäre schneller, da rsync nur die Unterschiede zwischen dem Snapshot von gestern und dem von heute überträgt. Abhängig davon, wie der Snapshot-Vorgang funktioniert, besteht möglicherweise immer noch eine große Redundanz zwischen beiden, auch wenn es sich nicht wirklich um dieselbe Datei handelt.

Die WAN - Optimierer bei weitem einer eher Art und Weise ist es, dieses Problem zu beheben (gut, Metro - Ethernet ist die am meisten wahrscheinlich Weg , um dieses Problem zu lösen, aber wir werden die vom Tisch verlassen). Der Rsync ist nur eine wilde Szene im Dunkeln, die es wert ist, getestet zu werden (lokal; Rsync gibt an, wie viel Zeit es über eine direkte Kopie auf Ihren lokalen Daten gespart hat), bevor der große Scheck für Glasfaser- oder Flussbettinstallationen geschrieben wird.


1

Für was es wert ist. Ich würde nicht direkt senden komprimieren | dekomprimieren | Empfangen Dies kann zu Problemen beim Empfang führen, wenn die Übertragungsleitung abbricht und Ihre Pools während des Empfangs für längere Zeit offline sind. Wir senden an eine lokale Datei, gzipen den Schnappschuss und übertragen ihn mit rsync (mit Flussbett), dann erhalten wir von der Datei. Das Flussbett optimiert den Verkehr nicht, ABER wenn es ein Problem mit der Übertragung gibt und es neu gestartet werden muss, beschleunigt das Flussbett das erneute Senden.

Wir haben uns vorgenommen, den inkrementellen Snapshot nicht mit Rsync-Komprimierung zu komprimieren und keine andere Komprimierung als das Flussbett zu verwenden. Es ist schwer zu sagen, welches das Beste ist, aber wenn wir Archivelogs mit rsync-Komprimierung von Oracle übertragen, ist die Übertragungsrate ungefähr doppelt so hoch wie bei normalen Dateien und im Flussbett (mit RSync).

Wenn Sie ein Flussbett haben, verwenden Sie rsync nicht ssh, da das Flussbett rsync versteht und versucht, es zu optimieren und die Daten zum Cache hinzuzufügen (siehe oben, Übertragung neu starten).


1

Ich habe die Erfahrung gemacht, dass dies zfs sendziemlich stoßartig ist, obwohl es (im Durchschnitt) viel schneller ist als der folgende Komprimierungsschritt. Mein Backup fügt nach zfs sendund nach erhebliche Puffer ein gzip:

zfs send $SNAP | mbuffer $QUIET -m 100M | gzip | mbuffer -q -m 20M | gpg ... > file

In meinem Fall ist das Ausgabegerät über USB (kein Netzwerk) verbunden, aber die Pufferung ist aus einem ähnlichen Grund wichtig: Die gesamte Sicherungszeit ist kürzer, wenn das USB-Laufwerk zu 100% ausgelastet ist. Sie können nicht insgesamt weniger Bytes senden (wie Sie anfordern), aber Sie können immer noch früher beenden. Durch das Puffern wird verhindert, dass der CPU-gebundene Komprimierungsschritt E / A-gebunden wird.


1

Ich benutze pbzip2 die ganze Zeit (parallel bzip2) beim Senden über WAN. Da es sich um einen Thread handelt, können Sie die Anzahl der Threads angeben, die mit der Option -p verwendet werden sollen. Installieren Sie zuerst pbzip2 auf dem sendenden und dem empfangenden Host. Die Installationsanweisungen finden Sie unter http://compression.ca/pbzip2/ .

zfs send -i tank/vm@2009-10-10 tank/vm@2009-10-12 | pbzip2 -c | \
ssh offsite-backup "pbzip2 -dc | zfs recv -F tank/vm"

Der Hauptschlüssel besteht darin, Schnappschüsse in regelmäßigen Abständen (~ 10 Minuten) zu erstellen, um die Größe Ihres Schnappschusses zu verringern, und dann jeden Schnappschuss zu senden. ssh wird nicht von einem kaputten Snapshot-Stream fortgesetzt. Wenn Sie also einen großen Snapshot senden möchten, leiten Sie den Stream an pbzip2 und teilen Sie ihn dann in Blöcke mit überschaubarer Größe auf.

zfs send -i tank/vm@2009-10-10 tank/vm@2009-10-12 | pbzip2 -c | \
split -b 500M - /somedir/snap-inc-10-to-12.pbzip2--

Dadurch werden Dateien erzeugt, die in 500-MB-Blöcken benannt sind:

/somedir/snap-inc-10-to-12.pbzip2--aa
/somedir/snap-inc-10-to-12.pbzip2--ab
/somedir/snap-inc-10-to-12.pbzip2--ac
...

Rsync zum Empfangen des Hosts mehrmals (Sie können Rsync ausführen, noch bevor der ZFS-Sendevorgang abgeschlossen ist oder sobald Sie einen vollständigen 500-MB-Block sehen), drücken Sie jederzeit Strg + C, um abzubrechen:

while [[ true ]]; do rsync -avP /somedir/snap-inc-10-to-12.pbzip2--* offsite-backup:/somedir ; sleep 1; done;

zfs erhalten:

cat /somedir/snap-inc-10-to-12.pbzip2--* | pbzip2 -dc | zfs recv -Fv tank/vm

User freind erwähnt: Für was es sich lohnt. Ich würde nicht direkt senden komprimieren | dekomprimieren | Empfangen Dies kann zu Problemen beim Empfang führen, wenn die Übertragungsleitung abbricht und Ihre Pools während des Empfangs für längere Zeit offline sind. - Ich habe zuvor Probleme mit älteren zfs-Versionen <28 auf dem empfangenden Host festgestellt, wenn ein laufendes Senden / Empfangen durch Netzwerkausfälle unterbrochen wird, jedoch nicht in dem Maße, in dem die Pools nicht ausgelagert sind. Das ist interessant. Senden Sie den Snapshot nur dann erneut, wenn "zfs recv" auf der empfangenden Seite beendet wurde. Töte das "zfs recv" bei Bedarf manuell. zfs send / recv wurde in FreeBSD oder Linux stark verbessert.


0

Sie können eine schnellere Verschlüsselung für ssh finden, vielleicht blowfish-cbc. Probieren Sie auch die Schalter -123456789

-1 (or --fast) to -9 (or -best)

1
Aus der Unix-Manpage: Die Aliase --fast und --best dienen hauptsächlich der GNU-GZIP-Kompatibilität. Insbesondere --fast macht die Dinge nicht wesentlich schneller. Und --best wählt lediglich das Standardverhalten aus.
Sysadminicus

1
also hat es in deinem fall keine wirkung. Was ist mit der Chiffre?
Istvan

Ich hatte viel Glück mit der LZMA-Komprimierung, aber es kann sein, dass Ihr Link einfach zu langsam ist.
Amok

0

Sie müssen mit Ihren Daten testen. Senden Sie es einfach in eine Datei und komprimieren Sie es mit jeder Methode.

Für uns hat gzip einen großen Unterschied gemacht und wir haben alles durchgespielt, aber es gab nicht einmal einen Unterschied von 1% zwischen gzip und bzip oder 7z.

Wenn Sie sich auf einem langsamen T1 befinden, müssen Sie ihn in einer Datei speichern und erneut synchronisieren.

Für diejenigen (nicht Sie), die ein bisschen mehr von der CPU als von der Bandbreite begrenzt sind, wie lstvan sagte, beschleunigt eine andere Chiffre wie arcfour128 die Dinge. Wir verwenden das intern, wenn wir Dinge bewegen.


0

Experimentieren Sie mit dem Aktivieren von dedup für zfs send mit -D. Einsparungen hängen natürlich davon ab, wie viele Duplikate in Ihren Daten vorhanden sind.


Da er ein -i"inkrementelles" Backup verwendet, gibt es nicht so viel Hoffnung, -Ddie etwas geben würde.
Poige

@poige hängt davon ab, wie ihre Daten aussehen. Wenn sie viele Daten mit doppelten Blöcken generieren, ist dies ein großer Gewinn. Ich verstehe nicht, wie -i es mehr oder weniger wahrscheinlich macht, dass es doppelte Blöcke gibt. Wenn Sie normalerweise Daten mit vielen Duplikaten erstellen, werden Sie wahrscheinlich jeden Tag viele Duplikate erstellen, sodass -i weder hilft noch schadet.
James Moore

Nun, wenn Sie viele Duplikate haben, würde sich jede Komprimierung auf jeden Fall darum kümmern.
Poige

@poige Sie müssen sich an ihren tatsächlichen Daten messen. Sie können definitiv Datensätze haben, die schlecht komprimiert und wirklich gut deduiert sind. Beispielsweise lassen sich mehrere Kopien derselben komprimierten Videodatei sehr gut dedupen, und die Komprimierung auf Dateisystemebene ist wahrscheinlich schlechter als nutzlos.
James Moore

Ah, dieser Fall - yep
poige

-1

Der "beste" Komprimierungsalgorithmus hängt davon ab, über welche Art von Daten Sie verfügen. Wenn Sie eine MP3-Sammlung komprimieren, verlangsamt sich der Prozess wahrscheinlich, während Text- / Protokolldateien erheblich komprimiert werden können gzip -9.

Wie viele Daten pushen Sie jeden Tag?


-1

Haben Sie darüber nachgedacht, Ihren TCP / IP-Stack so zu optimieren, dass der TCP-Puffer und die Fenstergröße etwas größer sind? Sie können dazu das nddTool unter Solaris oder das sysctlTool unter Linux / BSD / Mac OSX verwenden. Unter Solaris sind Sie für die /dev/tcp tcp_max_bufund /dev/tcp tcp_cwnd_maxWerte, und auf Linux Sysctl, sind Sie suchen net.ipv4.tcp_mem, net.ipv4.tcp_rmemund net.ipv4.tcp.wmemWerte.

Diese Links könnten auch eine zusätzliche Hilfe sein:

Solaris TCP-Leistungsoptimierung

Unten auf dieser Seite finden Sie eine Reihe von Links, die erklären, wie Sie dasselbe auch für Linux / BSD / OSX tun.


1
1. Dies ist eine 5 Jahre alte Frage, die Sie ausgraben. 2. Er hat nicht gesagt, dass der Link nicht ausgelastet ist, und nach der Komprimierung gefragt, auf die Sie nicht verweisen. 3. Die meisten Betriebssysteme passen die Fenstergröße heutzutage automatisch an. Die Informationen, auf die Sie verlinken, waren vor 3 Jahren alt, als der Autor sie gepostet hat.
Chris S
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.