linux - permission - ¿Cómo copiar archivos lo más rápido posible?
scp tutorial (5)
Estoy ejecutando mi script de shell en machineA
que copia los archivos de machineB
y machineC
en machineA
.
Si el archivo no está allí en machineB
, entonces debería estar allí en machineC
seguro. Así que primero intentaré copiar desde la machineB
, si no está allí en la machineB
entonces iré a la machineC
para copiar los mismos archivos.
En machineB
y machineC
habrá una carpeta como esta YYYYMMDD
dentro de esta carpeta -
/data/pe_t1_snapshot
Así que cualquiera que sea la fecha es la última fecha en este formato YYYYMMDD
dentro de la carpeta de arriba - Seleccionaré esa carpeta como la ruta completa desde donde necesito comenzar a copiar los archivos -
así que supongamos que si esta es la última carpeta de fecha 20140317
dentro /data/pe_t1_snapshot
, esta será la ruta completa para mí:
/data/pe_t1_snapshot/20140317
desde donde necesito comenzar a copiar los archivos en machineB
y machineC
. Necesito copiar alrededor de 400
archivos en machineA
desde machineB
y machineC
y cada tamaño de archivo es de 1.5 GB
.
Actualmente tengo mi script de shell inferior que funciona bien ya que estoy usando scp
pero de alguna manera toma ~ 2 hours
copiar los 400
archivos en machineA que es demasiado largo para mí, supongo. :(
A continuación está 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 MEMORY_MAPPED_LOCATION=/data/pe_t1_snapshot
PRIMARY_PARTITION=(0 3 5 7 9) # this will have more file numbers around 200
SECONDARY_PARTITION=(1 2 4 6 8) # this will have more file numbers around 200
dir1=$(ssh -o "StrictHostKeyChecking no" david@${FILERS_LOCATION[0]} ls -dt1 "$MEMORY_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 "$MEMORY_MAPPED_LOCATION"/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] | head -n1)
echo $dir1
echo $dir2
if [ "$dir1" = "$dir2" ]
then
# delete all the files first
find "$PRIMARY" -mindepth 1 -delete
for el in "${PRIMARY_PARTITION[@]}"
do
scp -o ControlMaster=auto -o ''ControlPath=~/.ssh/control-%r@%h:%p'' -o ControlPersist=900 david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. || scp -o ControlMaster=auto -o ''ControlPath=~/.ssh/control-%r@%h:%p'' -o ControlPersist=900 david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/.
done
# delete all the files first
find "$SECONDARY" -mindepth 1 -delete
for sl in "${SECONDARY_PARTITION[@]}"
do
scp -o ControlMaster=auto -o ''ControlPath=~/.ssh/control-%r@%h:%p'' -o ControlPersist=900 david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/. || scp -o ControlMaster=auto -o ''ControlPath=~/.ssh/control-%r@%h:%p'' -o ControlPersist=900 david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/.
done
fi
Estoy copiando archivos PRIMARY_PARTITION
en la carpeta PRIMARY
y archivos SECONDARY
en la carpeta SECONDARY
en machineA
.
¿Hay alguna forma de mover los archivos más rápido en machineA
. ¿Puedo copiar 10 archivos a la vez o 5 archivos a la vez en paralelo para acelerar este proceso o cualquier otro enfoque?
NOTA: machineA
está ejecutando en SSD
ACTUALIZAR:-
Parallel Shell Script que probé, la parte superior del script de shell es la misma que se muestra arriba.
if [ "$dir1" = "$dir2" ] && [ "$length1" -gt 0 ] && [ "$length2" -gt 0 ]
then
find "$PRIMARY" -mindepth 1 -delete
for el in "${PRIMARY_PARTITION[@]}"
do
(scp -o ControlMaster=auto -o ''ControlPath=~/.ssh/control-%r@%h:%p'' -o ControlPersist=900 david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/. || scp -o ControlMaster=auto -o ''ControlPath=~/.ssh/control-%r@%h:%p'' -o ControlPersist=900 david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$el"_200003_5.data $PRIMARY/.) &
WAITPID="$WAITPID $!"
done
find "$SECONDARY" -mindepth 1 -delete
for sl in "${SECONDARY_PARTITION[@]}"
do
(scp -o ControlMaster=auto -o ''ControlPath=~/.ssh/control-%r@%h:%p'' -o ControlPersist=900 david@${FILERS_LOCATION[0]}:$dir1/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/. || scp -o ControlMaster=auto -o ''ControlPath=~/.ssh/control-%r@%h:%p'' -o ControlPersist=900 david@${FILERS_LOCATION[1]}:$dir2/t1_weekly_1680_"$sl"_200003_5.data $SECONDARY/.) &
WAITPID="$WAITPID $!"
done
wait $WAITPID
echo "All files done copying."
fi
Errores que obtuve con script de shell paralelo-
channel 24: open failed: administratively prohibited: open failed
channel 25: open failed: administratively prohibited: open failed
channel 26: open failed: administratively prohibited: open failed
channel 28: open failed: administratively prohibited: open failed
channel 30: open failed: administratively prohibited: open failed
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
channel 32: open failed: administratively prohibited: open failed
channel 36: open failed: administratively prohibited: open failed
channel 37: open failed: administratively prohibited: open failed
channel 38: open failed: administratively prohibited: open failed
channel 40: open failed: administratively prohibited: open failed
channel 46: open failed: administratively prohibited: open failed
channel 47: open failed: administratively prohibited: open failed
channel 49: open failed: administratively prohibited: open failed
channel 52: open failed: administratively prohibited: open failed
channel 54: open failed: administratively prohibited: open failed
channel 55: open failed: administratively prohibited: open failed
channel 56: open failed: administratively prohibited: open failed
channel 57: open failed: administratively prohibited: open failed
channel 59: open failed: administratively prohibited: open failed
mux_client_request_session: session request failed: Session open refused by peer
channel 61: open failed: administratively prohibited: open failed
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
mux_client_request_session: session request failed: Session open refused by peer
channel 64: open failed: administratively prohibited: open failed
mux_client_request_session: session request failed: Session open refused by peer
channel 68: open failed: administratively prohibited: open failed
channel 72: open failed: administratively prohibited: open failed
channel 74: open failed: administratively prohibited: open failed
channel 76: open failed: administratively prohibited: open failed
channel 78: open failed: administratively prohibited: open failed
puedes probar este comando
rsync
desde el
man rsync
Verá que: El protocolo de actualización remota rsync permite que rsync transfiera solo las diferencias entre dos conjuntos de archivos a través de la conexión de red, utilizando un algoritmo de búsqueda de suma de comprobación eficiente descrito en el informe técnico que acompaña a este paquete.
Puede probar el HPN-SSH (High Performance SSH / SCP) - http://www.psc.edu/index.php/hpn-ssh o http://hpnssh.sourceforge.net/
El proyecto HPN-SSH es el conjunto de parches para OpenSSH (scp es parte de él), para ajustar mejor varios tcp y búferes internos. También hay un cifrado "ninguno" ("Ninguna conmutación de cifrado") que deshabilita el cifrado, y esto también puede ser útil (si no usa redes públicas para enviar los datos).
Tanto la compresión como el cifrado consumen tiempo de CPU; y Ethernet de 10 Gbit a veces puede ser más rápido transferir archivos sin comprimir luego esperar que la CPU los comprima y los cifre.
Puede perfilar su configuración:
- Mida el ancho de banda de la red entre las máquinas que usan
iperf
onetperf
. Compare con la red real (capacidades de tarjetas de red, conmutadores). Con una buena configuración, debería obtener más del 80-90 por ciento de velocidad declarada. - Calcule el volumen de datos y el tiempo necesario para transferir tantos datos con su red usando la velocidad de
iperf
onetperf
. Compare con el tiempo de transferencia real, ¿hay una gran diferencia?- Si su CPU es rápida, los datos son compresibles y la red es lenta, la compresión lo ayudará.
- Eche un vistazo en la
top
,vmstat
,iostat
.- ¿Hay núcleos de CPU cargados al 100% (ejecutar
top
y presionar1
para ver núcleos)? - ¿Hay demasiadas interrupciones (
in
) envmstat 1
? ¿Qué hay de los interruptores de contexto (cs
)? - ¿Cuál es la velocidad de lectura de archivos en
iostat 1
? ¿Sus HDD son lo suficientemente rápidos como para leer datos? para escribir datos en el receptor?
- ¿Hay núcleos de CPU cargados al 100% (ejecutar
- Puede intentar hacer un perfil completo del sistema utilizando
perf top
operf record -a
. ¿Hay mucha computación por scp o stack de red en Linux? Si puede instalardtrace
oktap
, intente también crear perfiles fuera de la CPU
Tiene 1.5 GB * 400 = 600 GB de datos. No relacionado con la respuesta, sugiero que la configuración de la máquina parece incorrecta si necesita transferir esta cantidad de datos. Probablemente necesites generar estos datos en la máquina A en primer lugar.
Hay 600 GB de datos transferidos en 2 horas, es decir, una velocidad de transferencia de ~ 85 MB / s, lo que significa que probablemente haya alcanzado los límites de transferencia de sus unidades de disco o (casi) de la red. Creo que no podrás transferir más rápido con ningún otro comando.
Si las máquinas están cerca una de otra, el método de copiado que creo que es el más rápido es eliminar físicamente el almacenamiento de las máquinas B y C, ponerlas en la máquina A y luego copiarlas localmente sin transferirlas a través de la red. El momento para esto es el momento de moverse por el almacenamiento, más los tiempos de transferencia de disco. Me temo, sin embargo, que la copia no será mucho más rápida que 85 MB / s.
El comando de transferencia de red que creo que sería el más rápido es netcat, porque no tiene sobrecarga relacionada con el cifrado. Además, si los archivos no son archivos multimedia, debe comprimirlos utilizando un compresor que se comprima más rápido que 85 MB / s. Sé de lzop y lz4 que se conceden para ser más rápidos que esta tasa. Entonces mi línea de comando para transferir un solo directorio sería (sintaxis BSD netcat):
máquina A:
$ nc -l 2000 | lzop -d | tar x
máquina B o C (se puede ejecutar desde la máquina A con la ayuda de ssh):
$ tar c directory | lzop | nc machineA 2000
Retire el compresor si está transfiriendo archivos multimedia, que ya están comprimidos.
Los comandos para organizar su estructura de directorios son irrelevantes en términos de velocidad, así que no me molesté en escribirlos aquí, pero puede reutilizar su propio código.
Este es el método más rápido que puedo pensar, pero, de nuevo, no creo que este comando sea mucho más rápido que lo que ya tienes.
rsync opcionalmente comprime sus datos. Eso típicamente hace que la transferencia sea mucho más rápida.
No mencionaste SCP, pero SCP -C también se comprime.
Tenga en cuenta que la compresión puede hacer que la transferencia sea más rápida o más lenta, dependiendo de la velocidad de su CPU y de su enlace de red.
Los enlaces más lentos y la CPU más rápida hacen que la compresión sea una buena idea; los enlaces más rápidos y la CPU más lenta hacen que la compresión sea una mala idea.
Como con cualquier optimización, mida los resultados en su propio entorno.
También creo que ftp es otra opción para ti, ya que mi prueba de velocidad de transferencia para archivos grandes (> 10M) FTP funciona más rápido que SCP e incluso rsync (depende del formato de archivo y la tasa de compresión).
rsync
es una buena respuesta, pero si te preocupa la seguridad, debes considerar usar:
rdist
Aquí se pueden encontrar algunos detalles sobre las diferencias entre rsync y rdist: rdist vs rsync y un blog sobre cómo configurarlo usando ssh se puede encontrar aquí: actualización remota no root
Finalmente, podrías usar el infame patrón tar tar tar, con una pizca de ssh.
tar zcvf - /wwwdata | ssh [email protected] "cat > /backup/wwwdata.tar.gz"
Aquí se habla de este ejemplo: copia de alquitrán en una red segura