Kopie zapasowe Rsync na btrfs są bardzo wolne

5

Moje środowisko to Ubuntu 15.04 z jądrem 3.19.0-28-generic i Btrfs v3.17.

Mam dwa identyczne zewnętrzne dyski twarde USB, których używam ze swoim skryptem kopii zapasowej. Jeden z nich jest sformatowany za pomocą, btrfsa drugi za pomocą ext4. Źródłowy system plików jest zawsze ext4. rsyncPolecenia wygląda następująco:

rsync --inplace --no-whole-file --link-dest="$previousBackup" "$sourceDir" "$destDir"

Właśnie zdałem sobie sprawę, że wykonanie kopii zapasowej btrfstrwa bardzo długo: nieco ponad godzinę, w porównaniu do 4 minut, które zajmuje wykonanie tej samej kopii ext4.

Aby wykluczyć nieprawidłowe działanie dysku, przeprowadziłem kilka testów porównawczych z dd„narzędziem dyskowym” dostarczonym z Ubuntu, ale mam taką samą wydajność na obu dyskach. Powolna część wydaje się być dowiązaniem twardym do poprzedniej kopii zapasowej. Nawet po defragmentacji i szorowaniu następujące polecenie trwa około 53 minut btrfs, ale tylko 1 minuta ext4:

cp -arl "$previousBackup" "$destDir"

Badając Internet, znalazłem wskazówki, że wydajność btrfscierpi na linkach twardych, ale nie spodziewałbym się tak dużej różnicy. Dowiedziałem się, że to polecenie jest szybsze, ale jego wykonanie zajmuje ponad 30 minut:

cp -ar --reflink "$previousBackup" "$destDir"

Czy ktoś ma doświadczenie z tym zachowaniem i może je potwierdzić? Czy jest jakiś prosty sposób, aby to poprawić (np. Różne opcje montowania), czy powinienem spróbować usunąć jak najwięcej linków i po prostu użyć linków?

EDYTOWAĆ

Właśnie dowiedziałem się, że nawet usunięcie katalogu btrfswymaga więcej niż jednej godziny. Ta sama operacja jest natychmiastowa na „bliźniaczym” ext4dysku. Oczywiście jest tutaj problem z metadanymi.

matpen
źródło
Ile plików jest kopiowanych? Problemem może być naturalna powolność transakcji wynikająca z używania systemu plików „kopiuj przy zapisie”btrfs .
JakeGould,
@JakeGould Liczba połączonych plików jest bardzo duża, ale liczba plików przesłanych z ext4do btrfsjest zwykle niewielka (około 200). Tego nie potrafię wyjaśnić: kopiowanie przy zapisie powinno sprawić, że linkowanie będzie prawie natychmiastowe (przetwarzane są tylko metadane), ale transfer będzie nieco wolniejszy ... podczas gdy tutaj dzieje się odwrotnie.
matpen
Czy system plików, aw szczególności segmenty metadanych, jest gdzieś pełny? O ile pamiętam, wydajność metadanych jest dość zła przy ograniczonej przestrzeni. Domyślna heurystyka Btrfs może również nie przydzielić wystarczającej ilości miejsca na metadane.
Tobu
btrfs filesystem dfRaporty @Tobu Dane, pojedyncze: ogółem = 1,34TiB, używane = 1,34TiB System, DUP: ogółem = 8,00MiB, używane = 176,00KiB System, pojedyncze: ogółem = 4,00 Mb, używane = 0,00B Metadane, DUP: ogółem = 38,47GiB , użyte = 37,49GiB Metadane, pojedyncze: łącznie = 8,00 MB, użyte = 0,00B Nie wydaje mi się pełne ... jednak czy jest jakiś sposób na poprawienie miejsca przydzielonego na metadane?
matpen

Odpowiedzi:

1

Mówisz, że kopiujesz twarde linki za pomocą swojego rsyncpolecenia, ale gdzie jest -Hflaga? Nie widzę tego w twoim poleceniu:

rsync --inplace --no-whole-file --link-dest="$previousBackup" "$sourceDir" "$destDir"

Rozumiem, jak rsyncdziała - w odniesieniu do linków twardych - to, że bez -Hflagi kopiowane są rzeczywiste dane zamiast linku twardego, jak wyjaśniono na rsyncstronie podręcznika :

-H, - twarde linki

To mówi rsync, aby szukał plików połączonych na stałe w przesyłaniu i łączył ze sobą odpowiednie pliki po stronie odbierającej. Bez tej opcji połączone pliki w transferze są traktowane tak, jakby były osobnymi plikami.

Mogę sobie wyobrazić, że taka procedura, w której wiele podobnych plików jest kopiowanych w kółko zamiast twardych łączy, przyczynia się do wolniejszego transferu.

Rozważ również użycie flagi -z( --compress):

-z, --kompresuj

Dzięki tej opcji rsync kompresuje dane pliku przesyłane do komputera docelowego, co zmniejsza ilość przesyłanych danych - co jest przydatne w przypadku wolnego połączenia.

Tak, jest to transfer USB na USB w tym samym systemie, więc prawdopodobnie prędkość jest już zoptymalizowana, ale nie szkodzi, -zże może pomoże ci pokonać naturalne wąskie gardła transferu danych USB.

Miły, prosty samouczek, który wyjaśnia te flagi - i inne - można znaleźć tutaj .

JakeGould
źródło
2
Dziękuję za Twoją odpowiedź. --hard-linksSłuży do zachowania dowiązania twarde w katalogu źródłowym. Za pomocą polecenia, które używam, --link-destkatalog docelowy zostaje na stałe połączony z poprzednią kopią zapasową na tym samym dysku USB . Zasadniczo jest to różnicowa kopia zapasowa, w której tylko zmienione pliki są faktycznie przesyłane ze źródła, wszystko inne to długi łańcuch linków twardych od kopii zapasowej do kopii zapasowej.
matpen
3
Jeśli chodzi o --compressopcję, jest to szczególnie przydatne w przypadku transferów sieciowych. Różnicę można przetestować, ale w przypadku USB jest mało prawdopodobne, aby przyniosła jakąkolwiek korzyść, ponieważ szybszy transfer prawdopodobnie równoważy czas procesora do kompresji danych. Tak czy inaczej, nie dotyczy to mojego przypadku, ponieważ opcje są takie same dla obu ext4(które jest szybkie) i btrfs(które jest wolne).
matpen