Copia de archivo paralelo

9

Tengo una lista de archivos que necesito copiar en un sistema Linux: cada archivo tiene un tamaño de 10 a 100 GB.

Solo quiero copiar al sistema de archivos local. ¿Hay alguna manera de hacer esto en paralelo, con múltiples procesos cada uno responsable de copiar un archivo, de una manera simple ?

Puedo escribir fácilmente un programa multiproceso para hacer esto, pero estoy interesado en averiguar si hay un método Linux de bajo nivel para hacerlo.

Jon
fuente
1
La copia de archivos paralelos no traerá una aceleración significativa. (Al menos en teoría no debería).
Tarnay Kálmán
superuser.com/questions/327659/… || unix.stackexchange.com/questions/165256/…
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
1
@ TarnayKálmán a menos que tenga un sistema de archivos de estilo agrupado, superpuesto, RAID o "sin miedo", o cualquiera de los anteriores en una red de latencia relativamente alta u ocupada; o una carga de trabajo donde la latencia por archivo es una parte significativa del tiempo de copia para ese archivo (1e5 + archivos muy pequeños, backends con contenido de contenido, etc.). El procesamiento concurrente sería extremadamente útil en tales situaciones.
rvalue

Respuestas:

11

Si su sistema no se ve afectado por él (por ejemplo, tal vez los archivos están en caché), entonces GNU Parallel http://www.gnu.org/software/parallel/ puede funcionar para usted:

find . -print0 | parallel -0 -j10 cp {} destdir

Esto ejecutará 10 cps simultáneos .

Pro: es simple de leer.

Con: GNU Parallel no es estándar en la mayoría de los sistemas, por lo que probablemente tenga que instalarlo.

Mire el video de introducción para obtener más información: http://www.youtube.com/watch?v=OpaiGYxkSuQ

Vea también https://oletange.wordpress.com/2015/07/04/parallel-disk-io-is-it-faster/ para una discusión sobre E / S de disco paralelo.

Ole Tange
fuente
3

No existe un mecanismo de bajo nivel para esto por una razón muy simple: hacerlo destruirá el rendimiento de su sistema. Con las unidades de disco, cada escritura competirá por la colocación del cabezal, lo que dará lugar a una gran espera de E / S. Con los SSD, esto terminará saturando uno o más de los buses de su sistema, causando otros problemas.

Ignacio Vazquez-Abrams
fuente
Err que no parece ser el caso con un único cp en la actualidad, estoy seguro de que hay un término medio para los paralela múltiple "del CP" a la que usted es de E / S de canal no se convierta completamente saturado ...
Jon
1
Un autobús saturado es un autobús feliz. El ancho de banda inactivo es ancho de banda desperdiciado.
rvalue
3

Como se mencionó, esta es una idea terrible. Pero creo que todos deberían poder implementar sus propios planes horribles, así que ...

for FILE in *;do cp $FILE <destination> &;done

El asterisco se puede reemplazar con una expresión regular de sus archivos, o $(cat <listfile>)si los tiene todos en un documento de texto. El ampersand inicia un comando en segundo plano, por lo que el bucle continuará, generando más copias.

Como se mencionó, esto aniquilará completamente su IO. Entonces ... Realmente no recomendaría hacerlo.

--Christopher Karel

Christopher Karel
fuente
3

La única respuesta que no destruirá la capacidad de respuesta de su máquina no es exactamente una 'copia', sino que es muy rápida. Si no va a editar los archivos en la ubicación nueva o antigua, entonces un enlace duro es efectivamente como una copia, y (solo) si está en el mismo sistema de archivos, se crean muy, muy, muy rápido.

Echa un vistazo cp -ly mira si funcionará para ti.

Slartibartfast
fuente
2

Aquí hay una herramienta de copia de archivos distribuida / paralela y descentralizada que fragmentará el archivo y copiará todos los fragmentos en paralelo. Probablemente solo lo ayudará si tiene un SSD que admite múltiples transmisiones o algún tipo de configuración con múltiples cabezales de disco.

https://github.com/hpc/dcp

Jon Bringhurst
fuente
1

Para las personas que piensan que no es una gran idea, diría que depende. Puede tener un gran sistema de incursiones o un sistema de archivos paralelo que ofrecerá un rendimiento realmente mejor que el que puede manejar un proceso de cp. Entonces sí, debe usar una "herramienta paralela".

Tomemos este ejemplo:

timeout 10 strace -e write -c cp /dev/zero /dev/null
strace: Process 24187 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00    0.655188           4    166222           write
------ ----------- ----------- --------- --------- ----------------
100.00    0.655188                166222           total

luego esto

timeout 0.01 strace -e write  cp /dev/zero /dev/null
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
write(4, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 65536) = 65536
strace: Process 24567 detached

por lo que cada escritura de syscall realizada por "cp" en este caso es de 64 KB y durante 10 segundos en mi sistema puedo entregar este ancho de banda: 65536 * 166222/10 = 1089352499 = ~ 1,08 GB / s

Ahora, iniciemos esta carga de trabajo con 2 procesos (tengo 4 núcleos pero mi escritorio se usa para otras cosas, y aquí es solo un ejemplo):

timeout 10 strace -e write -c cp /dev/zero /dev/null & timeout 10 strace -e write -c cp /dev/zero /dev/null &  wait
[1] 26106
[2] 26107
strace: Process 26113 detached
strace: Process 26112 detached
% time     seconds  usecs/call     calls    errors syscall
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
------ ----------- ----------- --------- --------- ----------------
100.00    0.624108           4    162616           write
100.00    0.638468           4    162451           write
------ ----------- ----------- --------- --------- ----------------
100.00    0.624108                162616           total
100.00    0.638468                162451           total
------ ----------- ----------- --------- --------- ----------------
[1]-  Exit 124                timeout 10 strace -e write -c cp /dev/zero /dev/null

Así que vemos que podemos casi duplicar el rendimiento usando 2 núcleos para lanzar esto.

Entonces, si estamos en un contexto diferente de 1xHard drive a 1xHard drive pero una matriz de incursión (o NVMe múltiple, así que no es el caso más común, estoy de acuerdo, pero trabajo en esto todos los días), muestra definitivamente un mejor rendimiento para usar múltiples comunes en paralela.

johann peyrard
fuente
-1

Deberías probar esto:

    $ seq 3 | paralelo cp -v / etc / passwd passwd {}

Esto copiará el archivo passwd 3 veces desde el directorio / etc / a su $ HOME

O si su archivo está en su directorio de inicio

    $ seq 3 | cp -v passwd paralelo {, {}}

Esto copiará el archivo passwd 3 veces en su $ HOME

usuario3749113
fuente