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
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
Please also mark the comments that contributed to the solution of the article
Content-Key: 281887
Url: https://administrator.de/contentid/281887
Printed on: April 26, 2024 at 08:04 o'clock
6 Comments
Latest comment
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
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
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:
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.
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?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?
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.das nicht irgendwie eleganter lösen lässt.
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 ...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?