Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se proporcionan instrucciones detalladas para copiar datos manualmente en un contenedor de Blob Storage para su uso con Azure HPC Cache. Usa operaciones paralelas multiproceso para optimizar la velocidad de copia.
Para más información sobre cómo mover datos a Blob Storage para Azure HPC Cache, lea Traslado de datos a Azure Blob Storage.
Ejemplo de copia simple
Puede crear manualmente una copia multiproceso en un cliente ejecutando más de un comando de copia a la vez en segundo plano en conjuntos predefinidos de archivos o rutas de acceso.
El comando Linux/UNIX cp incluye el argumento -p para conservar la propiedad y los metadatos de mtime. Agregar este argumento a los comandos siguientes es opcional. (Agregar el argumento aumenta el número de llamadas del sistema de archivos enviadas desde el cliente al sistema de archivos de destino para la modificación de metadatos).
En este ejemplo sencillo se copian dos archivos en paralelo:
cp /mnt/source/file1 /mnt/destination1/ & cp /mnt/source/file2 /mnt/destination1/ &
Después de emitir este comando, el jobs comando mostrará que se están ejecutando dos subprocesos.
Copia de datos con nombres de archivo predecibles
Si los nombres de archivo son predecibles, puede usar expresiones para crear subprocesos de copia paralelos.
Por ejemplo, si el directorio contiene 1000 archivos numerados secuencialmente de 0001 a 1000, puede usar las siguientes expresiones para crear 10 subprocesos paralelos que cada uno copie 100 archivos:
cp /mnt/source/file0* /mnt/destination1/ & \
cp /mnt/source/file1* /mnt/destination1/ & \
cp /mnt/source/file2* /mnt/destination1/ & \
cp /mnt/source/file3* /mnt/destination1/ & \
cp /mnt/source/file4* /mnt/destination1/ & \
cp /mnt/source/file5* /mnt/destination1/ & \
cp /mnt/source/file6* /mnt/destination1/ & \
cp /mnt/source/file7* /mnt/destination1/ & \
cp /mnt/source/file8* /mnt/destination1/ & \
cp /mnt/source/file9* /mnt/destination1/
Copia de datos con nombres de archivo no estructurados
Si la estructura de nomenclatura de archivos no es predecible, puede agrupar archivos por nombres de directorio.
En este ejemplo se recopilan directorios completos para enviar a cp comandos que se ejecutan como tareas en segundo plano:
/root
|-/dir1
| |-/dir1a
| |-/dir1b
| |-/dir1c
|-/dir1c1
|-/dir1d
Una vez recopilados los archivos, puede ejecutar comandos de copia en paralelo para copiar de forma recursiva los subdirectorios y todo su contenido:
cp /mnt/source/* /mnt/destination/
mkdir -p /mnt/destination/dir1 && cp /mnt/source/dir1/* mnt/destination/dir1/ &
cp -R /mnt/source/dir1/dir1a /mnt/destination/dir1/ &
cp -R /mnt/source/dir1/dir1b /mnt/destination/dir1/ &
cp -R /mnt/source/dir1/dir1c /mnt/destination/dir1/ & # this command copies dir1c1 via recursion
cp -R /mnt/source/dir1/dir1d /mnt/destination/dir1/ &
Cuándo agregar puntos de montaje
Después de tener suficientes subprocesos paralelos que van en un único punto de montaje del sistema de archivos de destino, habrá un punto en el que agregar más subprocesos no proporciona más rendimiento. (El rendimiento se medirá en archivos/segundo o bytes/segundo, en función del tipo de datos). O peor, la sobreproceso puede provocar a veces una degradación del rendimiento.
Cuando esto sucede, puede agregar puntos de montaje del lado cliente a otras direcciones de montaje de Azure HPC Cache mediante la misma ruta de montaje del sistema de archivos remoto:
10.1.0.100:/nfs on /mnt/sourcetype nfs (rw,vers=3,proto=tcp,addr=10.1.0.100)
10.1.1.101:/nfs on /mnt/destination1type nfs (rw,vers=3,proto=tcp,addr=10.1.1.101)
10.1.1.102:/nfs on /mnt/destination2type nfs (rw,vers=3,proto=tcp,addr=10.1.1.102)
10.1.1.103:/nfs on /mnt/destination3type nfs (rw,vers=3,proto=tcp,addr=10.1.1.103)
Agregar puntos de montaje cliente le permite ejecutar comandos de copia adicionales en los puntos de montaje adicionales /mnt/destination[1-3], para aumentar el paralelismo.
Por ejemplo, si los archivos son muy grandes, puede definir los comandos de copia para usar rutas de acceso de destino distintas, enviando más comandos en paralelo desde el cliente que realiza la copia.
cp /mnt/source/file0* /mnt/destination1/ & \
cp /mnt/source/file1* /mnt/destination2/ & \
cp /mnt/source/file2* /mnt/destination3/ & \
cp /mnt/source/file3* /mnt/destination1/ & \
cp /mnt/source/file4* /mnt/destination2/ & \
cp /mnt/source/file5* /mnt/destination3/ & \
cp /mnt/source/file6* /mnt/destination1/ & \
cp /mnt/source/file7* /mnt/destination2/ & \
cp /mnt/source/file8* /mnt/destination3/ & \
En el ejemplo anterior, los tres puntos de montaje de destino están siendo utilizados por los procesos de copia de archivos del cliente.
Cuándo agregar clientes
Por último, cuando haya alcanzado las funcionalidades del cliente, agregar más subprocesos de copia o puntos de montaje adicionales no producirá ningún aumento adicional de archivos por segundo o bytes por segundo. En esa situación, puede implementar otro cliente con el mismo conjunto de puntos de montaje que ejecutarán sus propios conjuntos de procesos de copia de archivos.
Ejemplo:
Client1: cp -R /mnt/source/dir1/dir1a /mnt/destination/dir1/ &
Client1: cp -R /mnt/source/dir2/dir2a /mnt/destination/dir2/ &
Client1: cp -R /mnt/source/dir3/dir3a /mnt/destination/dir3/ &
Client2: cp -R /mnt/source/dir1/dir1b /mnt/destination/dir1/ &
Client2: cp -R /mnt/source/dir2/dir2b /mnt/destination/dir2/ &
Client2: cp -R /mnt/source/dir3/dir3b /mnt/destination/dir3/ &
Client3: cp -R /mnt/source/dir1/dir1c /mnt/destination/dir1/ &
Client3: cp -R /mnt/source/dir2/dir2c /mnt/destination/dir2/ &
Client3: cp -R /mnt/source/dir3/dir3c /mnt/destination/dir3/ &
Client4: cp -R /mnt/source/dir1/dir1d /mnt/destination/dir1/ &
Client4: cp -R /mnt/source/dir2/dir2d /mnt/destination/dir2/ &
Client4: cp -R /mnt/source/dir3/dir3d /mnt/destination/dir3/ &
Crear manifiestos de archivo
Después de comprender los enfoques anteriores (varios subprocesos de copia por destino, varios destinos por cliente, varios clientes por sistema de archivos de origen accesible para la red), tenga en cuenta esta recomendación: Compilar manifiestos de archivo y, a continuación, usarlos con comandos de copia en varios clientes.
En este escenario se usa el comando UNIX find para crear manifiestos de archivos o directorios:
user@build:/mnt/source > find . -mindepth 4 -maxdepth 4 -type d
./atj5b55c53be6-01/support/gsi/2018-07-22T21:12:06EDT
./atj5b55c53be6-01/support/pcap/2018-07-23T01:34:57UTC
./atj5b55c53be6-01/support/trace/rolling
./atj5b55c53be6-03/support/gsi/2018-07-22T21:12:06EDT
./atj5b55c53be6-03/support/pcap/2018-07-23T01:34:57UTC
./atj5b55c53be6-03/support/trace/rolling
./atj5b55c53be6-02/support/gsi/2018-07-22T21:12:06EDT
./atj5b55c53be6-02/support/pcap/2018-07-23T01:34:57UTC
./atj5b55c53be6-02/support/trace/rolling
Redirigir este resultado a un archivo: find . -mindepth 4 -maxdepth 4 -type d > /tmp/foo
A continuación, puede recorrer en iteración el manifiesto mediante comandos BASH para contar archivos y determinar los tamaños de los subdirectorios:
ben@xlcycl1:/sps/internal/atj5b5ab44b7f > for i in $(cat /tmp/foo); do echo " `find ${i} |wc -l` `du -sh ${i}`"; done
244 3.5M ./atj5b5ab44b7f-02/support/gsi/2018-07-18T00:07:03EDT
9 172K ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-18T05:01:00UTC
124 5.8M ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-19T01:01:01UTC
152 15M ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-20T01:01:00UTC
131 13M ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-20T21:59:41UTC_partial
789 6.2M ./atj5b5ab44b7f-02/support/gsi/2018-07-20T21:59:41UTC
134 12M ./atj5b5ab44b7f-02/support/gsi/stats_2018-07-20T22:22:55UTC_hpccache_catchup
7 16K ./atj5b5ab44b7f-02/support/pcap/2018-07-18T17:12:19UTC
8 83K ./atj5b5ab44b7f-02/support/pcap/2018-07-18T17:17:17UTC
575 7.7M ./atj5b5ab44b7f-02/support/cores/armada_main.2000.1531980253.gsi
33 4.4G ./atj5b5ab44b7f-02/support/trace/rolling
281 6.6M ./atj5b5ab44b7f-01/support/gsi/2018-07-18T00:07:03EDT
15 182K ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-18T05:01:00UTC
244 17M ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-19T01:01:01UTC
299 31M ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-20T01:01:00UTC
256 29M ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-20T21:59:41UTC_partial
889 7.7M ./atj5b5ab44b7f-01/support/gsi/2018-07-20T21:59:41UTC
262 29M ./atj5b5ab44b7f-01/support/gsi/stats_2018-07-20T22:22:55UTC_hpccache_catchup
11 248K ./atj5b5ab44b7f-01/support/pcap/2018-07-18T17:12:19UTC
11 88K ./atj5b5ab44b7f-01/support/pcap/2018-07-18T17:17:17UTC
645 11M ./atj5b5ab44b7f-01/support/cores/armada_main.2019.1531980253.gsi
33 4.0G ./atj5b5ab44b7f-01/support/trace/rolling
244 2.1M ./atj5b5ab44b7f-03/support/gsi/2018-07-18T00:07:03EDT
9 158K ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-18T05:01:00UTC
124 5.3M ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-19T01:01:01UTC
152 15M ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-20T01:01:00UTC
131 12M ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-20T21:59:41UTC_partial
789 8.4M ./atj5b5ab44b7f-03/support/gsi/2018-07-20T21:59:41UTC
134 14M ./atj5b5ab44b7f-03/support/gsi/stats_2018-07-20T22:25:58UTC_hpccache_catchup
7 159K ./atj5b5ab44b7f-03/support/pcap/2018-07-18T17:12:19UTC
7 157K ./atj5b5ab44b7f-03/support/pcap/2018-07-18T17:17:17UTC
576 12M ./atj5b5ab44b7f-03/support/cores/armada_main.2013.1531980253.gsi
33 2.8G ./atj5b5ab44b7f-03/support/trace/rolling
Por último, debe elaborar los comandos efectivos de copia de archivos hacia los clientes.
Si tiene cuatro clientes, use este comando:
for i in 1 2 3 4 ; do sed -n ${i}~4p /tmp/foo > /tmp/client${i}; done
Si tiene cinco clientes, use algo parecido a esto:
for i in 1 2 3 4 5; do sed -n ${i}~5p /tmp/foo > /tmp/client${i}; done
Y para seis... extrapolar cuando sea necesario.
for i in 1 2 3 4 5 6; do sed -n ${i}~6p /tmp/foo > /tmp/client${i}; done
Obtendrá N archivos resultantes, uno para cada uno de los clientes N que tenga los nombres de ruta de acceso a los directorios de nivel cuatro obtenidos como parte de la salida del find comando.
Use cada archivo para compilar el comando copy:
for i in 1 2 3 4 5 6; do for j in $(cat /tmp/client${i}); do echo "cp -p -R /mnt/source/${j} /mnt/destination/${j}" >> /tmp/client${i}_copy_commands ; done; done
Esto le dará N archivos, cada uno con un comando de copia por línea, que pueden ejecutarse como un script de BASH en el cliente.
El objetivo es ejecutar varios subprocesos de estos scripts simultáneamente por cliente en paralelo en varios clientes.