¿Cómo puedo ralentizar rsync?


35

Estoy tratando de copiar el contenido de una unidad de memoria USB que falla. Si leo los datos demasiado rápido, el chip del controlador de la unidad se sobrecalienta y la unidad desaparece del sistema. Cuando eso sucede, necesito desconectar la unidad, esperar un minuto más o menos para que se enfríe, volver a enchufarla y reiniciar la copia.

Tengo una copia de seguridad antigua del contenido de la unidad, por lo que la forma obvia de obtener el resto de los datos es usarla rsyncpara actualizar la copia de seguridad, pero esto se ejecuta en el conjunto "leer demasiado rápido, la unidad desaparece , y necesito comenzar de nuevo "problema. ¿Hay alguna manera de decir rsyncque solo lea X ​​megabytes de datos por minuto? Alternativamente, ¿es posible decirle que suspenda las operaciones cuando la unidad desaparezca y que se reanude cuando se vuelva a enchufar?


24
¿Has pensado en enfriar el disco?
AEonAX

3
¿Qué tan lleno está el disco? Si la unidad está más del 50% llena, es probable que sea mejor reflejar primero la unidad defectuosa y luego comenzar a lidiar con cosas más complicadas en el espejo.
kasperd

1
@AEonAX: Si bien es una idea genial (sic!) Lista para usar, no recomendaría esto: está poniendo estrés térmico adicional en el dispositivo y puede fallar por completo.
Piskvor

Respuestas:


46

A diferencia de la experiencia de DopeGhoti, el --bwlimit indicador limita la transferencia de datos, con mi rsync (v3.1.2).

prueba:

$ 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

(nota: mi timesalida se ve diferente a la mayoría de las timeinvocaciones (zsh función), esas veces no fueron editadas por mí)

De lo contrario, tal vez algo en la línea de un doble -execadentro find. Yo creo que rsync -Rdeben crear y copiar las carpetas principales, pero si no es así, entonces cp --parentsdebería.

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

Nota : también echa un vistazo a ddrescue , podría ser justo lo que estás buscando :)


1
Sip. DG puede haberse confundido con la palabra "ancho de banda", pero eso se aplica a cualquier canal de transmisión de datos, no solo a la red. La página de manual dice específicamente: --bwlimit=KBPS limit I/O bandwidth; KBytes per secondno se menciona la red. Navegando casualmente el código, esto limita la velocidad de lectura , independientemente del destino. Además, anécdota: he estado usando esta opción durante años para limitar la velocidad de escritura de local a local. linux.die.net/man/1/rsync
Piskvor

1
Bien, en una segunda mirada, en realidad cuenta el número de bytes escritos y duerme durante un tiempo calculado. io.c, líneas 832-3: if (bwlimit_writemax) sleep_for_bwlimit(n);En cualquier caso, esto probablemente funcionaría según lo previsto, leyendo en ráfagas cortas y durmiendo en el medio. Recomendaría comenzar con un valor bajo y aumentar cuidadosamente, o simplemente dejar que la transferencia lenta se ejecute durante la noche.
Piskvor

25

Un poco como una solución MacGyver, pero he tenido un buen éxito en el pasado:
coloque un viejo concentrador USB 1 entre el dispositivo y la computadora. De ninguna manera se va a copiar rápido de esa manera :-)

Otra posibilidad: si tiene otro dispositivo disponible, colóquelo en otro puerto USB conectado al mismo concentrador raíz (para que comparta el ancho de banda con su dispositivo problemático).
Ahora comience una operación de escritura grande en el dispositivo adicional para que ambos dispositivos compitan por el ancho de banda. Para un mayor control, puede usar ionice para reducir aún más la prioridad en el problema.


1
Estoy seguro de que debería haber una manera de hacer que los puertos funcionen como USB 1.1 a través de una solución de software, posiblemente dando opciones al módulo del kernel USB.
André Borie

@ AndréBorie: Hay - bbs.archlinux.org/viewtopic.php?pid=1342593#p1342593 , pero dado que existen aceleradores efectivos en SW, esta es una solución de fuerza bruta.
Piskvor

@Piskvor negocia una velocidad de transferencia más baja con el dispositivo, tal como lo haría con un concentrador USB 1. No veo nada de "fuerza bruta" al respecto.
André Borie

De acuerdo, mala elección de palabra, lo admito. Pero los dispositivos de reconfiguración de la OMI requerirían privilegios especiales (root o al menos% adm), mientras que controlar la velocidad de lectura por proceso sería más simple. (Además, hay dispositivos que no funcionan fuera del USB 2.0, en violación de las especificaciones)
Piskvor

13

Puede usar rsync --bwlimit=RATEpara acelerar la velocidad de transferencia de archivos que, según los comentarios a continuación, parece funcionar específicamente al acelerar la velocidad de lectura de los datos, que es precisamente lo que está buscando.



3
ionice solo da prioridad, si dos cosas están leyendo, por defecto obtienen 50/50. ionice puede ajustar eso, pero si solo hay una cosa leyendo, obtendrá el 100%.
coteyr

@coteyr Tienes razón y es por eso que necesitas combinarlo con un segundo proceso de alimentación de ancho de banda en el mismo concentrador raíz USB. Mira mi respuesta.
Tonny

2
Afortunadamente, su respuesta es incorrecta: --bwlimitestablece el límite de E / S, no necesariamente un límite de red . Probado muchas veces en varios escenarios: esta opción hace que rsync se limite a sí mismo en la lectura , independientemente del destino. (Descubrí esto en un escenario similar, donde las escrituras rápidas en un dispositivo local lento los hicieron fallar)
Piskvor

1
@piskvor: ¡gracias por eso! Eso es lo que amo de este lugar; Sigo aprendiendo cosas nuevas (:
DopeGhoti

8

Más soluciones, además de rsync --bwlimit=100, para 100KiB / s.

  1. Úselo ddrescuecon la --max-read-rateopción para una copia completa del disco. Esto también le permitirá reiniciar una copia de disco completa donde la dejó después de un error.

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

ddrescuetambién tiene muchas otras opciones relevantes para la recuperación de datos, consulte el manual aquí .

  1. Use pv("visor de tuberías") con la --rate-limitopción, o la throttleherramienta para calificar las tuberías de límite. pvTambién puede mostrar progreso. Puede hacer que esto funcione para cualquier herramienta que use una tubería o pueda usar una tubería:

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

    o

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

    Eche un vistazo a la página de manual de pv para obtener más configuraciones y ejemplos. Para throttle, es posible que también desee probar la -wopción, que determina cómo se calcula la velocidad, consulte la página de manual del acelerador .


Ahora que es una herramienta útil, no lo sabía, ¡gracias! pvLa página de manual tiene aún más ejemplos de varios usos.
Piskvor

Lo he pvbuscado una y otra vez desde que lo descubrí en mis días de bromistas. Cuando el tar escribía en las unidades de cinta. :)
Dan Garthwaite
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.