markus-so
Goto Top

Webdav verlangsamt backup

Hallo!

Ich habe meine ersten Schritte mit webdav aus einem Raspberry Pi probiert und bin hier auf ein Problem gestoßen:

Mit rsync wird ein Backup von einer externen Festplatte in ein webdav-Verzeichnis erstellt. Funktioniert soweit ganz gut, bis webdav anfängt hochzuladen. rsync ist dann plötzlich wahnsinnig langsam und ich vermute, dass das daran liegt, dass webdav (bzw davfs2) zu viele ressourcen benötigt. Um das zu verhindern, habe ich jetzt in der davfs2.conf die Cache-Größe erhöht und delay_upload so gesetzt, dass erst eine halbe Stunde verzögert hochgeladen wird. rsync kopiert jetzt ziemlich fix.

Die Lösung erscheint mir aber nicht sehr elegant. Mein Ziel ist es, dass rsync erst mal Dateien in den Cache (oder wohin auch immer) lädt und anschließend freie Ressourcen genutzt werden, das Ganze ins Upload-Verzeichnis zu laden. Wie kann ich das erreichen?

Außerdem handelt es sich um riesige Datenmengen. Es ist natürlich nicht sinnvoll, wenn alles auf einmal in den Cache geladen werden würde, während der Upload bei weitem nicht so schnell hinterher kommt (wirklich miese Upload-Rate). In Zweifel würde das Spiel ja wieder von vorne beginnen, wenn das System neu gestartet wird. Das muss nicht sein. Nicht schlecht wäre also, wenn rsync bei jedem Ausführen nur ein Häppchen von einigen GB in den Cache lädt. Meine Idee war, dass sich das über die Cache-Größe selbst regeln könnte, aber ich habe den Eindruck, dass die im Zweifel ignoriert wird.

Also es wäre super, wenn Ihr für mich ein paar Tipps habt, wie ich
- dafür sorgen kann, dass der Upload von davfs2 nur freie Ressourcen nutzt (indem es zum Beispiel eine niedrigere Priorität hat)
- rsync nicht gleich alles kopiert.

Vielen Dank!

Gruß Markus

Content-Key: 281887

Url: https://administrator.de/contentid/281887

Printed on: April 25, 2024 at 20:04 o'clock

Member: Cthluhu
Cthluhu Sep 03, 2015 updated at 11:45:26 (UTC)
Goto Top
Hi,

Rsync auf webdav hat ein grundsätzliches Problem. Rsync überprüft per default die Checksummen der Dateien um festzustellen welcher er hochladen muss. Per Webdav, kann man aber nicht einfach die Checksummen vom Server anfordern, sondern muss die Dateien vor dem Überprüfen runterladen. Das kann dauern.

EDIT: Das Verhalten kann aber per Commandozeilenparamter von rsync angepasster werden.

Mit freundlichen Grüßen

Cthluhu
Member: markus-so
markus-so Sep 03, 2015 at 11:56:52 (UTC)
Goto Top
Sicher? Ich dachte, das tut rsync nur, wenn ich die Option c setze. Wie kann ich das denn verhindern bzw. was gäbe es für eine Alternative?
Member: Cthluhu
Cthluhu Sep 03, 2015 at 12:44:15 (UTC)
Goto Top
Hi,

Hoppla, das hatte ich falsch in Erinnerung. Nicht die Checksummenüberprüfung vor, sondern nach dem Hochladen erzeugt das Problem, dass die Datei heruntergeladen wird.

Siehe Absatz drei vom Ausschnitt aus der man-page:
       -c, --checksum
              This changes the way rsync checks if the files have been changed and are in need of a trans‐
              fer.  Without this option, rsync uses a "quick check"  that  (by  default)  checks  if  each  
              file’s  size  and  time  of  last  modification match between the sender and receiver.  This
              option changes this to compare a 128-bit checksum for each file that has  a  matching  size.
              Generating the checksums means that both sides will expend a lot of disk I/O reading all the
              data in the files in the transfer (and this is prior to any reading that  will  be  done  to
              transfer changed files), so this can slow things down significantly.

              The  sending side generates its checksums while it is doing the file-system scan that builds
              the list of the available files.  The receiver generates its checksums when it  is  scanning
              for  changed  files,  and will checksum any file that has the same size as the corresponding
              sender’s file:  files with either a changed size or a  changed  checksum  are  selected  for
              transfer.

              Note  that  rsync  always verifies that each transferred file was correctly reconstructed on
              the receiving side by checking a whole-file checksum that is generated as the file is trans‐
              ferred,  but  that  automatic  after-the-transfer  verification  has nothing to do with this
              option’s before-the-transfer "Does this file need to be updated?" check.  

              For protocol 30 and beyond (first supported in 3.0.0), the checksum used is MD5.  For  older
              protocols, the checksum used is MD4.
Member: markus-so
markus-so Sep 03, 2015 at 13:01:25 (UTC)
Goto Top
Okay, ich habe jetzt die Optionen --size-only --no-whole-file --inplace dazu genommen. An sich kann ich ohnehin kaum Traffic beobachten, wenn rsync arbeitet, während der upload bei webdav noch nicht angelaufen ist. Aber nachwievor stoppt rsync beinahe komplett, wenn webdav hochlädt. Mein Verdacht ist, dass beide einfach den RAM sehr beanspruchen. Kann das sein? Kann ich da einem von beiden Vorrang geben?

Alternativ würde ich bei der Methode bleiben, dass webdav einfach eine halbe Stunde verzögert hochlädt, falls sich das nicht irgendwie eleganter lösen lässt.

Kann ich eigentlich nach einer bestimmten Zeit ein Skript wieder stoppen lassen? Also meine rsync-Befehle sind alle in einer Bash-Datei gespeichert. Kann man vorher irgendwie ein Timeout definieren, dass diese Datei nur eine bestimmte Zeit ausgeführt wird? Oder muss ich da den Prozess rsync nach einiger Zeit killen?
Member: Cthluhu
Solution Cthluhu Sep 03, 2015 updated at 13:26:33 (UTC)
Goto Top
Zitat von @markus-so:

Okay, ich habe jetzt die Optionen --size-only --no-whole-file --inplace dazu genommen. An sich kann ich ohnehin kaum Traffic
beobachten, wenn rsync arbeitet, während der upload bei webdav noch nicht angelaufen ist. Aber nachwievor stoppt rsync
beinahe komplett, wenn webdav hochlädt. Mein Verdacht ist, dass beide einfach den RAM sehr beanspruchen. Kann das sein? Kann
ich da einem von beiden Vorrang geben?
Verdacht ist gut, warum kontrollierst du nicht einfach den RAM verbraucht?
Vorrang geben geht mit "nice".
Ich vermute mal, dass davfs einfach blockt, wenn es was zu tun hat. Dann muss rsync halt warten.


Alternativ würde ich bei der Methode bleiben, dass webdav einfach eine halbe Stunde verzögert hochlädt, falls sich
das nicht irgendwie eleganter lösen lässt.
Ich hab keine elegante Lösung für rsync in Verbindung mit webdav gefunden. Als alternative: vServer oder rsync-hoster nehmen.
Ganz Alternativ: Object-Storage verwenden (Amazon, Google,...). Dafür gibt ähnliche Tools wie rsync, aber gegenüber Zugriff via webdav wird die Checksumme vom Server berechnet und man spart sich mehrfaches hoch/runterladen.

Kann ich eigentlich nach einer bestimmten Zeit ein Skript wieder stoppen lassen? Also meine rsync-Befehle sind alle in einer
Bash-Datei gespeichert. Kann man vorher irgendwie ein Timeout definieren, dass diese Datei nur eine bestimmte Zeit ausgeführt
wird? Oder muss ich da den Prozess rsync nach einiger Zeit killen?
Einfach mal nach "Bash timeout" googeln. Da findet man dann Hilfsscripte wie dieses: http://stackoverflow.com/questions/687948/timeout-a-command-in-bash-wit ...
Member: markus-so
markus-so Sep 03, 2015 at 13:26:20 (UTC)
Goto Top
Alles klar, danke dir! Um Webdav komme ich wahrscheinlich nicht herum, weil ich halt diese Onlinespeicher von 1und1 habe und nicht für etwas anderes zahlen möchte. Dann arbeite ich jetzt einfach wie oben beschrieben, lasse rsync mit cron regelmäßig starten und durch timeout nach einiger Zeit wieder beenden. Und ich experimentiere mit nice herum.

Für weitere Hinweise bin ich natürlich trotzdem dankbar ;)