Czytałem kilka przewodników, jak połączyć migawki btrfs z rsync, aby stworzyć wydajne rozwiązanie do tworzenia kopii zapasowych z historią. Wszystko zależy jednak rsync --inplace
od tego, czy zmodyfikuje tylko te fragmenty plików, które faktycznie się zmieniły, czy też nadpisuje cały plik sekwencyjnie. Jeśli zapisuje cały plik, wydaje się, że btrfs zawsze utworzy nową kopię pliku, co znacznie zmniejszy wydajność tego pomysłu.
21
rsync
czyta cały plik, a następnie szuka i aktualizuje tylko te potrzebne części, btrfs skopiuje tylko te zaktualizowane bloki. Ale jeślirsync
czyta i zapisuje cały plik, to będzie problem.rsync
nie tylko wie, że może uniknąć zapisania całego pliku, ale udaje mu się to bez kopiowania go całkowicie przez sieć. Sprytny mały program.Odpowiedzi:
Jeśli przekażesz rsync dwie ścieżki lokalne, domyślnie użyje „--hole-file”, a nie przeniesienia delta. To, czego szukasz, to „--no-cały plik”. Otrzymasz również transfer delta, jeśli poprosiłeś o „-c”.
Oto jak możesz zweryfikować:
Następnie dotknij pliku i ponownie zsynchronizuj
Możesz sprawdzić, czy ponownie użył i-węzła z „ls -li”, ale zauważ, że wysłał całe 64 KB. Spróbuj ponownie z --no-cały plik
Teraz wysłałeś tylko 494 bajty. Możesz użyć strace do dalszej weryfikacji, czy któryś z plików został zapisany, ale pokazuje to przynajmniej użycie transferu delta.
Uwaga (patrz komentarze), że dla lokalnych systemów plików,
--whole-file
zakłada się (zobacz stronę podręcznika rsync). Z drugiej strony--no-whole-file
zakłada się, że przez sieć , więc--inplace
sama będzie się zachowywać jak--inplace --no-whole-file
.źródło
--inplace
sugeruje--no-whole-file
?--no-whole-file
domyślne?--inplace
nie oznacza--no-whole-file
to wersji rsync, z której korzystałem w 2013 roku, ale możesz powtórzyć ten eksperyment z własną wersją rsync.inplace
nie chodzi o „skanowanie w poszukiwaniu tych samych / różnych bloków”, chodzi o natychmiastowe zastąpienie istniejącego pliku od przesunięcia 0. (w przeciwnym razie tworzona jest kopia tymczasowa, a dopiero potem usuwany jest stary plik docelowy i nazwa tymczasowej kopii jest zmieniana) Prawdopodobnie uważa się za „bezpieczniejsze” przechowywanie starego pliku tak długo, jak to możliwe, jeśli proces zostanie przerwany. Oczywiście jest to gorsze ze względu na wydajność, szczytowe zużycie pamięci (pomyśl o dużych plikach), być może fragmentację ...) ...--no-whole-file
zawsze implikuje--inplace
, w przeciwnym razie większość jego przyrostu wydajności zniknie. Nie udało się znaleźć tego udokumentowanego ...Oto pewna ostateczna odpowiedź, podając poprawną część instrukcji:
źródło
--inplace
zastępuje tylko zmienione regiony. Zawsze używaj go podczas pisania na Btrfs.źródło
-vvv
pokazuje, że pomija dopasowane blokiAlgorytm transferu delta rsync zajmuje się tym, czy przesyłany jest cały plik, czy tylko różne części. Jest to domyślne zachowanie podczas synchronizacji pliku między dwoma komputerami w celu zaoszczędzenia przepustowości. Można to zastąpić przyciskiem
--whole-file
(lub-W
), aby wymusićrsync
przesłanie całego pliku.--inplace
zajmuje się tym, czyrsync
podczas przesyłania utworzy plik tymczasowy, czy nie. Domyślnym zachowaniem jest utworzenie pliku tymczasowego. Daje to pewien poziom bezpieczeństwa, ponieważ w przypadku przerwania przesyłania istniejący plik na komputerze docelowym pozostaje nienaruszony / nietknięty.--inplace
zastępuje to zachowanie i nakazujersync
bezpośrednią aktualizację istniejącego pliku. Dzięki temu istnieje ryzyko, że plik na komputerze docelowym będzie niespójny, jeśli transfer zostanie przerwany.źródło
Ze strony podręcznika:
To prowadzi mnie do przekonania, że zapisuje on plik w całości - wyobrażam sobie, że rsync działałby w inny sposób.
źródło
Teoretyczna praca na miejscu rsync jest opisana w tym artykule .
Odniesienie do papieru: D. Rasch i R. Burns. In-Place Rsync: Synchronizacja plików dla urządzeń mobilnych i bezprzewodowych. Doroczna konferencja techniczna USENIX, tor FREENIX, 91-100, USENIX, 2003.
Z linku:
Wygląda to na szczegóły techniczne tego, co robi rsync --inplace. Według początku pracy:
Jak wynika z odpowiedzi @ bez danych , oznacza to, że
--inplace
używa tej samej przestrzeni dyskowej, ale może nadal kopiować cały plik do tej przestrzeni. W szczególności, gdy kopie są tworzone z / do lokalnych systemów plików, rsync zakłada tę--whole-file
opcję. Z drugiej strony, gdy znajduje się w systemach sieciowych, przyjmuje taką--no-whole-file
opcję.źródło