Jak mogę spowolnić rsync?

35

Próbuję skopiować zawartość uszkodzonego napędu USB. Jeśli odczytam dane zbyt szybko, układ kontrolera napędu przegrzewa się, a dysk znika z systemu. Kiedy tak się stanie, muszę odłączyć dysk, odczekać minutę, aż ostygnie, podłączyć go z powrotem i ponownie uruchomić kopię.

Mam starą kopię zapasową zawartości dysku, więc oczywistym sposobem na odzyskanie reszty danych jest rsynczaktualizowanie kopii zapasowej, ale powoduje to całkowite „odczyt zbyt szybko, dysk znika i muszę zacząć od nowa ”. Czy istnieje sposób, aby powiedzieć, rsyncże odczytuje tylko X megabajtów danych na minutę? Alternatywnie, czy można nakazać mu zawieszenie operacji po zniknięciu napędu i wznowienie pracy po ponownym podłączeniu?

znak
źródło
24
Czy myślałeś o chłodzeniu dysku?
AEonAX
3
Jak pełny jest dysk? Jeśli dysk jest zapełniony w ponad 50%, prawdopodobnie lepiej jest najpierw wykonać kopię lustrzaną uszkodzonego dysku, a dopiero potem zacząć zajmować się bardziej skomplikowanymi elementami w lustrze.
kasperd
1
@AEonAX: Chociaż fajny (sic!) Pomysł jest gotowy, nie polecam tego: kładziesz dodatkowe obciążenie termiczne na urządzeniu i może się całkowicie nie powieść.
Piskvor

Odpowiedzi:

46

W przeciwieństwie do doświadczenia DopeGhoti, --bwlimitflaga ogranicza przesyłanie danych, z moim rsync (v3.1.2).

test:

$ dd if=/dev/urandom bs=1M count=10 of=data
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.0871822 s, 120 MB/s

$ du -h data
10M     data

$ time rsync -q data fast
0.065 seconds

$ time rsync -q --bwlimit=1M data slow
10.004 seconds

(uwaga: moje timewyniki wyglądają inaczej niż większość timewywołań ( zshfunkcja), te czasy nie były przeze mnie edytowane)

Indziej, być może coś wzdłuż linii podwójnej -execin find. Uważam , że rsync -Rnależy utworzyć i skopiować foldery nadrzędne, ale jeśli nie, to cp --parentsnależy.

$ find /failing/usb -exec rsync -R {} /somewhere/safe/ \; -exec sleep 1 \;

Uwaga : sprawdź również ddrescue , może być to, czego szukasz :)

morelowy chłopiec
źródło
1
Tak. DG może pomylić słowo „przepustowość” - ale dotyczy to każdego kanału przenoszącego dane, nie tylko sieci. Strona podręcznika wyraźnie mówi: --bwlimit=KBPS limit I/O bandwidth; KBytes per secondbrak wzmianki o sieci. Od czasu do czasu przeglądanie kodu ogranicza prędkość odczytu , niezależnie od miejsca docelowego. Ponadto, anegdota: Korzystam z tej opcji od lat, aby ograniczyć prędkość zapisu od lokalnego do lokalnego. linux.die.net/man/1/rsync
Piskvor
1
Okej, po drugim spojrzeniu faktycznie liczy liczbę zapisanych bajtów i śpi przez obliczony czas. io.c, linie 832-3: if (bwlimit_writemax) sleep_for_bwlimit(n);W każdym razie prawdopodobnie działałoby to zgodnie z przeznaczeniem, czytając w krótkich seriach i śpiąc między nimi. Poleciłbym zacząć od niskiej wartości i ostrożnie zwiększać, lub po prostu pozwolić powolnemu transferowi działać przez noc.
Piskvor
25

Trochę rozwiązania MacGyver, ale w przeszłości miałem z tym duży sukces:
umieść stary koncentrator USB 1 między pamięcią a komputerem. Nie ma mowy, do diabła, szybko to skopiuje :-)

Inna możliwość: jeśli masz inną pamięć USB, umieść ją na innym porcie USB podłączonym do tego samego koncentratora głównego (aby dzieliła przepustowość z twoim dyskiem problemowym).
Teraz rozpocznij dużą operację zapisu na dodatkowym drążku, aby oba drążki rywalizowały o przepustowość. Aby uzyskać dalszą kontrolę, możesz użyć narzędzia jonice, aby jeszcze bardziej obniżyć priorytet na pasku problemu.

Tonny
źródło
1
Jestem pewien, że powinien istnieć sposób, aby porty działały jako USB 1.1 za pomocą rozwiązania programowego, być może poprzez podanie opcji modułowi jądra USB.
André Borie,
@ AndréBorie: Istnieje - bbs.archlinux.org/viewtopic.php?pid=1342593#p1342593 , ale ponieważ w SW występują skuteczne przepustnice, jest to rozwiązanie typu brute-force.
Piskvor
@Piskvor negocjuje niższą szybkość transferu z urządzeniem, tak jak zrobiłby to hub USB 1. Nie widzę w tym nic „brutalnej siły”.
André Borie
Przyznaję, zły wybór słów. Ale urządzenia rekonfigurujące IMHO wymagałyby specjalnych uprawnień (root lub przynajmniej% adm), podczas gdy kontrolowanie prędkości odczytu na proces byłoby prostsze. (Ponadto istnieją urządzenia, które w ogóle nie działają poza USB 2.0 - z naruszeniem specyfikacji)
Piskvor,
13

Możesz użyć rsync --bwlimit=RATEdo ograniczenia prędkości transferu plików, która, w oparciu o poniższe komentarze, w rzeczywistości wydaje się działać, ograniczając prędkość odczytu danych, i właśnie tego szukasz.

DopeGhoti
źródło
6
ionice? linux.die.net/man/1/ionice
steve
3
ionice po prostu daje pierwszeństwo, jeśli czytają dwie rzeczy, domyślnie otrzymują 50/50. ionice może to skorygować, ale jeśli jest tylko jedna rzecz, to dostanie 100%.
coteyr
@coteyr Masz rację i dlatego musisz połączyć to z drugim procesem jedzenia pasma na tym samym hubie USB. Zobacz moją odpowiedź.
Tonny
2
Na szczęście twoja odpowiedź jest nieprawidłowa: --bwlimitustawia limit I / O, niekoniecznie limit sieci . Testowane wiele razy w różnych scenariuszach: ta opcja powoduje, że rsync ogranicza się do odczytu , niezależnie od miejsca docelowego. (Odkryto to w podobnym scenariuszu, w którym szybkie zapisywanie na wolnym urządzeniu lokalnym spowodowało, że zawiodły)
Piskvor,
1
@piskvor - dzięki za to! Właśnie to uwielbiam w tym miejscu; Uczę się nowych rzeczy (:
DopeGhoti
8

Więcej rozwiązań oprócz rsync --bwlimit=100100KiB / s.

  1. Użyj ddrescuez --max-read-rateopcją pełnej kopii dysku. Umożliwi to również ponowne uruchomienie pełnej kopii dysku w miejscu, w którym zostało przerwane po błędzie.

    ddrescue --max-read-rate=100K /failing/usb output.img output.logfile
    

ddrescuema również wiele innych opcji związanych z odzyskiwaniem danych, patrz instrukcja tutaj .

  1. Użyj pv(„podglądu rur”) z --rate-limitopcją lub throttlenarzędzia do oceny limitów rur. pvmoże również pokazywać postęp. Możesz sprawić, aby działało to dla dowolnego narzędzia, które używa potoku lub może używać potoku:

    tar -cf - /failing/usb | throttle -K 100 | tar -C /your/outputfolder/ -xvf -
    

    lub

    tar -cf - /failing/usb | pv --rate-limit 100k | tar -C /your/outputfolder/  -xvf -
    

    Spójrz na stronę pv, aby uzyskać więcej ustawień i przykładów. Na przykład throttlemożesz wypróbować -wopcję, która określa sposób obliczania prędkości, zobacz stronę manszy przepustnicy .

jmiserez
źródło
To przydatne narzędzie, nie wiedziałem o tym, dzięki! pvmanpage ma jeszcze więcej przykładów różnych zastosowań.
Piskvor
Mam sięgnął pvkółko odkąd w moim odkryciu taśmy jocking dni. Wcześniej, gdy tar zapisywał na napędy taśmowe. :)
Dan Garthwaite