Actualmente estoy teniendo problemas con dd
invocado con un archivo disperso como input ( if
) y un archivo como output ( of
) con conv=sparse
. dd
parece estar usando un núcleo de la CPU ( Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz
4 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 dd
yman dd
y parece que hay función incorporada en la versión de 8,23 corutils - comprobando
sgp_dd
desde elsg3-utils
paquete (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
parallel
Se 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).
fuente
dd
acapara la CPU por defecto debido al pequeño tamaño de bloque. hazlo más grande, comobs=1M
.Respuestas:
Probado en Bash:
Probablemente necesite ajustar 1000.
fuente
Un fragmento de código personalizado, no probado que viene:
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 elcount=
parámetro no es estrictamente necesario.fuente
conv=notrunc
conv=notrunc
está implícito enseek=
un valor positivo.