Éste en concreto viene de mi adquisición de un disco duro SSD para casa. Cada vez que cambio de disco tengo que copiar los datos viejos de un disco a otro, y siempre me pregunto cuál es la forma más eficiente. He usado varias a lo largo de los años, pero nunca me había puesto a comprobar cuál era la mejor. Hoy, aprovechando que tenía que mover unos GB de un sitio a otro (para reorganizar los datos de mis varios discos duros; tengo síndrome de Diógenes digital), lo he hecho, y pongo por aquí los resultados.
Antes de nada, aclarar que esto no ha sido un benchmark "de laboratorio". He probado varias formas de copiar los mismos datos y he puesto un "time" antes de cada comando para ver qué tiempos salían. No he reiniciado antes de cada prueba, ni usado sistemas de ficheros distintos por si algún comando era más rápido en uno que en otro, ni nada parecido. Ha sido una prueba de andar por casa. Para pruebas serias, id a otro sitio.
Escenario
Los ficheros que he copiado son los que están en mi directorio "incoming", que es donde pongo todo lo que me descargo de Internet y ficheros que luego borraré o moveré a otro sitio. En total, 12GB con una distribución de tamaños que pongo a continuación:
0KB-128KB: 154
128KB-512KB: 50
512KB-1MB: 77
1MB-10MB: 344
10MB-100MB: 340
100MB-1GB: 2
>1GB: 1
Los datos los moví de un disco duro de 1TB a otro que tengo de 200GB, un viejo luchador que sigue dando guerra a pesar de que lo tengo desde hace muchos años y ha pasado por cuatro o cinco ordenadores diferentes. Un día de éstos morirá, así que no pongo en él nada que sea demasiado importante.
Resultados
Todos los resultados se hicieron entrando primero en el directorio origen. Primero usé lo más fácil, cp. Ésta fue la línea de comandos y los tiempos:
# time cp -a * /destino/
real 4m4.478s
user 0m0.186s
sys 0m41.427s
A continuación usé tar, que es lo que había leído por ahí que era más rápido. Los datos se pasan por un pipe de un proceso que lee a otro que escribe. Comando y resultados:
# time tar c . | (cd /destino/ ; tar x)
real 3m34.715s
user 0m2.209s
sys 1m25.936s
Unos 30 segundos de diferencia, que aunque no es mucho, podría ser más si hubiera más datos a copiar. El tiempo de sistema es bastante más alto: tardamos menos a base de exprimir un poco más el equipo.
Ahora veamos rsync:
# time rsync -av . /destino/
real 6m3.746s
user 3m56.847s
sys 2m11.127s
Mucho peor que tar, y bastante peor que cp. Además, fijaos en que no sólo tarda más en total, sino que el tiempo de sistema es más alto que el de tar. La gran ventaja de rsync es que nos permitiría interrumpir la copia y retomarla donde la habíamos dejado, algo que no podemos hacer ni con tar ni con cp. Y también podríamos usarlo para sincronizar un directorio con otro, por si hubiéramos actualizado el origen pero no el destino. En resumen: malo si tenemos que copiar todos los datos, bueno si sólo queremos copiar las diferencias.
El último contendiente es cpio:
# time find . -xdev | cpio -pvmd /destino
real 4m46.775s
user 0m6.575s
sys 1m15.035s
Los resultados están entre los de cp y los de rsync, aunque por debajo de los de tar. Puede que este comando no sea el más óptimo, porque dependemos de lo que tarde find en generar un listado de ficheros. Para comprobar si este factor era importante, pasé el resultado a un fichero y luego usé otra vez cpio, pasándole los datos de ese fichero en lugar de la salida de find. Es decir, esto:
# find . -xdev > /tmp/list.txt
# time cat /tmp/list.txt | cpio -pvmd /destino
real 4m6.589s
user 0m7.111s
sys 1m20.305s
Y sí, la cosa mejora bastante. El tiempo es como el de cp, más o menos. Moraleja: cuidado con los comandos que dependen de otros.
Veredicto
tar es el ganador de este benchmark. Una herramienta hecha hace 30 años sigue siendo la mejor después de tanto tiempo. O al menos, la mejor en este caso. Sería interesante repetir la prueba con más datos: 12 GB no es tanto, en los tiempos que corren.
Nada más por hoy. La próxima vez que tengáis que pasar datos de un sitio a otro, ya sabéis qué podéis usar.
Mola! Me apunto lo del tar :)
ResponderEliminarPor curiosidad, si ejecutas cp un par de veces, sigue dando la misma velocidad? Me pregunto si al haber sido el primero que probaste, está en desventaja por temas de caché.
Pues de hecho, probé varias veces, por si acaso :-) El resultado variaba, pero poco: unos 10 segundos arriba o abajo, como mucho.
Eliminar¡Gracias por el comentario!
Hi,
ResponderEliminarVery useful data.
So, will request you to publish the blog in English if possible, then it will be a bit more helpful, for us, who are not good in Spanish
thank you.