Contempo: Respaldando y testeando: rsync, cp, gcp, pv, pycp

Respaldando y testeando: rsync, cp, gcp, pv, pycp

¿Quién es más rápido para respaldar archivos? ¿rsynccp, gcppv, o pycp?

Okey, el sábado se lanzó elementary OS Freya y tenía un notebook para renovar su OS, pero habían un montón de archivos por respaldar, y justo ahí empecé a indagar sobre qué es más rápido para copiar archivos a otros discos duros. Y puse a testear un archivo para ver quien ganaba la contienda.

Bondades


rsync se utiliza mucho para respaldar archivos modificados, no solo copia a ciegas, pone los más nuevos siempre a respaldar, sin estar gastando tiempo en cosas que ya fueron copiadas. Algo así como lo que hace Git. Con "cp -u" también se tiene una opción parecida, aunque rsync es más inteligente para respaldar. Con "rsync -Pa" se puede ver siempre la información de la transferencia. Y en rsync no usé la opción "-z" para comprimir datos (que se supone que acelera la transferencia, pero en realidad no), ya que utiliza demasiado procesamiento.

A pesar de que pv no fue hecho para copiar, sirve como mediador de transferencias mientras copia, y muestra información al igual que rsync. Por otro lado, cp se comporta más inteligente que pv al copiar, ya que no hay que dar el nombre del destinatario, solo la ruta de directorio, pero cp no muestra información de transferencias. pycp puede copiar carpetas sin opciones y muestra información de transferencias. gcp es otro que muestra información de transferencias, se comporta igual que cp en sus opciones.

Tiempo de transferencia


Hice unas transferencias/copias localmente. En un computador con elementary OS Freya 64-bit ya instalado, el disco duro formateado en Ext4, y un archivo de 1,8 GB para testear. Después conecté el disco duro externo (HDD portátil) por USB 2.0 formateado en NTFS y le transferí el archivo:

  • cp 30s (local) - 56s (externa)
  • pv 30s (local) - 56s (externa)
  • gcp 31s (local) - 57s (externa)
  • pycp 52s (local) - 1m 3s (externa)
  • rsync 1m 7s (local) - 1m 15s (externa)

Localmente cp, pv y gcp fueron rápidos al transferir el archivo de 1,8 GB (gracias a time pude medir el tiempo de cp, el cual no entrega esa información). Pero pycp sacó el tercer lugar en tiempo, y rsync fue humillado en una esquina. Externamente cp, pv y gcp se relentizaron un poco, a pesar de que hicieron buenos tiempo. Pero le echo la culpa al driver NTFS para montar el HDD portátil para escribir en la unidad.

Velocidad de trasferencia


Ahora los datos de transferencia promedio, a veces bajaban y subían:

  • cp 51MB/s (local) - 27MB/s (externa)
  • pv 49MB/s (local) - 27MB/s (externa)
  • gcp 50MB/s (local) - 27MB/s (externa)
  • pycp 35MB/s (local) - 29MB/s (externa)
  • rsync 26MB/s (local) - 23MBs (externa)

Gracias a iotop pude monitorear las transferencias de cp (cp no entrega esa información), y al igual que pv transfirió redondeando los 50 MB/s, a veces marcaba hasta 70 MB/s al igual que gcp. Pero cp, pv y gcp externamente marcaron casi todo el trayecto unos 27 MB/s promedio. De nuevo pycp sacó el tercer lugar. Y como rsync sacó los tiempos más lentos, también sacó la velocidad de transferencia más lenta.

Procesamiento


Ahora veremos el procesamiento que utiliza cada uno en la CPU, externamente fueron más fijos pero altos que localmente:

  • cp 25% a 45% (local) - 51% (externa)
  • pv 25% a 47% (local) - 54% (externa)
  • pycp 30% a 50% (local) - 70% (externa)
  • gcp 30% a 80% (local) - 80% (externa)
  • rsync 60% a 78% (local) - 84% (externa)

Al monitorear los procesos con htop, rsync mostraba siempre un doble proceso localmente, y externamente me mostró tres procesos, el tercero era la unidad escribiendo datos. Con cp y pv fue decente, no sobrepasaron nunca la mitad, y a veces llegaban bajo el 20%. Pero al contrario gcp frecuentemente subía al 80% y bajaba al 30% repetidas veces. rsync no bajaba de la mitad, ouch. Externamente, lo que pasó con rsync no todo es su culpa, había un proceso del driver NTFS que lo empujó y ocupaba a veces como 30% el montado del HDD portátil. Lo mismo va para gcp externamente, eran dos procesos de 35% y 40%, el segundo eran los datos escribiendo en la unidad externa. Y además cp al principio apuntó 90% pero luego se mantuvo estable. pv pasó por lo mismo del proceso doble externamente, esos procesos eran bash y la unidad montada escribiendo. pycp se mantuvo digno localmente aunque no por mucho, y también consumió cpu externamente, aunque no tanta como rsync.

En fin. rsync será muy inteligente para respaldar y mostrar información, pero cp es muy rápido y puede copiar sin dar nombres de destinatarios como no lo hace pv, aunque los dos son rápidos y eficientes en procesamiento. gcp es muy rápido para copiar y mostrar información a la vez, usa las mismas opciones que cp pero en procesamiento se comporta medio extraño. Y pycp al menos le ganó a rsync pero no a los otros (¿culpa de Python?). Pero también si vas a copiar millones de archivos en terabytes usando cp de una sola tirada, mejor piénsalo y hazlo por secciones.

No probé scp, ya que dicen que es jodidamente lento. Y ya es conocido que rsync utiliza mucho procesamiento. Pensaba testear mv quizá, pero mv no copia, solo mueve, y no sería lo mismo. Pueden ver los comandos productivos para saber como se usan.