Necesito escanear los archivos desde machineB
y machineC
hacia machineA
. Estoy ejecutando mi siguiente script de shell desde machineA
. He configurado las claves ssh correctamente.
Si los archivos no están en machineB
, entonces deberían estar en machineC
. Necesito mover todos los ARCHIVOS DE PARTICIÓN1 Y PARTICIÓN2 a la carpeta respectiva de la máquina, como se muestra a continuación en mi script de Shell:
#!/bin/bash
readonly PRIMARY=/export/home/david/dist/primary
readonly SECONDARY=/export/home/david/dist/secondary
readonly FILERS_LOCATION=(machineB machineC)
readonly MAPPED_LOCATION=/bat/data/snapshot
PARTITION1=(0 3 5 7 9)
PARTITION2=(1 2 4 6 8)
dir1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} ls -dt1 "$MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)
dir2=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[1]} ls -dt1 "$MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)
length1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} "ls '$dir1' | wc -l")
length2=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[1]} "ls '$dir2' | wc -l")
if [ "$dir1" = "$dir2" ] && [ "$length1" -gt 0 ] && [ "$length2" -gt 0 ]
then
rm -r $PRIMARY/*
rm -r $SECONDARY/*
for el in "${PARTITION1[@]}"
do
scp david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. || scp david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/.
done
for sl in "${PARTITION2[@]}"
do
scp david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/. || scp david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/.
done
fi
Actualmente, tengo 5 archivos en PARTICIÓN1 Y PARTICIÓN2, pero en general tendrá alrededor de 420 archivos, lo que significa que moverá los archivos uno por uno, lo que creo que puede ser bastante lento. ¿Hay alguna manera de acelerar el proceso?
Estoy ejecutando Ubuntu 12.04
Respuesta1
Paralelizar SCP es contraproducente, a menos que ambas partes se ejecuten en SSD. La parte más lenta de SCP está dentro de la red, en cuyo caso la paralelización no ayudará en absoluto, o los discos en ambos lados, lo que empeorará al paralelizar: el tiempo de búsqueda lo matará.
Usted dice que la máquina A está en SSD, por lo que la paralelización por máquina debería ser suficiente. La forma más sencilla de hacerlo es envolver el primer bucle for en un subshell y ponerlo en segundo plano.
( for el in "${PARTITION1[@]}"
do
scp david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. || scp david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/.
done ) &
Respuesta2
Podrías usar GNU Parallel para ayudarte a ejecutar múltiples tareas en paralelo.
Sin embargo, en su situación, parecería que está estableciendo una conexión segura separada para cada transferencia de archivos, lo que probablemente sea bastante ineficiente, especialmente si las otras máquinas no están en una red local.
El mejor enfoque sería utilizar una herramienta que realice específicamente la transferencia de archivos por lotes (por ejemplo, rsync
, que también puede funcionar con ssh simple).
Si rsync no está disponible, como alternativa, puede usar zip
, o incluso tar
y gzip
o bzip2
, y luego scp
los archivos resultantes (luego conéctese con ssh
y descomprima).
Respuesta3
Ya tuve un problema con scp, dos máquinas en la misma red con conexión Gigabit que se transferían muy lentamente a través de scp.
Si NO necesita cifrado, seguramente le resultará un poco útil utilizar ftp o nfs.
Descubrí que el problema era que una de las máquinas tenía RAM lenta y la parte de cifrado ssh era muy exigente para esta máquina. Usar ftp o nfs resolvió mi problema, pasé de 15-20 MB/s a más de 100 MBps.
[EDITAR]
Acabo de encontrar esto que usa el excelente rsync en lugar de scp. No resuelve todo tu problema pero podría ayudar.