Comment puis-je ralentir rsync?


35

J'essaie de copier le contenu d'une clé USB défaillante. Si je lis les données trop rapidement, la puce du contrôleur du lecteur surchauffe et le lecteur disparaît du système. Lorsque cela se produit, je dois débrancher le lecteur, attendre environ une minute le temps qu'il refroidisse, le rebrancher et redémarrer la copie.

J'ai une vieille sauvegarde du contenu du lecteur, le moyen évident de récupérer le reste des données est donc rsyncde mettre la sauvegarde à jour, mais cela se répercute sur la totalité de la "lecture trop rapide, le lecteur disparaît , et j’ai besoin de tout recommencer ". Existe-t-il un moyen de rsyncne lire que X mégaoctets de données par minute? Sinon, est-il possible de lui dire de suspendre les opérations lorsque le lecteur est effacé et de le reprendre lorsqu'il est rebranché?


24
Avez-vous pensé à refroidir le lecteur?
AEonAX

3
Le lecteur est-il plein? Si le lecteur est plein à plus de 50%, il est probablement préférable de commencer par mettre en miroir le lecteur défaillant, puis de commencer à traiter uniquement des éléments plus complexes sur le miroir.
Kasperd

1
@AEonAX: Bien que ce soit une idée originale, je ne le recommanderais pas: vous soumettez l'appareil à un stress thermique supplémentaire, qui pourrait échouer complètement.
Piskvor

Réponses:


46

Contrairement à l'expérience de DopeGhoti, le --bwlimitdrapeau limite le transfert de données, avec mon rsync (v3.1.2).

tester:

$ 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

(note: ma timesortie est différente de la plupart des timeinvocations ( zshfonctionnalité), ces temps n'ont pas été modifiés par moi)

Sinon, peut-être quelque chose comme un double -execdans find. Je crois que cela rsync -Rdevrait créer et copier les dossiers parents, mais si ce n’est pas le cas, cela cp --parentsdevrait être.

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

Remarque : consultez également ddrescue , il se peut que vous recherchiez ce que vous cherchez :)


1
Ouaip. DG a peut-être été dérouté par le mot "bande passante" - mais cela s’applique à n’importe quel canal transportant des données, pas seulement au réseau. La page de manuel indique spécifiquement: --bwlimit=KBPS limit I/O bandwidth; KBytes per secondaucune mention de réseau. La navigation simple dans le code limite la vitesse de lecture , quelle que soit la destination. De plus, une anecdote: J'utilise cette option depuis des années pour limiter la vitesse d'écriture de local à local. linux.die.net/man/1/rsync
Piskvor

1
D'accord, au second regard, il compte en fait le nombre d'octets écrits et dort pendant un temps calculé. io.c, lignes 832-3: if (bwlimit_writemax) sleep_for_bwlimit(n);Dans tous les cas, cela fonctionnerait probablement comme prévu, en lisant de courtes rafales et en dormant entre les deux. Je recommanderais de commencer avec une valeur faible et d'augmenter avec précaution, ou de laisser le transfert lent s'exécuter du jour au lendemain.
Piskvor

25

Un peu une solution MacGyver, mais j’ai eu un bon succès avec elle par le passé:
mettez un vieux concentrateur USB 1 entre la clé et l’ordinateur. Pas moyen, bon sang, il va copier vite comme ça :-)

Autre possibilité: si vous avez une autre clé disponible, mettez-la sur un autre port USB connecté au même concentrateur racine (afin de partager la bande passante avec votre clé problème).
Maintenant, lancez une grosse opération d'écriture sur le stick supplémentaire pour que les deux sticks se disputent la bande passante. Pour plus de contrôle, vous pouvez utiliser ionice pour réduire encore la priorité du problème.


1
Je suis sûr qu'il devrait exister un moyen de faire fonctionner les ports en USB 1.1 via une solution logicielle, éventuellement en donnant des options au module de noyau USB.
André Borie

@ AndréBorie: Il y a - bbs.archlinux.org/viewtopic.php?pid=1342593#p1342593 , mais comme il y a des manettes efficaces dans SW, c'est un peu une solution brutale.
Piskvor

@Piskvor négocie un taux de transfert inférieur avec le périphérique, comme le ferait un concentrateur USB 1. Je ne vois rien de "force brute" à ce sujet.
André Borie

Ok, mauvais choix de mot, je l'avoue. Mais les dispositifs de reconfiguration IMHO nécessiteraient des privilèges spéciaux (root ou au moins% adm), alors que le contrôle de la vitesse de lecture par processus serait plus simple. (De plus, certains périphériques ne fonctionnent pas du tout en dehors de l'USB 2.0 - en violation des spécifications.)
Piskvor

13

Vous pouvez utiliser rsync --bwlimit=RATEpour limiter la vitesse de transfert de fichiers qui, d'après les commentaires ci-dessous, semble spécifiquement fonctionner en limitant la vitesse de lecture des données, ce qui est précisément ce que vous recherchez.



3
ionice donne juste la priorité, si deux choses sont lues alors, par défaut elles obtiennent 50/50. ionice peut ajuster cela, mais s’il n’ya qu’une chose à lire, elle sera à 100%.
coteyr

@coteyr Vous avez raison et c'est pourquoi vous devez le combiner avec un second processus de consommation de bande passante sur le même hub racine USB. Voir ma réponse.
Tonny

2
Heureusement, votre réponse est incorrecte: --bwlimitdéfinit la limite d'E / S, pas nécessairement une limite de réseau . Testé à plusieurs reprises dans différents scénarios: cette option permet à rsync de se limiter à la lecture , quelle que soit la destination. (Trouvé dans un scénario similaire, où une écriture rapide sur un périphérique local lent les faisait échouer)
Piskvor

1
@piskvor - merci pour ça! C'est ce que j'aime dans cet endroit. Je continue d'apprendre de nouvelles choses (:
DopeGhoti

8

Plus de solutions, en plus du rsync --bwlimit=100, pour 100 Ko / s.

  1. Utiliser ddrescueavec l' --max-read-rateoption pour une copie complète du disque. Cela vous permettra également de redémarrer une copie complète du disque là où elle s'était arrêtée après une erreur.

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

ddrescuea également beaucoup d'autres options pertinentes pour la récupération de données, voir le manuel ici .

  1. Utilisez pv("visualiseur de tubes") avec l' --rate-limitoption ou l' throttleoutil pour évaluer les tubes avec limite. pvpeut également montrer des progrès. Vous pouvez utiliser cette fonction pour tout outil utilisant un tuyau ou pouvant utiliser un tuyau:

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

    ou

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

    Jetez un oeil à la page de manuel de pv pour plus de paramètres et des exemples. Pour throttle, vous voudrez peut - être essayer aussi l' -woption, qui détermine comment on calcule la vitesse, voir la page de manuel manette des gaz .


Voilà un outil utile, je ne le savais pas, merci! pvpage de manuel a encore plus d'exemples d'utilisations diverses.
Piskvor

Je suis arrivé à pvjamais encore et encore depuis la découverte de retour dans ma bande Jocking jours. À l'époque où tar écrivait sur les lecteurs de bande. :)
Dan Garthwaite le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.