Benchmark: cp vs tar vs cpio vs rsync

, , 2 comments
Aquí estoy otra vez, para hacer honor a mi impredecible agenda de publicación. Hoy voy a escribir algo muy cortito, y con una novedad: ¡benchmarks! A todo el mundo le gustan los benchmarks. Son como porno con números.

É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

Tuve que hacer un script para sacar esos datos. Fijaos cuánto trabajo me dais.

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.


2 comentarios:

  1. Mola! Me apunto lo del tar :)

    Por 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é.

    ResponderEliminar
    Respuestas
    1. Pues de hecho, probé varias veces, por si acaso :-) El resultado variaba, pero poco: unos 10 segundos arriba o abajo, como mucho.

      ¡Gracias por el comentario!

      Eliminar