¿Cómo paralelizar dd?

10

Actualmente estoy teniendo problemas con ddinvocado con un archivo disperso como input ( if) y un archivo como output ( of) con conv=sparse. ddparece estar usando un núcleo de la CPU ( Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz4 núcleos + 4 Intel Hyperthreads) solo (100% de 1 núcleo), por lo que me he estado preguntando si es posible hacer paralelo dd. He estado

  • buscando en info ddy man ddy parece que hay función incorporada en la versión de 8,23 corutils
  • comprobando sgp_dddesde el sg3-utilspaquete (sin entender si satisface mis necesidades), pero no parece ser capaz de manejar archivos dispersos
  • dcfldd no parece tener capacidades de paralelización

hasta donde se

  • Se prefiere una versión / fork mejorada con manejo interno de partes del programa en múltiples hilos (evite cambios de contexto que maten el rendimiento de E / S) en lugar de
  • parallelSe prefiere una solución con GNU ejecutándose localmente sobre
  • un fragmento de código personalizado (posiblemente no probado)

¿Cómo evitar que la CPU sea el cuello de botella de una operación intensiva de E / S? Me gustaría ejecutar el comando en Ubuntu 14.04 con Linux 3.13 y manejar imágenes de disco de archivos dispersos con él en cualquier sistema de archivos que admita archivos dispersos (al menos la solución no debería estar vinculada a un sistema de archivos específico).

Antecedentes: estoy tratando de crear una copia del archivo disperso de 11 TB (que contiene aproximadamente 2 TB de datos) en un zfs (versión inestable de zfsonlinux 0.6.4, posiblemente con errores y la causa del cuello de botella de la CPU (eventualmente búsqueda de agujeros lenta)). Eso no debería cambiar nada para la cuestión de cómo paralelizar dd (de una manera muy genérica).

Karl Richter
fuente
No veo lo que podría obtener de esto, ya que esta operación está vinculada a E / S, excepto en casos extremos. En mi opinión, la mejor opción sería un programa que sea poco consciente, por ejemplo, algo como xfs_copy . Su página de manual menciona: "Sin embargo, si el archivo se crea en un sistema de archivos XFS, el archivo consume aproximadamente la cantidad de espacio realmente utilizado en el sistema de archivos fuente por el sistema de archivos y el registro XFS. El ahorro de espacio se debe a que xfs_copy busca bloques libres en lugar de copiarlos y el sistema de archivos XFS admite archivos dispersos de manera eficiente ".
Cristian Ciupitu
@mikeserv No entiendo tu comentario ...
Karl Richter
@CristianCiupitu Bueno, en mi caso, la CPU es el cuello de botella, no me preguntes por qué, porque no lo sé. Su respuesta me hizo darme cuenta de que la solución debería admitir múltiples sistemas de archivos (capaz de manejar archivos dispersos) (editado)
Karl Richter
¿Qué CPU y sistema de archivos tienes? ¿Qué tan grande es el archivo (longitud y bloques)?
Cristian Ciupitu
44
ddacapara la CPU por defecto debido al pequeño tamaño de bloque. hazlo más grande, como bs=1M.
frostschutz

Respuestas:

4

Probado en Bash:

INFILE=in
seq 0 1000 $((`stat --format %s $INFILE` /100000 )) |
  parallel -k dd if=$INFILE bs=100000 skip={} conv=sparse seek={} count=1000 of=out

Probablemente necesite ajustar 1000.

Ole Tange
fuente
2

Un fragmento de código personalizado, no probado que viene:

dd if=oldf conv=sparse bs=1k                 count=3000000000                 of=newf &
dd if=oldf conv=sparse bs=1k skip=3000000000 count=3000000000 seek=3000000000 of=newf &
dd if=oldf conv=sparse bs=1k skip=6000000000 count=3000000000 seek=6000000000 of=newf &
dd if=oldf conv=sparse bs=1k skip=9000000000 count=3000000000 seek=9000000000 of=newf &
wait

Esto debería dividir lógicamente el archivo en cuatro fragmentos de 3 TB y procesarlos en paralelo. ( skip=salta los bloques de entrada; seek=busca bloques de salida). El cuarto comando, por supuesto, leerá hasta el final del archivo anterior, por lo que el count=parámetro no es estrictamente necesario.

G-Man dice 'restablecer a Mónica'
fuente
También pensé en algo así, pero no pude entender cómo convertirlo en una solución genérica para archivos de tamaño arbitrario (el fondo de la pregunta no debería haber influido en mi solicitud de una solución genérica)
Karl Richter
No entiendo lo que dices. Acabo de tomar el tamaño indicado de su archivo y dividido por el número de núcleos. Eso puede hacerse trivialmente mediante un script.
G-Man dice 'reinstalar a Monica' el
3
probablemente también necesitaconv=notrunc
frostschutz
@frostschutz: Tal vez solo el primero. Aunque no puedo encontrar esto documentado, mis pruebas indican que conv=notruncestá implícito en seek=un valor positivo.
G-Man dice 'reinstalar a Monica' el
1
no, buscar no implica no ejecutar.
frostschutz